@tsparticles/angular 3.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.npmignore +2 -0
- package/README.md +171 -0
- package/esm2022/lib/ng-particles.component.mjs +74 -0
- package/esm2022/lib/ng-particles.module.mjs +19 -0
- package/esm2022/lib/ng-particles.service.mjs +23 -0
- package/esm2022/public-api.mjs +6 -0
- package/esm2022/tsparticles-angular.mjs +5 -0
- package/fesm2022/tsparticles-angular.mjs +117 -0
- package/fesm2022/tsparticles-angular.mjs.map +1 -0
- package/index.d.ts +5 -0
- package/lib/ng-particles.component.d.ts +24 -0
- package/lib/ng-particles.module.d.ts +11 -0
- package/lib/ng-particles.service.d.ts +9 -0
- package/package.json +110 -0
- package/public-api.d.ts +2 -0
package/.npmignore
ADDED
package/README.md
ADDED
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
[](https://particles.js.org)
|
|
2
|
+
|
|
3
|
+
# @tsparticles/angular
|
|
4
|
+
|
|
5
|
+
[](https://www.npmjs.com/package/ng-particles) [](https://www.npmjs.com/package/@tsparticles/angular) [](https://github.com/sponsors/matteobruni)
|
|
6
|
+
|
|
7
|
+
Official [tsParticles](https://github.com/matteobruni/tsparticles) Angular component
|
|
8
|
+
|
|
9
|
+
[](https://join.slack.com/t/tsparticles/shared_invite/enQtOTcxNTQxNjQ4NzkxLWE2MTZhZWExMWRmOWI5MTMxNjczOGE1Yjk0MjViYjdkYTUzODM3OTc5MGQ5MjFlODc4MzE0N2Q1OWQxZDc1YzI) [](https://discord.gg/hACwv45Hme) [](https://t.me/tsparticles)
|
|
10
|
+
|
|
11
|
+
[](https://www.producthunt.com/posts/tsparticles?utm_source=badge-featured&utm_medium=badge&utm_souce=badge-tsparticles") <a href="https://www.buymeacoffee.com/matteobruni"><img src="https://img.buymeacoffee.com/button-api/?text=Buy me a beer&emoji=🍺&slug=matteobruni&button_colour=5F7FFF&font_colour=ffffff&font_family=Arial&outline_colour=000000&coffee_colour=FFDD00"></a>
|
|
12
|
+
|
|
13
|
+
## How to use it
|
|
14
|
+
|
|
15
|
+
### Install
|
|
16
|
+
|
|
17
|
+
```shell
|
|
18
|
+
$ npm install @tsparticles/angular @tsparticles/engine
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
or
|
|
22
|
+
|
|
23
|
+
```shell
|
|
24
|
+
$ yarn add @tsparticles/angular @tsparticles/engine
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
### Usage
|
|
28
|
+
|
|
29
|
+
_template.html_
|
|
30
|
+
|
|
31
|
+
```html
|
|
32
|
+
<ngx-particles [id]="id" [options]="particlesOptions" (particlesLoaded)="particlesLoaded($event)"></ngx-particles>
|
|
33
|
+
|
|
34
|
+
<!-- or -->
|
|
35
|
+
|
|
36
|
+
<ngx-particles [id]="id" [url]="particlesUrl" (particlesLoaded)="particlesLoaded($event)"></ngx-particles>
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
_app.ts_
|
|
40
|
+
|
|
41
|
+
```typescript
|
|
42
|
+
import { MoveDirection, ClickMode, HoverMode, OutMode } from "@tsparticles/engine";
|
|
43
|
+
//import { loadFull } from "tsparticles"; // if you are going to use `loadFull`, install the "tsparticles" package too.
|
|
44
|
+
import { loadSlim } from "@tsparticles/slim"; // if you are going to use `loadSlim`, install the "@tsparticles/slim" package too.
|
|
45
|
+
import { NgParticlesService } from "@tsparticles/angular";
|
|
46
|
+
|
|
47
|
+
export class AppComponent {
|
|
48
|
+
id = "tsparticles";
|
|
49
|
+
|
|
50
|
+
/* Starting from 1.19.0 you can use a remote url (AJAX request) to a JSON with the configuration */
|
|
51
|
+
particlesUrl = "http://foo.bar/particles.json";
|
|
52
|
+
|
|
53
|
+
/* or the classic JavaScript object */
|
|
54
|
+
particlesOptions = {
|
|
55
|
+
background: {
|
|
56
|
+
color: {
|
|
57
|
+
value: "#0d47a1",
|
|
58
|
+
},
|
|
59
|
+
},
|
|
60
|
+
fpsLimit: 120,
|
|
61
|
+
interactivity: {
|
|
62
|
+
events: {
|
|
63
|
+
onClick: {
|
|
64
|
+
enable: true,
|
|
65
|
+
mode: ClickMode.push,
|
|
66
|
+
},
|
|
67
|
+
onHover: {
|
|
68
|
+
enable: true,
|
|
69
|
+
mode: HoverMode.repulse,
|
|
70
|
+
},
|
|
71
|
+
resize: true,
|
|
72
|
+
},
|
|
73
|
+
modes: {
|
|
74
|
+
push: {
|
|
75
|
+
quantity: 4,
|
|
76
|
+
},
|
|
77
|
+
repulse: {
|
|
78
|
+
distance: 200,
|
|
79
|
+
duration: 0.4,
|
|
80
|
+
},
|
|
81
|
+
},
|
|
82
|
+
},
|
|
83
|
+
particles: {
|
|
84
|
+
color: {
|
|
85
|
+
value: "#ffffff",
|
|
86
|
+
},
|
|
87
|
+
links: {
|
|
88
|
+
color: "#ffffff",
|
|
89
|
+
distance: 150,
|
|
90
|
+
enable: true,
|
|
91
|
+
opacity: 0.5,
|
|
92
|
+
width: 1,
|
|
93
|
+
},
|
|
94
|
+
move: {
|
|
95
|
+
direction: MoveDirection.none,
|
|
96
|
+
enable: true,
|
|
97
|
+
outModes: {
|
|
98
|
+
default: OutMode.bounce,
|
|
99
|
+
},
|
|
100
|
+
random: false,
|
|
101
|
+
speed: 6,
|
|
102
|
+
straight: false,
|
|
103
|
+
},
|
|
104
|
+
number: {
|
|
105
|
+
density: {
|
|
106
|
+
enable: true,
|
|
107
|
+
area: 800,
|
|
108
|
+
},
|
|
109
|
+
value: 80,
|
|
110
|
+
},
|
|
111
|
+
opacity: {
|
|
112
|
+
value: 0.5,
|
|
113
|
+
},
|
|
114
|
+
shape: {
|
|
115
|
+
type: "circle",
|
|
116
|
+
},
|
|
117
|
+
size: {
|
|
118
|
+
value: { min: 1, max: 5 },
|
|
119
|
+
},
|
|
120
|
+
},
|
|
121
|
+
detectRetina: true,
|
|
122
|
+
};
|
|
123
|
+
|
|
124
|
+
constructor(private readonly ngParticlesService: NgParticlesService) {}
|
|
125
|
+
|
|
126
|
+
ngOnInit(): void {
|
|
127
|
+
this.ngParticlesService.init(async () => {
|
|
128
|
+
console.log(engine);
|
|
129
|
+
|
|
130
|
+
// Starting from 1.19.0 you can add custom presets or shape here, using the current tsParticles instance (main)
|
|
131
|
+
// this loads the tsparticles package bundle, it's the easiest method for getting everything ready
|
|
132
|
+
// starting from v2 you can add only the features you need reducing the bundle size
|
|
133
|
+
//await loadFull(engine);
|
|
134
|
+
await loadSlim(engine);
|
|
135
|
+
});
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
particlesLoaded(container: Container): void {
|
|
139
|
+
console.log(container);
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
```
|
|
143
|
+
|
|
144
|
+
_app.module.ts_
|
|
145
|
+
|
|
146
|
+
```typescript
|
|
147
|
+
import { NgxParticlesModule } from "@tsparticles/angular";
|
|
148
|
+
import { NgModule } from "@angular/core";
|
|
149
|
+
|
|
150
|
+
@NgModule({
|
|
151
|
+
declarations: [
|
|
152
|
+
/* AppComponent */
|
|
153
|
+
],
|
|
154
|
+
imports: [/* other imports */ NgxParticlesModule /* NgxParticlesModule is required*/],
|
|
155
|
+
providers: [],
|
|
156
|
+
bootstrap: [
|
|
157
|
+
/* AppComponent */
|
|
158
|
+
],
|
|
159
|
+
})
|
|
160
|
+
export class AppModule {}
|
|
161
|
+
```
|
|
162
|
+
|
|
163
|
+
## Demos
|
|
164
|
+
|
|
165
|
+
The demo website is [here](https://particles.js.org)
|
|
166
|
+
|
|
167
|
+
<https://particles.js.org>
|
|
168
|
+
|
|
169
|
+
There's also a CodePen collection actively maintained and updated [here](https://codepen.io/collection/DPOage)
|
|
170
|
+
|
|
171
|
+
<https://codepen.io/collection/DPOage>
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import { Component, EventEmitter, Inject, Input, Output, PLATFORM_ID, } from '@angular/core';
|
|
2
|
+
import { isPlatformServer } from '@angular/common';
|
|
3
|
+
import { from, mergeMap, Subject, takeUntil } from 'rxjs';
|
|
4
|
+
import { tsParticles } from '@tsparticles/engine';
|
|
5
|
+
import * as i0 from "@angular/core";
|
|
6
|
+
import * as i1 from "./ng-particles.service";
|
|
7
|
+
export class NgxParticlesComponent {
|
|
8
|
+
platformId;
|
|
9
|
+
particlesService;
|
|
10
|
+
options;
|
|
11
|
+
url;
|
|
12
|
+
id;
|
|
13
|
+
particlesInit;
|
|
14
|
+
particlesLoaded = new EventEmitter();
|
|
15
|
+
subscription;
|
|
16
|
+
destroy$ = new Subject();
|
|
17
|
+
container;
|
|
18
|
+
constructor(platformId, particlesService) {
|
|
19
|
+
this.platformId = platformId;
|
|
20
|
+
this.particlesService = particlesService;
|
|
21
|
+
this.id = 'tsparticles';
|
|
22
|
+
}
|
|
23
|
+
ngOnInit() {
|
|
24
|
+
this.subscription = this.particlesService.getInstallationStatus().subscribe(() => {
|
|
25
|
+
this.container?.destroy();
|
|
26
|
+
this.loadParticles();
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
ngAfterViewInit() {
|
|
30
|
+
if (isPlatformServer(this.platformId)) {
|
|
31
|
+
return;
|
|
32
|
+
}
|
|
33
|
+
this.loadParticles();
|
|
34
|
+
}
|
|
35
|
+
ngOnDestroy() {
|
|
36
|
+
this.container?.destroy();
|
|
37
|
+
this.subscription?.unsubscribe();
|
|
38
|
+
this.destroy$.next();
|
|
39
|
+
}
|
|
40
|
+
loadParticles() {
|
|
41
|
+
const cb = (container) => {
|
|
42
|
+
this.container = container;
|
|
43
|
+
this.particlesLoaded.emit(container);
|
|
44
|
+
};
|
|
45
|
+
from(this.particlesInit ? this.particlesInit(tsParticles) : Promise.resolve())
|
|
46
|
+
.pipe(mergeMap(() => {
|
|
47
|
+
return tsParticles.load({ id: this.id, url: this.url, options: this.options });
|
|
48
|
+
}), takeUntil(this.destroy$))
|
|
49
|
+
.subscribe(cb);
|
|
50
|
+
}
|
|
51
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.0.8", ngImport: i0, type: NgxParticlesComponent, deps: [{ token: PLATFORM_ID }, { token: i1.NgParticlesService }], target: i0.ɵɵFactoryTarget.Component });
|
|
52
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.0.8", type: NgxParticlesComponent, selector: "ngx-particles", inputs: { options: "options", url: "url", id: "id", particlesInit: "particlesInit" }, outputs: { particlesLoaded: "particlesLoaded" }, ngImport: i0, template: '<div [id]="id"></div>', isInline: true });
|
|
53
|
+
}
|
|
54
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.8", ngImport: i0, type: NgxParticlesComponent, decorators: [{
|
|
55
|
+
type: Component,
|
|
56
|
+
args: [{
|
|
57
|
+
selector: 'ngx-particles',
|
|
58
|
+
template: '<div [id]="id"></div>',
|
|
59
|
+
}]
|
|
60
|
+
}], ctorParameters: () => [{ type: undefined, decorators: [{
|
|
61
|
+
type: Inject,
|
|
62
|
+
args: [PLATFORM_ID]
|
|
63
|
+
}] }, { type: i1.NgParticlesService }], propDecorators: { options: [{
|
|
64
|
+
type: Input
|
|
65
|
+
}], url: [{
|
|
66
|
+
type: Input
|
|
67
|
+
}], id: [{
|
|
68
|
+
type: Input
|
|
69
|
+
}], particlesInit: [{
|
|
70
|
+
type: Input
|
|
71
|
+
}], particlesLoaded: [{
|
|
72
|
+
type: Output
|
|
73
|
+
}] } });
|
|
74
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmctcGFydGljbGVzLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL25nLXBhcnRpY2xlcy9zcmMvbGliL25nLXBhcnRpY2xlcy5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUVILFNBQVMsRUFDVCxZQUFZLEVBQ1osTUFBTSxFQUNOLEtBQUssRUFHTCxNQUFNLEVBQ04sV0FBVyxHQUNkLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ25ELE9BQU8sRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBZ0IsU0FBUyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ3hFLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQzs7O0FBU2xELE1BQU0sT0FBTyxxQkFBcUI7SUFZSztJQUNkO0lBWlosT0FBTyxDQUFtQjtJQUMxQixHQUFHLENBQVU7SUFDYixFQUFFLENBQVM7SUFDWCxhQUFhLENBQXFDO0lBQ2pELGVBQWUsR0FBNEIsSUFBSSxZQUFZLEVBQWEsQ0FBQztJQUUzRSxZQUFZLENBQWdCO0lBQzVCLFFBQVEsR0FBRyxJQUFJLE9BQU8sRUFBUSxDQUFDO0lBQy9CLFNBQVMsQ0FBYTtJQUU5QixZQUNtQyxVQUFrQixFQUNoQyxnQkFBb0M7UUFEdEIsZUFBVSxHQUFWLFVBQVUsQ0FBUTtRQUNoQyxxQkFBZ0IsR0FBaEIsZ0JBQWdCLENBQW9CO1FBRXJELElBQUksQ0FBQyxFQUFFLEdBQUcsYUFBYSxDQUFDO0lBQzVCLENBQUM7SUFFTSxRQUFRO1FBQ1gsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMscUJBQXFCLEVBQUUsQ0FBQyxTQUFTLENBQUMsR0FBRyxFQUFFO1lBQzdFLElBQUksQ0FBQyxTQUFTLEVBQUUsT0FBTyxFQUFFLENBQUM7WUFDMUIsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1FBQ3pCLENBQUMsQ0FBQyxDQUFDO0lBQ1AsQ0FBQztJQUVNLGVBQWU7UUFDbEIsSUFBSSxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLEVBQUU7WUFDbkMsT0FBTztTQUNWO1FBRUQsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO0lBQ3pCLENBQUM7SUFFTSxXQUFXO1FBQ2QsSUFBSSxDQUFDLFNBQVMsRUFBRSxPQUFPLEVBQUUsQ0FBQztRQUMxQixJQUFJLENBQUMsWUFBWSxFQUFFLFdBQVcsRUFBRSxDQUFDO1FBQ2pDLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDekIsQ0FBQztJQUVPLGFBQWE7UUFDakIsTUFBTSxFQUFFLEdBQUcsQ0FBQyxTQUFxQixFQUFFLEVBQUU7WUFDakMsSUFBSSxDQUFDLFNBQVMsR0FBRyxTQUFTLENBQUM7WUFDM0IsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDekMsQ0FBQyxDQUFDO1FBRUYsSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxPQUFPLEVBQUUsQ0FBQzthQUN6RSxJQUFJLENBQ0QsUUFBUSxDQUFDLEdBQUcsRUFBRTtZQUNWLE9BQU8sV0FBVyxDQUFDLElBQUksQ0FBQyxFQUFFLEVBQUUsRUFBRSxJQUFJLENBQUMsRUFBRSxFQUFFLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRyxFQUFFLE9BQU8sRUFBRSxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQztRQUNuRixDQUFDLENBQUMsRUFDRixTQUFTLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUMzQjthQUNBLFNBQVMsQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUN2QixDQUFDO3VHQXJEUSxxQkFBcUIsa0JBWWxCLFdBQVc7MkZBWmQscUJBQXFCLDRMQUZwQix1QkFBdUI7OzJGQUV4QixxQkFBcUI7a0JBSmpDLFNBQVM7bUJBQUM7b0JBQ1AsUUFBUSxFQUFFLGVBQWU7b0JBQ3pCLFFBQVEsRUFBRSx1QkFBdUI7aUJBQ3BDOzswQkFhUSxNQUFNOzJCQUFDLFdBQVc7MEVBWGQsT0FBTztzQkFBZixLQUFLO2dCQUNHLEdBQUc7c0JBQVgsS0FBSztnQkFDRyxFQUFFO3NCQUFWLEtBQUs7Z0JBQ0csYUFBYTtzQkFBckIsS0FBSztnQkFDSSxlQUFlO3NCQUF4QixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgICBBZnRlclZpZXdJbml0LFxuICAgIENvbXBvbmVudCxcbiAgICBFdmVudEVtaXR0ZXIsXG4gICAgSW5qZWN0LFxuICAgIElucHV0LFxuICAgIE9uRGVzdHJveSxcbiAgICBPbkluaXQsXG4gICAgT3V0cHV0LFxuICAgIFBMQVRGT1JNX0lELFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IGlzUGxhdGZvcm1TZXJ2ZXIgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgZnJvbSwgbWVyZ2VNYXAsIFN1YmplY3QsIFN1YnNjcmlwdGlvbiwgdGFrZVVudGlsIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyB0c1BhcnRpY2xlcyB9IGZyb20gJ0B0c3BhcnRpY2xlcy9lbmdpbmUnO1xuaW1wb3J0IHR5cGUgeyBDb250YWluZXIsIEVuZ2luZSB9IGZyb20gJ0B0c3BhcnRpY2xlcy9lbmdpbmUnO1xuaW1wb3J0IHsgSVBhcnRpY2xlc1Byb3BzIH0gZnJvbSAnLi9uZy1wYXJ0aWNsZXMubW9kdWxlJztcbmltcG9ydCB7IE5nUGFydGljbGVzU2VydmljZSB9IGZyb20gJy4vbmctcGFydGljbGVzLnNlcnZpY2UnO1xuXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ25neC1wYXJ0aWNsZXMnLFxuICAgIHRlbXBsYXRlOiAnPGRpdiBbaWRdPVwiaWRcIj48L2Rpdj4nLFxufSlcbmV4cG9ydCBjbGFzcyBOZ3hQYXJ0aWNsZXNDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIEFmdGVyVmlld0luaXQsIE9uRGVzdHJveSB7XG4gICAgQElucHV0KCkgb3B0aW9ucz86IElQYXJ0aWNsZXNQcm9wcztcbiAgICBASW5wdXQoKSB1cmw/OiBzdHJpbmc7XG4gICAgQElucHV0KCkgaWQ6IHN0cmluZztcbiAgICBASW5wdXQoKSBwYXJ0aWNsZXNJbml0PzogKGVuZ2luZTogRW5naW5lKSA9PiBQcm9taXNlPHZvaWQ+O1xuICAgIEBPdXRwdXQoKSBwYXJ0aWNsZXNMb2FkZWQ6IEV2ZW50RW1pdHRlcjxDb250YWluZXI+ID0gbmV3IEV2ZW50RW1pdHRlcjxDb250YWluZXI+KCk7XG5cbiAgICBwcml2YXRlIHN1YnNjcmlwdGlvbj86IFN1YnNjcmlwdGlvbjtcbiAgICBwcml2YXRlIGRlc3Ryb3kkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcbiAgICBwcml2YXRlIGNvbnRhaW5lcj86IENvbnRhaW5lcjtcblxuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBASW5qZWN0KFBMQVRGT1JNX0lEKSBwcm90ZWN0ZWQgcGxhdGZvcm1JZDogc3RyaW5nLFxuICAgICAgICBwcml2YXRlIHJlYWRvbmx5IHBhcnRpY2xlc1NlcnZpY2U6IE5nUGFydGljbGVzU2VydmljZSxcbiAgICApIHtcbiAgICAgICAgdGhpcy5pZCA9ICd0c3BhcnRpY2xlcyc7XG4gICAgfVxuXG4gICAgcHVibGljIG5nT25Jbml0KCkge1xuICAgICAgICB0aGlzLnN1YnNjcmlwdGlvbiA9IHRoaXMucGFydGljbGVzU2VydmljZS5nZXRJbnN0YWxsYXRpb25TdGF0dXMoKS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5jb250YWluZXI/LmRlc3Ryb3koKTtcbiAgICAgICAgICAgIHRoaXMubG9hZFBhcnRpY2xlcygpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xuICAgICAgICBpZiAoaXNQbGF0Zm9ybVNlcnZlcih0aGlzLnBsYXRmb3JtSWQpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmxvYWRQYXJ0aWNsZXMoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgICAgIHRoaXMuY29udGFpbmVyPy5kZXN0cm95KCk7XG4gICAgICAgIHRoaXMuc3Vic2NyaXB0aW9uPy51bnN1YnNjcmliZSgpO1xuICAgICAgICB0aGlzLmRlc3Ryb3kkLm5leHQoKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGxvYWRQYXJ0aWNsZXMoKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGNiID0gKGNvbnRhaW5lcj86IENvbnRhaW5lcikgPT4ge1xuICAgICAgICAgICAgdGhpcy5jb250YWluZXIgPSBjb250YWluZXI7XG4gICAgICAgICAgICB0aGlzLnBhcnRpY2xlc0xvYWRlZC5lbWl0KGNvbnRhaW5lcik7XG4gICAgICAgIH07XG5cbiAgICAgICAgZnJvbSh0aGlzLnBhcnRpY2xlc0luaXQgPyB0aGlzLnBhcnRpY2xlc0luaXQodHNQYXJ0aWNsZXMpIDogUHJvbWlzZS5yZXNvbHZlKCkpXG4gICAgICAgICAgICAucGlwZShcbiAgICAgICAgICAgICAgICBtZXJnZU1hcCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0c1BhcnRpY2xlcy5sb2FkKHsgaWQ6IHRoaXMuaWQsIHVybDogdGhpcy51cmwsIG9wdGlvbnM6IHRoaXMub3B0aW9ucyB9KTtcbiAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICB0YWtlVW50aWwodGhpcy5kZXN0cm95JCksXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAuc3Vic2NyaWJlKGNiKTtcbiAgICB9XG59XG4iXX0=
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { NgModule } from '@angular/core';
|
|
2
|
+
import { NgxParticlesComponent } from './ng-particles.component';
|
|
3
|
+
import { NgParticlesService } from './ng-particles.service';
|
|
4
|
+
import * as i0 from "@angular/core";
|
|
5
|
+
export class NgxParticlesModule {
|
|
6
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.0.8", ngImport: i0, type: NgxParticlesModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
|
|
7
|
+
static ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "17.0.8", ngImport: i0, type: NgxParticlesModule, declarations: [NgxParticlesComponent], exports: [NgxParticlesComponent] });
|
|
8
|
+
static ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "17.0.8", ngImport: i0, type: NgxParticlesModule, providers: [NgParticlesService] });
|
|
9
|
+
}
|
|
10
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.8", ngImport: i0, type: NgxParticlesModule, decorators: [{
|
|
11
|
+
type: NgModule,
|
|
12
|
+
args: [{
|
|
13
|
+
declarations: [NgxParticlesComponent],
|
|
14
|
+
exports: [NgxParticlesComponent],
|
|
15
|
+
providers: [NgParticlesService],
|
|
16
|
+
}]
|
|
17
|
+
}] });
|
|
18
|
+
export { NgParticlesService };
|
|
19
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmctcGFydGljbGVzLm1vZHVsZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL25nLXBhcnRpY2xlcy9zcmMvbGliL25nLXBhcnRpY2xlcy5tb2R1bGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN6QyxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUVqRSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQzs7QUFPNUQsTUFBTSxPQUFPLGtCQUFrQjt1R0FBbEIsa0JBQWtCO3dHQUFsQixrQkFBa0IsaUJBSloscUJBQXFCLGFBQzFCLHFCQUFxQjt3R0FHdEIsa0JBQWtCLGFBRmhCLENBQUMsa0JBQWtCLENBQUM7OzJGQUV0QixrQkFBa0I7a0JBTDlCLFFBQVE7bUJBQUM7b0JBQ04sWUFBWSxFQUFFLENBQUMscUJBQXFCLENBQUM7b0JBQ3JDLE9BQU8sRUFBRSxDQUFDLHFCQUFxQixDQUFDO29CQUNoQyxTQUFTLEVBQUUsQ0FBQyxrQkFBa0IsQ0FBQztpQkFDbEM7O0FBSUQsT0FBTyxFQUFFLGtCQUFrQixFQUFFLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBOZ01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgTmd4UGFydGljbGVzQ29tcG9uZW50IH0gZnJvbSAnLi9uZy1wYXJ0aWNsZXMuY29tcG9uZW50JztcbmltcG9ydCB0eXBlIHsgSVNvdXJjZU9wdGlvbnMgfSBmcm9tICdAdHNwYXJ0aWNsZXMvZW5naW5lJztcbmltcG9ydCB7IE5nUGFydGljbGVzU2VydmljZSB9IGZyb20gJy4vbmctcGFydGljbGVzLnNlcnZpY2UnO1xuXG5ATmdNb2R1bGUoe1xuICAgIGRlY2xhcmF0aW9uczogW05neFBhcnRpY2xlc0NvbXBvbmVudF0sXG4gICAgZXhwb3J0czogW05neFBhcnRpY2xlc0NvbXBvbmVudF0sXG4gICAgcHJvdmlkZXJzOiBbTmdQYXJ0aWNsZXNTZXJ2aWNlXSxcbn0pXG5leHBvcnQgY2xhc3MgTmd4UGFydGljbGVzTW9kdWxlIHt9XG5cbmV4cG9ydCB0eXBlIElQYXJ0aWNsZXNQcm9wcyA9IElTb3VyY2VPcHRpb25zO1xuZXhwb3J0IHsgTmdQYXJ0aWNsZXNTZXJ2aWNlIH07XG4iXX0=
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { Injectable } from '@angular/core';
|
|
2
|
+
import { BehaviorSubject } from 'rxjs';
|
|
3
|
+
import { tsParticles } from '@tsparticles/engine';
|
|
4
|
+
import * as i0 from "@angular/core";
|
|
5
|
+
export class NgParticlesService {
|
|
6
|
+
initialized = new BehaviorSubject(false);
|
|
7
|
+
getInstallationStatus() {
|
|
8
|
+
return this.initialized.asObservable();
|
|
9
|
+
}
|
|
10
|
+
async init(particlesInit) {
|
|
11
|
+
await particlesInit(tsParticles);
|
|
12
|
+
this.initialized.next(true);
|
|
13
|
+
}
|
|
14
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.0.8", ngImport: i0, type: NgParticlesService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
|
|
15
|
+
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.0.8", ngImport: i0, type: NgParticlesService, providedIn: 'root' });
|
|
16
|
+
}
|
|
17
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.8", ngImport: i0, type: NgParticlesService, decorators: [{
|
|
18
|
+
type: Injectable,
|
|
19
|
+
args: [{
|
|
20
|
+
providedIn: 'root',
|
|
21
|
+
}]
|
|
22
|
+
}] });
|
|
23
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmctcGFydGljbGVzLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9uZy1wYXJ0aWNsZXMvc3JjL2xpYi9uZy1wYXJ0aWNsZXMuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNDLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDdkMsT0FBTyxFQUFVLFdBQVcsRUFBRSxNQUFNLHFCQUFxQixDQUFDOztBQUsxRCxNQUFNLE9BQU8sa0JBQWtCO0lBQ25CLFdBQVcsR0FBRyxJQUFJLGVBQWUsQ0FBVSxLQUFLLENBQUMsQ0FBQztJQUUxRCxxQkFBcUI7UUFDakIsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDLFlBQVksRUFBRSxDQUFDO0lBQzNDLENBQUM7SUFFRCxLQUFLLENBQUMsSUFBSSxDQUFDLGFBQWdEO1FBQ3ZELE1BQU0sYUFBYSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBRWpDLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ2hDLENBQUM7dUdBWFEsa0JBQWtCOzJHQUFsQixrQkFBa0IsY0FGZixNQUFNOzsyRkFFVCxrQkFBa0I7a0JBSDlCLFVBQVU7bUJBQUM7b0JBQ1IsVUFBVSxFQUFFLE1BQU07aUJBQ3JCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBFbmdpbmUsIHRzUGFydGljbGVzIH0gZnJvbSAnQHRzcGFydGljbGVzL2VuZ2luZSc7XG5cbkBJbmplY3RhYmxlKHtcbiAgICBwcm92aWRlZEluOiAncm9vdCcsXG59KVxuZXhwb3J0IGNsYXNzIE5nUGFydGljbGVzU2VydmljZSB7XG4gICAgcHJpdmF0ZSBpbml0aWFsaXplZCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4oZmFsc2UpO1xuXG4gICAgZ2V0SW5zdGFsbGF0aW9uU3RhdHVzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5pbml0aWFsaXplZC5hc09ic2VydmFibGUoKTtcbiAgICB9XG5cbiAgICBhc3luYyBpbml0KHBhcnRpY2xlc0luaXQ6IChlbmdpbmU6IEVuZ2luZSkgPT4gUHJvbWlzZTx2b2lkPikge1xuICAgICAgICBhd2FpdCBwYXJ0aWNsZXNJbml0KHRzUGFydGljbGVzKTtcblxuICAgICAgICB0aGlzLmluaXRpYWxpemVkLm5leHQodHJ1ZSk7XG4gICAgfVxufVxuIl19
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Public API Surface of ng-particles
|
|
3
|
+
*/
|
|
4
|
+
export * from './lib/ng-particles.component';
|
|
5
|
+
export * from './lib/ng-particles.module';
|
|
6
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHVibGljLWFwaS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3Byb2plY3RzL25nLXBhcnRpY2xlcy9zcmMvcHVibGljLWFwaS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7R0FFRztBQUVILGNBQWMsOEJBQThCLENBQUM7QUFDN0MsY0FBYywyQkFBMkIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qXG4gKiBQdWJsaWMgQVBJIFN1cmZhY2Ugb2YgbmctcGFydGljbGVzXG4gKi9cblxuZXhwb3J0ICogZnJvbSAnLi9saWIvbmctcGFydGljbGVzLmNvbXBvbmVudCc7XG5leHBvcnQgKiBmcm9tICcuL2xpYi9uZy1wYXJ0aWNsZXMubW9kdWxlJztcbiJdfQ==
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Generated bundle index. Do not edit.
|
|
3
|
+
*/
|
|
4
|
+
export * from './public-api';
|
|
5
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHNwYXJ0aWNsZXMtYW5ndWxhci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3Byb2plY3RzL25nLXBhcnRpY2xlcy9zcmMvdHNwYXJ0aWNsZXMtYW5ndWxhci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7R0FFRztBQUVILGNBQWMsY0FBYyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBHZW5lcmF0ZWQgYnVuZGxlIGluZGV4LiBEbyBub3QgZWRpdC5cbiAqL1xuXG5leHBvcnQgKiBmcm9tICcuL3B1YmxpYy1hcGknO1xuIl19
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
import * as i0 from '@angular/core';
|
|
2
|
+
import { Injectable, EventEmitter, PLATFORM_ID, Component, Inject, Input, Output, NgModule } from '@angular/core';
|
|
3
|
+
import { isPlatformServer } from '@angular/common';
|
|
4
|
+
import { BehaviorSubject, Subject, mergeMap, takeUntil, from } from 'rxjs';
|
|
5
|
+
import { tsParticles } from '@tsparticles/engine';
|
|
6
|
+
|
|
7
|
+
class NgParticlesService {
|
|
8
|
+
initialized = new BehaviorSubject(false);
|
|
9
|
+
getInstallationStatus() {
|
|
10
|
+
return this.initialized.asObservable();
|
|
11
|
+
}
|
|
12
|
+
async init(particlesInit) {
|
|
13
|
+
await particlesInit(tsParticles);
|
|
14
|
+
this.initialized.next(true);
|
|
15
|
+
}
|
|
16
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.0.8", ngImport: i0, type: NgParticlesService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
|
|
17
|
+
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.0.8", ngImport: i0, type: NgParticlesService, providedIn: 'root' });
|
|
18
|
+
}
|
|
19
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.8", ngImport: i0, type: NgParticlesService, decorators: [{
|
|
20
|
+
type: Injectable,
|
|
21
|
+
args: [{
|
|
22
|
+
providedIn: 'root',
|
|
23
|
+
}]
|
|
24
|
+
}] });
|
|
25
|
+
|
|
26
|
+
class NgxParticlesComponent {
|
|
27
|
+
platformId;
|
|
28
|
+
particlesService;
|
|
29
|
+
options;
|
|
30
|
+
url;
|
|
31
|
+
id;
|
|
32
|
+
particlesInit;
|
|
33
|
+
particlesLoaded = new EventEmitter();
|
|
34
|
+
subscription;
|
|
35
|
+
destroy$ = new Subject();
|
|
36
|
+
container;
|
|
37
|
+
constructor(platformId, particlesService) {
|
|
38
|
+
this.platformId = platformId;
|
|
39
|
+
this.particlesService = particlesService;
|
|
40
|
+
this.id = 'tsparticles';
|
|
41
|
+
}
|
|
42
|
+
ngOnInit() {
|
|
43
|
+
this.subscription = this.particlesService.getInstallationStatus().subscribe(() => {
|
|
44
|
+
this.container?.destroy();
|
|
45
|
+
this.loadParticles();
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
ngAfterViewInit() {
|
|
49
|
+
if (isPlatformServer(this.platformId)) {
|
|
50
|
+
return;
|
|
51
|
+
}
|
|
52
|
+
this.loadParticles();
|
|
53
|
+
}
|
|
54
|
+
ngOnDestroy() {
|
|
55
|
+
this.container?.destroy();
|
|
56
|
+
this.subscription?.unsubscribe();
|
|
57
|
+
this.destroy$.next();
|
|
58
|
+
}
|
|
59
|
+
loadParticles() {
|
|
60
|
+
const cb = (container) => {
|
|
61
|
+
this.container = container;
|
|
62
|
+
this.particlesLoaded.emit(container);
|
|
63
|
+
};
|
|
64
|
+
from(this.particlesInit ? this.particlesInit(tsParticles) : Promise.resolve())
|
|
65
|
+
.pipe(mergeMap(() => {
|
|
66
|
+
return tsParticles.load({ id: this.id, url: this.url, options: this.options });
|
|
67
|
+
}), takeUntil(this.destroy$))
|
|
68
|
+
.subscribe(cb);
|
|
69
|
+
}
|
|
70
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.0.8", ngImport: i0, type: NgxParticlesComponent, deps: [{ token: PLATFORM_ID }, { token: NgParticlesService }], target: i0.ɵɵFactoryTarget.Component });
|
|
71
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.0.8", type: NgxParticlesComponent, selector: "ngx-particles", inputs: { options: "options", url: "url", id: "id", particlesInit: "particlesInit" }, outputs: { particlesLoaded: "particlesLoaded" }, ngImport: i0, template: '<div [id]="id"></div>', isInline: true });
|
|
72
|
+
}
|
|
73
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.8", ngImport: i0, type: NgxParticlesComponent, decorators: [{
|
|
74
|
+
type: Component,
|
|
75
|
+
args: [{
|
|
76
|
+
selector: 'ngx-particles',
|
|
77
|
+
template: '<div [id]="id"></div>',
|
|
78
|
+
}]
|
|
79
|
+
}], ctorParameters: () => [{ type: undefined, decorators: [{
|
|
80
|
+
type: Inject,
|
|
81
|
+
args: [PLATFORM_ID]
|
|
82
|
+
}] }, { type: NgParticlesService }], propDecorators: { options: [{
|
|
83
|
+
type: Input
|
|
84
|
+
}], url: [{
|
|
85
|
+
type: Input
|
|
86
|
+
}], id: [{
|
|
87
|
+
type: Input
|
|
88
|
+
}], particlesInit: [{
|
|
89
|
+
type: Input
|
|
90
|
+
}], particlesLoaded: [{
|
|
91
|
+
type: Output
|
|
92
|
+
}] } });
|
|
93
|
+
|
|
94
|
+
class NgxParticlesModule {
|
|
95
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.0.8", ngImport: i0, type: NgxParticlesModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
|
|
96
|
+
static ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "17.0.8", ngImport: i0, type: NgxParticlesModule, declarations: [NgxParticlesComponent], exports: [NgxParticlesComponent] });
|
|
97
|
+
static ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "17.0.8", ngImport: i0, type: NgxParticlesModule, providers: [NgParticlesService] });
|
|
98
|
+
}
|
|
99
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.8", ngImport: i0, type: NgxParticlesModule, decorators: [{
|
|
100
|
+
type: NgModule,
|
|
101
|
+
args: [{
|
|
102
|
+
declarations: [NgxParticlesComponent],
|
|
103
|
+
exports: [NgxParticlesComponent],
|
|
104
|
+
providers: [NgParticlesService],
|
|
105
|
+
}]
|
|
106
|
+
}] });
|
|
107
|
+
|
|
108
|
+
/*
|
|
109
|
+
* Public API Surface of ng-particles
|
|
110
|
+
*/
|
|
111
|
+
|
|
112
|
+
/**
|
|
113
|
+
* Generated bundle index. Do not edit.
|
|
114
|
+
*/
|
|
115
|
+
|
|
116
|
+
export { NgParticlesService, NgxParticlesComponent, NgxParticlesModule };
|
|
117
|
+
//# sourceMappingURL=tsparticles-angular.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tsparticles-angular.mjs","sources":["../../../projects/ng-particles/src/lib/ng-particles.service.ts","../../../projects/ng-particles/src/lib/ng-particles.component.ts","../../../projects/ng-particles/src/lib/ng-particles.module.ts","../../../projects/ng-particles/src/public-api.ts","../../../projects/ng-particles/src/tsparticles-angular.ts"],"sourcesContent":["import { Injectable } from '@angular/core';\nimport { BehaviorSubject } from 'rxjs';\nimport { Engine, tsParticles } from '@tsparticles/engine';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class NgParticlesService {\n private initialized = new BehaviorSubject<boolean>(false);\n\n getInstallationStatus() {\n return this.initialized.asObservable();\n }\n\n async init(particlesInit: (engine: Engine) => Promise<void>) {\n await particlesInit(tsParticles);\n\n this.initialized.next(true);\n }\n}\n","import {\n AfterViewInit,\n Component,\n EventEmitter,\n Inject,\n Input,\n OnDestroy,\n OnInit,\n Output,\n PLATFORM_ID,\n} from '@angular/core';\nimport { isPlatformServer } from '@angular/common';\nimport { from, mergeMap, Subject, Subscription, takeUntil } from 'rxjs';\nimport { tsParticles } from '@tsparticles/engine';\nimport type { Container, Engine } from '@tsparticles/engine';\nimport { IParticlesProps } from './ng-particles.module';\nimport { NgParticlesService } from './ng-particles.service';\n\n@Component({\n selector: 'ngx-particles',\n template: '<div [id]=\"id\"></div>',\n})\nexport class NgxParticlesComponent implements OnInit, AfterViewInit, OnDestroy {\n @Input() options?: IParticlesProps;\n @Input() url?: string;\n @Input() id: string;\n @Input() particlesInit?: (engine: Engine) => Promise<void>;\n @Output() particlesLoaded: EventEmitter<Container> = new EventEmitter<Container>();\n\n private subscription?: Subscription;\n private destroy$ = new Subject<void>();\n private container?: Container;\n\n constructor(\n @Inject(PLATFORM_ID) protected platformId: string,\n private readonly particlesService: NgParticlesService,\n ) {\n this.id = 'tsparticles';\n }\n\n public ngOnInit() {\n this.subscription = this.particlesService.getInstallationStatus().subscribe(() => {\n this.container?.destroy();\n this.loadParticles();\n });\n }\n\n public ngAfterViewInit(): void {\n if (isPlatformServer(this.platformId)) {\n return;\n }\n\n this.loadParticles();\n }\n\n public ngOnDestroy(): void {\n this.container?.destroy();\n this.subscription?.unsubscribe();\n this.destroy$.next();\n }\n\n private loadParticles(): void {\n const cb = (container?: Container) => {\n this.container = container;\n this.particlesLoaded.emit(container);\n };\n\n from(this.particlesInit ? this.particlesInit(tsParticles) : Promise.resolve())\n .pipe(\n mergeMap(() => {\n return tsParticles.load({ id: this.id, url: this.url, options: this.options });\n }),\n takeUntil(this.destroy$),\n )\n .subscribe(cb);\n }\n}\n","import { NgModule } from '@angular/core';\nimport { NgxParticlesComponent } from './ng-particles.component';\nimport type { ISourceOptions } from '@tsparticles/engine';\nimport { NgParticlesService } from './ng-particles.service';\n\n@NgModule({\n declarations: [NgxParticlesComponent],\n exports: [NgxParticlesComponent],\n providers: [NgParticlesService],\n})\nexport class NgxParticlesModule {}\n\nexport type IParticlesProps = ISourceOptions;\nexport { NgParticlesService };\n","/*\n * Public API Surface of ng-particles\n */\n\nexport * from './lib/ng-particles.component';\nexport * from './lib/ng-particles.module';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1.NgParticlesService"],"mappings":"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"}
|
package/index.d.ts
ADDED
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { AfterViewInit, EventEmitter, OnDestroy, OnInit } from '@angular/core';
|
|
2
|
+
import type { Container, Engine } from '@tsparticles/engine';
|
|
3
|
+
import { IParticlesProps } from './ng-particles.module';
|
|
4
|
+
import { NgParticlesService } from './ng-particles.service';
|
|
5
|
+
import * as i0 from "@angular/core";
|
|
6
|
+
export declare class NgxParticlesComponent implements OnInit, AfterViewInit, OnDestroy {
|
|
7
|
+
protected platformId: string;
|
|
8
|
+
private readonly particlesService;
|
|
9
|
+
options?: IParticlesProps;
|
|
10
|
+
url?: string;
|
|
11
|
+
id: string;
|
|
12
|
+
particlesInit?: (engine: Engine) => Promise<void>;
|
|
13
|
+
particlesLoaded: EventEmitter<Container>;
|
|
14
|
+
private subscription?;
|
|
15
|
+
private destroy$;
|
|
16
|
+
private container?;
|
|
17
|
+
constructor(platformId: string, particlesService: NgParticlesService);
|
|
18
|
+
ngOnInit(): void;
|
|
19
|
+
ngAfterViewInit(): void;
|
|
20
|
+
ngOnDestroy(): void;
|
|
21
|
+
private loadParticles;
|
|
22
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<NgxParticlesComponent, never>;
|
|
23
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<NgxParticlesComponent, "ngx-particles", never, { "options": { "alias": "options"; "required": false; }; "url": { "alias": "url"; "required": false; }; "id": { "alias": "id"; "required": false; }; "particlesInit": { "alias": "particlesInit"; "required": false; }; }, { "particlesLoaded": "particlesLoaded"; }, never, never, false, never>;
|
|
24
|
+
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { ISourceOptions } from '@tsparticles/engine';
|
|
2
|
+
import { NgParticlesService } from './ng-particles.service';
|
|
3
|
+
import * as i0 from "@angular/core";
|
|
4
|
+
import * as i1 from "./ng-particles.component";
|
|
5
|
+
export declare class NgxParticlesModule {
|
|
6
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<NgxParticlesModule, never>;
|
|
7
|
+
static ɵmod: i0.ɵɵNgModuleDeclaration<NgxParticlesModule, [typeof i1.NgxParticlesComponent], never, [typeof i1.NgxParticlesComponent]>;
|
|
8
|
+
static ɵinj: i0.ɵɵInjectorDeclaration<NgxParticlesModule>;
|
|
9
|
+
}
|
|
10
|
+
export type IParticlesProps = ISourceOptions;
|
|
11
|
+
export { NgParticlesService };
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { Engine } from '@tsparticles/engine';
|
|
2
|
+
import * as i0 from "@angular/core";
|
|
3
|
+
export declare class NgParticlesService {
|
|
4
|
+
private initialized;
|
|
5
|
+
getInstallationStatus(): import("rxjs").Observable<boolean>;
|
|
6
|
+
init(particlesInit: (engine: Engine) => Promise<void>): Promise<void>;
|
|
7
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<NgParticlesService, never>;
|
|
8
|
+
static ɵprov: i0.ɵɵInjectableDeclaration<NgParticlesService>;
|
|
9
|
+
}
|
package/package.json
ADDED
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@tsparticles/angular",
|
|
3
|
+
"version": "3.0.0",
|
|
4
|
+
"description": "Official tsParticles Angular Component - Easily create highly customizable particle, confetti and fireworks animations and use them as animated backgrounds for your website. Ready to use components available also for Web Components, React, Vue.js (2.x and 3.x), Svelte, jQuery, Preact, Riot.js, Solid.js, Inferno.",
|
|
5
|
+
"homepage": "https://particles.js.org",
|
|
6
|
+
"repository": {
|
|
7
|
+
"type": "git",
|
|
8
|
+
"url": "git+https://github.com/tsparticles/angular.git",
|
|
9
|
+
"directory": "components/particles"
|
|
10
|
+
},
|
|
11
|
+
"keywords": [
|
|
12
|
+
"front-end",
|
|
13
|
+
"frontend",
|
|
14
|
+
"tsparticles",
|
|
15
|
+
"particles.js",
|
|
16
|
+
"particlesjs",
|
|
17
|
+
"particles",
|
|
18
|
+
"particle",
|
|
19
|
+
"canvas",
|
|
20
|
+
"jsparticles",
|
|
21
|
+
"xparticles",
|
|
22
|
+
"particles-js",
|
|
23
|
+
"particles-bg",
|
|
24
|
+
"particles-bg-vue",
|
|
25
|
+
"particles-ts",
|
|
26
|
+
"particles.ts",
|
|
27
|
+
"react-particles-js",
|
|
28
|
+
"react-particles.js",
|
|
29
|
+
"react-particles",
|
|
30
|
+
"react",
|
|
31
|
+
"reactjs",
|
|
32
|
+
"vue-particles",
|
|
33
|
+
"ngx-particles",
|
|
34
|
+
"angular-particles",
|
|
35
|
+
"particleground",
|
|
36
|
+
"vue",
|
|
37
|
+
"vuejs",
|
|
38
|
+
"preact",
|
|
39
|
+
"preactjs",
|
|
40
|
+
"jquery",
|
|
41
|
+
"angularjs",
|
|
42
|
+
"angular",
|
|
43
|
+
"typescript",
|
|
44
|
+
"javascript",
|
|
45
|
+
"animation",
|
|
46
|
+
"web",
|
|
47
|
+
"html5",
|
|
48
|
+
"web-design",
|
|
49
|
+
"webdesign",
|
|
50
|
+
"css",
|
|
51
|
+
"html",
|
|
52
|
+
"css3",
|
|
53
|
+
"animated",
|
|
54
|
+
"background",
|
|
55
|
+
"confetti",
|
|
56
|
+
"canvas",
|
|
57
|
+
"fireworks",
|
|
58
|
+
"fireworks-js",
|
|
59
|
+
"confetti-js",
|
|
60
|
+
"confettijs",
|
|
61
|
+
"fireworksjs",
|
|
62
|
+
"canvas-confetti"
|
|
63
|
+
],
|
|
64
|
+
"author": "Matteo Bruni <matteo.bruni@me.com>",
|
|
65
|
+
"license": "MIT",
|
|
66
|
+
"files": [
|
|
67
|
+
"**/*"
|
|
68
|
+
],
|
|
69
|
+
"types": "ng-particles.d.ts",
|
|
70
|
+
"funding": [
|
|
71
|
+
{
|
|
72
|
+
"type": "github",
|
|
73
|
+
"url": "https://github.com/sponsors/matteobruni"
|
|
74
|
+
},
|
|
75
|
+
{
|
|
76
|
+
"type": "github",
|
|
77
|
+
"url": "https://github.com/sponsors/tsparticles"
|
|
78
|
+
},
|
|
79
|
+
{
|
|
80
|
+
"type": "buymeacoffee",
|
|
81
|
+
"url": "https://www.buymeacoffee.com/matteobruni"
|
|
82
|
+
}
|
|
83
|
+
],
|
|
84
|
+
"publishConfig": {
|
|
85
|
+
"access": "public"
|
|
86
|
+
},
|
|
87
|
+
"peerDependencies": {
|
|
88
|
+
"@angular/common": ">=2.0.0",
|
|
89
|
+
"@angular/core": ">=2.0.0",
|
|
90
|
+
"rxjs": ">=7.0.0",
|
|
91
|
+
"@tsparticles/engine": "^3.0.2"
|
|
92
|
+
},
|
|
93
|
+
"dependencies": {
|
|
94
|
+
"tslib": "^2.6.2"
|
|
95
|
+
},
|
|
96
|
+
"module": "fesm2022/tsparticles-angular.mjs",
|
|
97
|
+
"typings": "index.d.ts",
|
|
98
|
+
"exports": {
|
|
99
|
+
"./package.json": {
|
|
100
|
+
"default": "./package.json"
|
|
101
|
+
},
|
|
102
|
+
".": {
|
|
103
|
+
"types": "./index.d.ts",
|
|
104
|
+
"esm2022": "./esm2022/tsparticles-angular.mjs",
|
|
105
|
+
"esm": "./esm2022/tsparticles-angular.mjs",
|
|
106
|
+
"default": "./fesm2022/tsparticles-angular.mjs"
|
|
107
|
+
}
|
|
108
|
+
},
|
|
109
|
+
"sideEffects": false
|
|
110
|
+
}
|
package/public-api.d.ts
ADDED