ngx-dom-confetti 0.0.2 → 0.2.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/README.md +61 -0
- package/esm2022/lib/confetti-component.mjs +48 -0
- package/esm2022/lib/confetti-directive.mjs +45 -0
- package/esm2022/lib/confetti-module.mjs +68 -0
- package/esm2022/lib/confetti-renderer.mjs +104 -0
- package/esm2022/lib/confetti-service.mjs +29 -0
- package/esm2022/lib/config.mjs +18 -0
- package/esm2022/public-api.mjs +9 -0
- package/fesm2022/ngx-dom-confetti.mjs +300 -0
- package/fesm2022/ngx-dom-confetti.mjs.map +1 -0
- package/lib/confetti-component.d.ts +15 -0
- package/lib/confetti-directive.d.ts +15 -0
- package/lib/confetti-module.d.ts +12 -0
- package/lib/confetti-renderer.d.ts +10 -0
- package/lib/confetti-service.d.ts +11 -0
- package/lib/config.d.ts +31 -0
- package/package.json +20 -13
- package/public-api.d.ts +5 -4
- package/esm2020/lib/confetti.mjs +0 -109
- package/esm2020/lib/ngx-dom-confetti.component.mjs +0 -43
- package/esm2020/lib/ngx-dom-confetti.module.mjs +0 -21
- package/esm2020/lib/ngx-dom-confetti.service.mjs +0 -14
- package/esm2020/public-api.mjs +0 -8
- package/fesm2015/ngx-dom-confetti.mjs +0 -192
- package/fesm2015/ngx-dom-confetti.mjs.map +0 -1
- package/fesm2020/ngx-dom-confetti.mjs +0 -192
- package/fesm2020/ngx-dom-confetti.mjs.map +0 -1
- package/lib/confetti.d.ts +0 -19
- package/lib/ngx-dom-confetti.component.d.ts +0 -13
- package/lib/ngx-dom-confetti.module.d.ts +0 -7
- package/lib/ngx-dom-confetti.service.d.ts +0 -6
- /package/{esm2020 → esm2022}/ngx-dom-confetti.mjs +0 -0
package/README.md
CHANGED
|
@@ -47,6 +47,8 @@ export class AppModule { }
|
|
|
47
47
|
|
|
48
48
|
use `ngx-dom-confetti`
|
|
49
49
|
|
|
50
|
+
## component:
|
|
51
|
+
|
|
50
52
|
```html
|
|
51
53
|
<button mat-raised-button color="primary">
|
|
52
54
|
<ngx-dom-confetti>
|
|
@@ -55,6 +57,65 @@ use `ngx-dom-confetti`
|
|
|
55
57
|
</button>
|
|
56
58
|
```
|
|
57
59
|
|
|
60
|
+
## service
|
|
61
|
+
|
|
62
|
+
```ts
|
|
63
|
+
@Component({
|
|
64
|
+
selector: 'app-root',
|
|
65
|
+
template: `
|
|
66
|
+
<div class="center">
|
|
67
|
+
<button #btn="matButton" mat-raised-button color="primary" (click)="hitWithService()">
|
|
68
|
+
Hit Me with Service!
|
|
69
|
+
</button>
|
|
70
|
+
</div>
|
|
71
|
+
`,
|
|
72
|
+
styleUrls: ['./app.component.scss']
|
|
73
|
+
})
|
|
74
|
+
export class AppComponent {
|
|
75
|
+
|
|
76
|
+
ngxDomConfettiService: NgxDomConfettiService = inject(NgxDomConfettiService);
|
|
77
|
+
|
|
78
|
+
@ViewChild('btn', { read: ElementRef })
|
|
79
|
+
btn!: ElementRef<HTMLButtonElement>;
|
|
80
|
+
|
|
81
|
+
hitWithService() {
|
|
82
|
+
const el = this.btn.nativeElement.children.item(0) as HTMLElement;
|
|
83
|
+
if (el) {
|
|
84
|
+
this.ngxDomConfettiService.open(el,this.config);
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
## directive
|
|
93
|
+
|
|
94
|
+
```ts
|
|
95
|
+
@Component({
|
|
96
|
+
selector: 'app-root',
|
|
97
|
+
template: `
|
|
98
|
+
<div class="center">
|
|
99
|
+
<button mat-raised-button color="primary" (click)="hitWithDirective()">
|
|
100
|
+
Hit Me with Directive!
|
|
101
|
+
</button>
|
|
102
|
+
</div>
|
|
103
|
+
`,
|
|
104
|
+
styleUrls: ['./app.component.scss']
|
|
105
|
+
})
|
|
106
|
+
export class AppComponent {
|
|
107
|
+
|
|
108
|
+
ngxDomConfettiService: NgxDomConfettiService = inject(NgxDomConfettiService);
|
|
109
|
+
|
|
110
|
+
@ViewChild(NgxConfettiDirective) confettiDirective!: NgxConfettiDirective;
|
|
111
|
+
|
|
112
|
+
hitWithDirective() {
|
|
113
|
+
this.confettiDirective?.launch();
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
|
|
58
119
|
# license
|
|
59
120
|
|
|
60
121
|
[MIT](https://github.com/damingerdai/ngx-dom-confetti/blob/master/LICENSE)
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { coerceBooleanProperty, coerceElement } from '@angular/cdk/coercion';
|
|
2
|
+
import { DOCUMENT } from '@angular/common';
|
|
3
|
+
import { Component, Inject, Input, Optional } from '@angular/core';
|
|
4
|
+
import { ConfettiRenderer } from './confetti-renderer';
|
|
5
|
+
import { NGX_CONFETTI_GLOBAL_CONFIG } from './config';
|
|
6
|
+
import * as i0 from "@angular/core";
|
|
7
|
+
export class NgxDomConfettiComponent {
|
|
8
|
+
set config(_config) {
|
|
9
|
+
if (_config) {
|
|
10
|
+
this._config = Object.assign(this._config, _config);
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
set active(_active) {
|
|
14
|
+
this._active = coerceBooleanProperty(_active);
|
|
15
|
+
if (this._active) {
|
|
16
|
+
this._confettiRenderer.launch(coerceElement(this.el), this._config);
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
constructor(el, document, globalConfig) {
|
|
20
|
+
this.el = el;
|
|
21
|
+
this._config = {
|
|
22
|
+
...globalConfig
|
|
23
|
+
};
|
|
24
|
+
this._confettiRenderer = new ConfettiRenderer(document);
|
|
25
|
+
this._active = false;
|
|
26
|
+
}
|
|
27
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.0.0", ngImport: i0, type: NgxDomConfettiComponent, deps: [{ token: i0.ElementRef }, { token: DOCUMENT, optional: true }, { token: NGX_CONFETTI_GLOBAL_CONFIG, optional: true }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
28
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.0.0", type: NgxDomConfettiComponent, selector: "ngx-dom-confetti", inputs: { config: "config", active: "active" }, ngImport: i0, template: ` <ng-content></ng-content> `, isInline: true }); }
|
|
29
|
+
}
|
|
30
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.0.0", ngImport: i0, type: NgxDomConfettiComponent, decorators: [{
|
|
31
|
+
type: Component,
|
|
32
|
+
args: [{ selector: 'ngx-dom-confetti', template: ` <ng-content></ng-content> ` }]
|
|
33
|
+
}], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: undefined, decorators: [{
|
|
34
|
+
type: Optional
|
|
35
|
+
}, {
|
|
36
|
+
type: Inject,
|
|
37
|
+
args: [DOCUMENT]
|
|
38
|
+
}] }, { type: undefined, decorators: [{
|
|
39
|
+
type: Optional
|
|
40
|
+
}, {
|
|
41
|
+
type: Inject,
|
|
42
|
+
args: [NGX_CONFETTI_GLOBAL_CONFIG]
|
|
43
|
+
}] }]; }, propDecorators: { config: [{
|
|
44
|
+
type: Input
|
|
45
|
+
}], active: [{
|
|
46
|
+
type: Input
|
|
47
|
+
}] } });
|
|
48
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmV0dGktY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcGFja2FnZXMvbmd4LWRvbS1jb25mZXR0aS9zcmMvbGliL2NvbmZldHRpLWNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQWdCLHFCQUFxQixFQUFFLGFBQWEsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQzNGLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMzQyxPQUFPLEVBQUUsU0FBUyxFQUFjLE1BQU0sRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRS9FLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3ZELE9BQU8sRUFBa0IsMEJBQTBCLEVBQUUsTUFBTSxVQUFVLENBQUM7O0FBT3RFLE1BQU0sT0FBTyx1QkFBdUI7SUFRbEMsSUFDVyxNQUFNLENBQUMsT0FBZ0M7UUFDaEQsSUFBSSxPQUFPLEVBQUU7WUFDWCxJQUFJLENBQUMsT0FBTyxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxPQUFPLENBQUMsQ0FBQztTQUNyRDtJQUNILENBQUM7SUFFRCxJQUNXLE1BQU0sQ0FBQyxPQUFxQjtRQUNyQyxJQUFJLENBQUMsT0FBTyxHQUFHLHFCQUFxQixDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQzlDLElBQUksSUFBSSxDQUFDLE9BQU8sRUFBRTtZQUNoQixJQUFJLENBQUMsaUJBQWlCLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1NBQ3JFO0lBQ0gsQ0FBQztJQUVELFlBQ1UsRUFBYyxFQUNRLFFBQWEsRUFDSyxZQUE2QjtRQUZyRSxPQUFFLEdBQUYsRUFBRSxDQUFZO1FBR3RCLElBQUksQ0FBQyxPQUFPLEdBQUc7WUFDYixHQUFHLFlBQVk7U0FDaEIsQ0FBQztRQUNGLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxJQUFJLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ3hELElBQUksQ0FBQyxPQUFPLEdBQUcsS0FBSyxDQUFDO0lBQ3ZCLENBQUM7OEdBaENVLHVCQUF1Qiw0Q0F5QlosUUFBUSw2QkFDUiwwQkFBMEI7a0dBMUJyQyx1QkFBdUIsd0dBSHhCLDZCQUE2Qjs7MkZBRzVCLHVCQUF1QjtrQkFMbkMsU0FBUzsrQkFDRSxrQkFBa0IsWUFDbEIsNkJBQTZCOzswQkE0QnBDLFFBQVE7OzBCQUFJLE1BQU07MkJBQUMsUUFBUTs7MEJBQzNCLFFBQVE7OzBCQUFJLE1BQU07MkJBQUMsMEJBQTBCOzRDQWpCckMsTUFBTTtzQkFEaEIsS0FBSztnQkFRSyxNQUFNO3NCQURoQixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQm9vbGVhbklucHV0LCBjb2VyY2VCb29sZWFuUHJvcGVydHksIGNvZXJjZUVsZW1lbnQgfSBmcm9tICdAYW5ndWxhci9jZGsvY29lcmNpb24nO1xuaW1wb3J0IHsgRE9DVU1FTlQgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgQ29tcG9uZW50LCBFbGVtZW50UmVmLCBJbmplY3QsIElucHV0LCBPcHRpb25hbCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5pbXBvcnQgeyBDb25mZXR0aVJlbmRlcmVyIH0gZnJvbSAnLi9jb25mZXR0aS1yZW5kZXJlcic7XG5pbXBvcnQgeyBDb25mZXR0aUNvbmZpZywgTkdYX0NPTkZFVFRJX0dMT0JBTF9DT05GSUcgfSBmcm9tICcuL2NvbmZpZyc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ25neC1kb20tY29uZmV0dGknLFxuICB0ZW1wbGF0ZTogYCA8bmctY29udGVudD48L25nLWNvbnRlbnQ+IGAsXG4gIHN0eWxlczogW10sXG59KVxuZXhwb3J0IGNsYXNzIE5neERvbUNvbmZldHRpQ29tcG9uZW50IHtcblxuICBwcml2YXRlIF9jb25mZXR0aVJlbmRlcmVyOiBDb25mZXR0aVJlbmRlcmVyO1xuXG4gIHByaXZhdGUgX2NvbmZpZzogUGFydGlhbDxDb25mZXR0aUNvbmZpZz47XG5cbiAgcHJpdmF0ZSBfYWN0aXZlOiBib29sZWFuO1xuXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBzZXQgY29uZmlnKF9jb25maWc6IFBhcnRpYWw8Q29uZmV0dGlDb25maWc+KSB7XG4gICAgaWYgKF9jb25maWcpIHtcbiAgICAgIHRoaXMuX2NvbmZpZyA9IE9iamVjdC5hc3NpZ24odGhpcy5fY29uZmlnLCBfY29uZmlnKTtcbiAgICB9XG4gIH1cblxuICBASW5wdXQoKVxuICBwdWJsaWMgc2V0IGFjdGl2ZShfYWN0aXZlOiBCb29sZWFuSW5wdXQpIHtcbiAgICB0aGlzLl9hY3RpdmUgPSBjb2VyY2VCb29sZWFuUHJvcGVydHkoX2FjdGl2ZSk7XG4gICAgaWYgKHRoaXMuX2FjdGl2ZSkge1xuICAgICAgdGhpcy5fY29uZmV0dGlSZW5kZXJlci5sYXVuY2goY29lcmNlRWxlbWVudCh0aGlzLmVsKSwgdGhpcy5fY29uZmlnKTtcbiAgICB9XG4gIH1cblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGVsOiBFbGVtZW50UmVmLFxuICAgIEBPcHRpb25hbCgpIEBJbmplY3QoRE9DVU1FTlQpIGRvY3VtZW50OiBhbnksXG4gICAgQE9wdGlvbmFsKCkgQEluamVjdChOR1hfQ09ORkVUVElfR0xPQkFMX0NPTkZJRykgZ2xvYmFsQ29uZmlnPzogQ29uZmV0dGlDb25maWcpIHtcbiAgICB0aGlzLl9jb25maWcgPSB7XG4gICAgICAuLi5nbG9iYWxDb25maWdcbiAgICB9O1xuICAgIHRoaXMuX2NvbmZldHRpUmVuZGVyZXIgPSBuZXcgQ29uZmV0dGlSZW5kZXJlcihkb2N1bWVudCk7XG4gICAgdGhpcy5fYWN0aXZlID0gZmFsc2U7XG4gIH1cbn1cbiJdfQ==
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { coerceElement } from '@angular/cdk/coercion';
|
|
2
|
+
import { DOCUMENT } from '@angular/common';
|
|
3
|
+
import { Directive, Inject, Optional, } from '@angular/core';
|
|
4
|
+
import { ConfettiRenderer } from './confetti-renderer';
|
|
5
|
+
import { defaultsConfettiConfig, NGX_CONFETTI_GLOBAL_CONFIG } from './config';
|
|
6
|
+
import * as i0 from "@angular/core";
|
|
7
|
+
import * as i1 from "@angular/cdk/platform";
|
|
8
|
+
export class NgxConfettiDirective {
|
|
9
|
+
constructor(_elementRef, ngZone, platform, document, globalConfig) {
|
|
10
|
+
this._elementRef = _elementRef;
|
|
11
|
+
this.ngZone = ngZone;
|
|
12
|
+
this.platform = platform;
|
|
13
|
+
this._globalConfig = (globalConfig || defaultsConfettiConfig);
|
|
14
|
+
this._confettiRenderer = new ConfettiRenderer(document);
|
|
15
|
+
}
|
|
16
|
+
launch(config) {
|
|
17
|
+
if (!this.platform.isBrowser) {
|
|
18
|
+
return;
|
|
19
|
+
}
|
|
20
|
+
const element = coerceElement(this._elementRef);
|
|
21
|
+
this.ngZone.runOutsideAngular(() => {
|
|
22
|
+
this._confettiRenderer.launch(this._elementRef.nativeElement, config ?? this._globalConfig);
|
|
23
|
+
});
|
|
24
|
+
}
|
|
25
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.0.0", ngImport: i0, type: NgxConfettiDirective, deps: [{ token: i0.ElementRef }, { token: i0.NgZone }, { token: i1.Platform }, { token: DOCUMENT, optional: true }, { token: NGX_CONFETTI_GLOBAL_CONFIG, optional: true }], target: i0.ɵɵFactoryTarget.Directive }); }
|
|
26
|
+
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "16.0.0", type: NgxConfettiDirective, selector: "[confetti], [ngxConfetti]", exportAs: ["ngxConfetti"], ngImport: i0 }); }
|
|
27
|
+
}
|
|
28
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.0.0", ngImport: i0, type: NgxConfettiDirective, decorators: [{
|
|
29
|
+
type: Directive,
|
|
30
|
+
args: [{
|
|
31
|
+
selector: '[confetti], [ngxConfetti]',
|
|
32
|
+
exportAs: 'ngxConfetti',
|
|
33
|
+
}]
|
|
34
|
+
}], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i0.NgZone }, { type: i1.Platform }, { type: undefined, decorators: [{
|
|
35
|
+
type: Optional
|
|
36
|
+
}, {
|
|
37
|
+
type: Inject,
|
|
38
|
+
args: [DOCUMENT]
|
|
39
|
+
}] }, { type: undefined, decorators: [{
|
|
40
|
+
type: Optional
|
|
41
|
+
}, {
|
|
42
|
+
type: Inject,
|
|
43
|
+
args: [NGX_CONFETTI_GLOBAL_CONFIG]
|
|
44
|
+
}] }]; } });
|
|
45
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmV0dGktZGlyZWN0aXZlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcGFja2FnZXMvbmd4LWRvbS1jb25mZXR0aS9zcmMvbGliL2NvbmZldHRpLWRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFFdEQsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzNDLE9BQU8sRUFDTCxTQUFTLEVBRVQsTUFBTSxFQUlOLFFBQVEsR0FDVCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUN2RCxPQUFPLEVBQWtCLHNCQUFzQixFQUFFLDBCQUEwQixFQUFFLE1BQU0sVUFBVSxDQUFDOzs7QUFNOUYsTUFBTSxPQUFPLG9CQUFvQjtJQU0vQixZQUNVLFdBQW9DLEVBQ3BDLE1BQWMsRUFDZCxRQUFrQixFQUNJLFFBQWEsRUFDSyxZQUE2QjtRQUpyRSxnQkFBVyxHQUFYLFdBQVcsQ0FBeUI7UUFDcEMsV0FBTSxHQUFOLE1BQU0sQ0FBUTtRQUNkLGFBQVEsR0FBUixRQUFRLENBQVU7UUFJMUIsSUFBSSxDQUFDLGFBQWEsR0FBRyxDQUFDLFlBQVksSUFBSSxzQkFBc0IsQ0FBbUIsQ0FBQztRQUNoRixJQUFJLENBQUMsaUJBQWlCLEdBQUcsSUFBSSxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUMxRCxDQUFDO0lBR00sTUFBTSxDQUFDLE1BQWdDO1FBQzVDLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLFNBQVMsRUFBRTtZQUM1QixPQUFPO1NBQ1I7UUFDRCxNQUFNLE9BQU8sR0FBRyxhQUFhLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQ2hELElBQUksQ0FBQyxNQUFNLENBQUMsaUJBQWlCLENBQUMsR0FBRyxFQUFFO1lBQ2pDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxhQUFhLEVBQUUsTUFBTSxJQUFJLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUM5RixDQUFDLENBQUMsQ0FBQTtJQUVKLENBQUM7OEdBM0JVLG9CQUFvQiwwRkFVVCxRQUFRLDZCQUNSLDBCQUEwQjtrR0FYckMsb0JBQW9COzsyRkFBcEIsb0JBQW9CO2tCQUpoQyxTQUFTO21CQUFDO29CQUNULFFBQVEsRUFBRSwyQkFBMkI7b0JBQ3JDLFFBQVEsRUFBRSxhQUFhO2lCQUN4Qjs7MEJBV0ksUUFBUTs7MEJBQUksTUFBTTsyQkFBQyxRQUFROzswQkFDM0IsUUFBUTs7MEJBQUksTUFBTTsyQkFBQywwQkFBMEIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBjb2VyY2VFbGVtZW50IH0gZnJvbSAnQGFuZ3VsYXIvY2RrL2NvZXJjaW9uJztcbmltcG9ydCB7UGxhdGZvcm19IGZyb20gJ0Bhbmd1bGFyL2Nkay9wbGF0Zm9ybSc7XG5pbXBvcnQgeyBET0NVTUVOVCB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQge1xuICBEaXJlY3RpdmUsXG4gIEVsZW1lbnRSZWYsXG4gIEluamVjdCxcbiAgTmdab25lLFxuICBPbkRlc3Ryb3ksXG4gIE9uSW5pdCxcbiAgT3B0aW9uYWwsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ29uZmV0dGlSZW5kZXJlciB9IGZyb20gJy4vY29uZmV0dGktcmVuZGVyZXInO1xuaW1wb3J0IHsgQ29uZmV0dGlDb25maWcsIGRlZmF1bHRzQ29uZmV0dGlDb25maWcsIE5HWF9DT05GRVRUSV9HTE9CQUxfQ09ORklHIH0gZnJvbSAnLi9jb25maWcnO1xuXG5ARGlyZWN0aXZlKHtcbiAgc2VsZWN0b3I6ICdbY29uZmV0dGldLCBbbmd4Q29uZmV0dGldJyxcbiAgZXhwb3J0QXM6ICduZ3hDb25mZXR0aScsXG59KVxuZXhwb3J0IGNsYXNzIE5neENvbmZldHRpRGlyZWN0aXZlIHtcblxuICBwcml2YXRlIF9nbG9iYWxDb25maWc6IENvbmZldHRpQ29uZmlnO1xuXG4gIHByaXZhdGUgX2NvbmZldHRpUmVuZGVyZXI6IENvbmZldHRpUmVuZGVyZXI7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBfZWxlbWVudFJlZjogRWxlbWVudFJlZjxIVE1MRWxlbWVudD4sXG4gICAgcHJpdmF0ZSBuZ1pvbmU6IE5nWm9uZSxcbiAgICBwcml2YXRlIHBsYXRmb3JtOiBQbGF0Zm9ybSxcbiAgICBAT3B0aW9uYWwoKSBASW5qZWN0KERPQ1VNRU5UKSBkb2N1bWVudDogYW55LFxuICAgIEBPcHRpb25hbCgpIEBJbmplY3QoTkdYX0NPTkZFVFRJX0dMT0JBTF9DT05GSUcpIGdsb2JhbENvbmZpZz86IENvbmZldHRpQ29uZmlnLFxuICApIHtcbiAgICB0aGlzLl9nbG9iYWxDb25maWcgPSAoZ2xvYmFsQ29uZmlnIHx8IGRlZmF1bHRzQ29uZmV0dGlDb25maWcpIGFzIENvbmZldHRpQ29uZmlnO1xuICAgIHRoaXMuX2NvbmZldHRpUmVuZGVyZXIgPSBuZXcgQ29uZmV0dGlSZW5kZXJlcihkb2N1bWVudCk7XG4gIH1cblxuXG4gIHB1YmxpYyBsYXVuY2goY29uZmlnPzogUGFydGlhbDxDb25mZXR0aUNvbmZpZz4pIHtcbiAgICBpZiAoIXRoaXMucGxhdGZvcm0uaXNCcm93c2VyKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGVsZW1lbnQgPSBjb2VyY2VFbGVtZW50KHRoaXMuX2VsZW1lbnRSZWYpO1xuICAgIHRoaXMubmdab25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcbiAgICAgIHRoaXMuX2NvbmZldHRpUmVuZGVyZXIubGF1bmNoKHRoaXMuX2VsZW1lbnRSZWYubmF0aXZlRWxlbWVudCwgY29uZmlnID8/IHRoaXMuX2dsb2JhbENvbmZpZyk7XG4gICAgfSlcblxuICB9XG5cbn1cbiJdfQ==
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import { CommonModule } from '@angular/common';
|
|
2
|
+
import { NgModule } from '@angular/core';
|
|
3
|
+
import { NgxConfettiDirective } from './confetti-directive';
|
|
4
|
+
import { NgxDomConfettiComponent } from './confetti-component';
|
|
5
|
+
import { NgxDomConfettiService } from './confetti-service';
|
|
6
|
+
import { defaultsConfettiConfig, NGX_CONFETTI_GLOBAL_CONFIG } from './config';
|
|
7
|
+
import * as i0 from "@angular/core";
|
|
8
|
+
export class NgxDomConfettiModule {
|
|
9
|
+
static forRoot() {
|
|
10
|
+
return {
|
|
11
|
+
ngModule: NgxDomConfettiModule,
|
|
12
|
+
providers: [
|
|
13
|
+
{
|
|
14
|
+
provide: NGX_CONFETTI_GLOBAL_CONFIG,
|
|
15
|
+
useValue: defaultsConfettiConfig,
|
|
16
|
+
},
|
|
17
|
+
NgxDomConfettiService,
|
|
18
|
+
],
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
static forChild() {
|
|
22
|
+
return {
|
|
23
|
+
ngModule: NgxDomConfettiModule,
|
|
24
|
+
providers: [
|
|
25
|
+
{
|
|
26
|
+
provide: NGX_CONFETTI_GLOBAL_CONFIG,
|
|
27
|
+
useValue: defaultsConfettiConfig,
|
|
28
|
+
},
|
|
29
|
+
NgxDomConfettiService,
|
|
30
|
+
],
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.0.0", ngImport: i0, type: NgxDomConfettiModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
|
|
34
|
+
static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "16.0.0", ngImport: i0, type: NgxDomConfettiModule, declarations: [NgxDomConfettiComponent,
|
|
35
|
+
NgxConfettiDirective], imports: [CommonModule], exports: [NgxDomConfettiComponent,
|
|
36
|
+
NgxConfettiDirective] }); }
|
|
37
|
+
static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "16.0.0", ngImport: i0, type: NgxDomConfettiModule, providers: [
|
|
38
|
+
{
|
|
39
|
+
provide: NGX_CONFETTI_GLOBAL_CONFIG,
|
|
40
|
+
useValue: defaultsConfettiConfig,
|
|
41
|
+
},
|
|
42
|
+
NgxDomConfettiService,
|
|
43
|
+
], imports: [CommonModule] }); }
|
|
44
|
+
}
|
|
45
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.0.0", ngImport: i0, type: NgxDomConfettiModule, decorators: [{
|
|
46
|
+
type: NgModule,
|
|
47
|
+
args: [{
|
|
48
|
+
declarations: [
|
|
49
|
+
NgxDomConfettiComponent,
|
|
50
|
+
NgxConfettiDirective,
|
|
51
|
+
],
|
|
52
|
+
imports: [
|
|
53
|
+
CommonModule,
|
|
54
|
+
],
|
|
55
|
+
providers: [
|
|
56
|
+
{
|
|
57
|
+
provide: NGX_CONFETTI_GLOBAL_CONFIG,
|
|
58
|
+
useValue: defaultsConfettiConfig,
|
|
59
|
+
},
|
|
60
|
+
NgxDomConfettiService,
|
|
61
|
+
],
|
|
62
|
+
exports: [
|
|
63
|
+
NgxDomConfettiComponent,
|
|
64
|
+
NgxConfettiDirective
|
|
65
|
+
]
|
|
66
|
+
}]
|
|
67
|
+
}] });
|
|
68
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmV0dGktbW9kdWxlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcGFja2FnZXMvbmd4LWRvbS1jb25mZXR0aS9zcmMvbGliL2NvbmZldHRpLW1vZHVsZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUF1QixRQUFRLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDOUQsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDNUQsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDL0QsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDM0QsT0FBTyxFQUFFLHNCQUFzQixFQUFFLDBCQUEwQixFQUFFLE1BQU0sVUFBVSxDQUFDOztBQXdCOUUsTUFBTSxPQUFPLG9CQUFvQjtJQUUvQixNQUFNLENBQUMsT0FBTztRQUNaLE9BQU87WUFDTCxRQUFRLEVBQUUsb0JBQW9CO1lBQzlCLFNBQVMsRUFBRTtnQkFDVDtvQkFDRSxPQUFPLEVBQUUsMEJBQTBCO29CQUNuQyxRQUFRLEVBQUUsc0JBQXNCO2lCQUNqQztnQkFDRCxxQkFBcUI7YUFDdEI7U0FDRixDQUFDO0lBQ0osQ0FBQztJQUVELE1BQU0sQ0FBQyxRQUFRO1FBQ2IsT0FBTztZQUNMLFFBQVEsRUFBRSxvQkFBb0I7WUFDOUIsU0FBUyxFQUFFO2dCQUNUO29CQUNFLE9BQU8sRUFBRSwwQkFBMEI7b0JBQ25DLFFBQVEsRUFBRSxzQkFBc0I7aUJBQ2pDO2dCQUNELHFCQUFxQjthQUN0QjtTQUNGLENBQUM7SUFDSixDQUFDOzhHQTFCVSxvQkFBb0I7K0dBQXBCLG9CQUFvQixpQkFuQjdCLHVCQUF1QjtZQUN2QixvQkFBb0IsYUFJcEIsWUFBWSxhQVVaLHVCQUF1QjtZQUN2QixvQkFBb0I7K0dBR1gsb0JBQW9CLGFBWnBCO1lBQ1Q7Z0JBQ0UsT0FBTyxFQUFFLDBCQUEwQjtnQkFDbkMsUUFBUSxFQUFFLHNCQUFzQjthQUNqQztZQUNELHFCQUFxQjtTQUN0QixZQVJDLFlBQVk7OzJGQWNILG9CQUFvQjtrQkFyQmhDLFFBQVE7bUJBQUM7b0JBQ1IsWUFBWSxFQUFFO3dCQUNaLHVCQUF1Qjt3QkFDdkIsb0JBQW9CO3FCQUVyQjtvQkFDRCxPQUFPLEVBQUU7d0JBQ1AsWUFBWTtxQkFDYjtvQkFDRCxTQUFTLEVBQUU7d0JBQ1Q7NEJBQ0UsT0FBTyxFQUFFLDBCQUEwQjs0QkFDbkMsUUFBUSxFQUFFLHNCQUFzQjt5QkFDakM7d0JBQ0QscUJBQXFCO3FCQUN0QjtvQkFDRCxPQUFPLEVBQUU7d0JBQ1AsdUJBQXVCO3dCQUN2QixvQkFBb0I7cUJBQ3JCO2lCQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IE1vZHVsZVdpdGhQcm92aWRlcnMsIE5nTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBOZ3hDb25mZXR0aURpcmVjdGl2ZSB9IGZyb20gJy4vY29uZmV0dGktZGlyZWN0aXZlJztcbmltcG9ydCB7IE5neERvbUNvbmZldHRpQ29tcG9uZW50IH0gZnJvbSAnLi9jb25mZXR0aS1jb21wb25lbnQnO1xuaW1wb3J0IHsgTmd4RG9tQ29uZmV0dGlTZXJ2aWNlIH0gZnJvbSAnLi9jb25mZXR0aS1zZXJ2aWNlJztcbmltcG9ydCB7IGRlZmF1bHRzQ29uZmV0dGlDb25maWcsIE5HWF9DT05GRVRUSV9HTE9CQUxfQ09ORklHIH0gZnJvbSAnLi9jb25maWcnO1xuXG5cbkBOZ01vZHVsZSh7XG4gIGRlY2xhcmF0aW9uczogW1xuICAgIE5neERvbUNvbmZldHRpQ29tcG9uZW50LFxuICAgIE5neENvbmZldHRpRGlyZWN0aXZlLFxuXG4gIF0sXG4gIGltcG9ydHM6IFtcbiAgICBDb21tb25Nb2R1bGUsXG4gIF0sXG4gIHByb3ZpZGVyczogW1xuICAgIHtcbiAgICAgIHByb3ZpZGU6IE5HWF9DT05GRVRUSV9HTE9CQUxfQ09ORklHLFxuICAgICAgdXNlVmFsdWU6IGRlZmF1bHRzQ29uZmV0dGlDb25maWcsXG4gICAgfSxcbiAgICBOZ3hEb21Db25mZXR0aVNlcnZpY2UsXG4gIF0sXG4gIGV4cG9ydHM6IFtcbiAgICBOZ3hEb21Db25mZXR0aUNvbXBvbmVudCxcbiAgICBOZ3hDb25mZXR0aURpcmVjdGl2ZVxuICBdXG59KVxuZXhwb3J0IGNsYXNzIE5neERvbUNvbmZldHRpTW9kdWxlIHtcblxuICBzdGF0aWMgZm9yUm9vdCgpOiBNb2R1bGVXaXRoUHJvdmlkZXJzPE5neERvbUNvbmZldHRpTW9kdWxlPiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIG5nTW9kdWxlOiBOZ3hEb21Db25mZXR0aU1vZHVsZSxcbiAgICAgIHByb3ZpZGVyczogW1xuICAgICAgICB7XG4gICAgICAgICAgcHJvdmlkZTogTkdYX0NPTkZFVFRJX0dMT0JBTF9DT05GSUcsXG4gICAgICAgICAgdXNlVmFsdWU6IGRlZmF1bHRzQ29uZmV0dGlDb25maWcsXG4gICAgICAgIH0sXG4gICAgICAgIE5neERvbUNvbmZldHRpU2VydmljZSxcbiAgICAgIF0sXG4gICAgfTtcbiAgfVxuXG4gIHN0YXRpYyBmb3JDaGlsZCgpOiBNb2R1bGVXaXRoUHJvdmlkZXJzPE5neERvbUNvbmZldHRpTW9kdWxlPiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIG5nTW9kdWxlOiBOZ3hEb21Db25mZXR0aU1vZHVsZSxcbiAgICAgIHByb3ZpZGVyczogW1xuICAgICAgICB7XG4gICAgICAgICAgcHJvdmlkZTogTkdYX0NPTkZFVFRJX0dMT0JBTF9DT05GSUcsXG4gICAgICAgICAgdXNlVmFsdWU6IGRlZmF1bHRzQ29uZmV0dGlDb25maWcsXG4gICAgICAgIH0sXG4gICAgICAgIE5neERvbUNvbmZldHRpU2VydmljZSxcbiAgICAgIF0sXG4gICAgfTtcbiAgfVxuIH1cbiJdfQ==
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
import { defaultsConfettiConfig } from './config';
|
|
2
|
+
export class ConfettiRenderer {
|
|
3
|
+
constructor(_document) {
|
|
4
|
+
this._document = _document;
|
|
5
|
+
}
|
|
6
|
+
createElements(elementCount, colors, width, height) {
|
|
7
|
+
const fragment = this._document.createDocumentFragment();
|
|
8
|
+
const elements = Array.from({ length: elementCount }).map((_, index) => {
|
|
9
|
+
const element = this._document.createElement('div');
|
|
10
|
+
const color = colors[index % colors.length];
|
|
11
|
+
element.style.backgroundColor = color;
|
|
12
|
+
element.style.width = width;
|
|
13
|
+
element.style.height = height;
|
|
14
|
+
element.style.position = 'absolute';
|
|
15
|
+
element.style.willChange = 'transform, opacity';
|
|
16
|
+
element.style.visibility = 'hidden';
|
|
17
|
+
fragment.appendChild(element);
|
|
18
|
+
return element;
|
|
19
|
+
});
|
|
20
|
+
return {
|
|
21
|
+
fragment,
|
|
22
|
+
elements,
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
randomPhysics(angle, spread, startVelocity, random) {
|
|
26
|
+
const radAngle = angle * (Math.PI / 180);
|
|
27
|
+
const radSpread = spread * (Math.PI / 180);
|
|
28
|
+
return {
|
|
29
|
+
x: 0,
|
|
30
|
+
y: 0,
|
|
31
|
+
z: 0,
|
|
32
|
+
wobble: random() * 10,
|
|
33
|
+
wobbleSpeed: 0.1 + random() * 0.1,
|
|
34
|
+
velocity: startVelocity * 0.5 + random() * startVelocity,
|
|
35
|
+
angle2D: -radAngle + (0.5 * radSpread - random() * radSpread),
|
|
36
|
+
angle3D: -(Math.PI / 4) + random() * (Math.PI / 2),
|
|
37
|
+
tiltAngle: random() * Math.PI,
|
|
38
|
+
tiltAngleSpeed: 0.1 + random() * 0.3,
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
updateFetti(fetti, progress, dragFriction, decay) {
|
|
42
|
+
/* eslint-disable no-param-reassign */
|
|
43
|
+
fetti.physics.x += Math.cos(fetti.physics.angle2D) * fetti.physics.velocity;
|
|
44
|
+
fetti.physics.y += Math.sin(fetti.physics.angle2D) * fetti.physics.velocity;
|
|
45
|
+
fetti.physics.z += Math.sin(fetti.physics.angle3D) * fetti.physics.velocity;
|
|
46
|
+
fetti.physics.wobble += fetti.physics.wobbleSpeed;
|
|
47
|
+
// Backward compatibility
|
|
48
|
+
if (decay) {
|
|
49
|
+
fetti.physics.velocity *= decay;
|
|
50
|
+
}
|
|
51
|
+
else {
|
|
52
|
+
fetti.physics.velocity -= fetti.physics.velocity * dragFriction;
|
|
53
|
+
}
|
|
54
|
+
fetti.physics.y += 3;
|
|
55
|
+
fetti.physics.tiltAngle += fetti.physics.tiltAngleSpeed;
|
|
56
|
+
const { x, y, z, tiltAngle, wobble } = fetti.physics;
|
|
57
|
+
const wobbleX = x + 10 * Math.cos(wobble);
|
|
58
|
+
const wobbleY = y + 10 * Math.sin(wobble);
|
|
59
|
+
const transform = `translate3d(${wobbleX}px, ${wobbleY}px, ${z}px) rotate3d(1, 1, 1, ${tiltAngle}rad)`;
|
|
60
|
+
fetti.element.style.visibility = "visible";
|
|
61
|
+
fetti.element.style.transform = transform;
|
|
62
|
+
fetti.element.style.opacity = (1 - progress).toString();
|
|
63
|
+
;
|
|
64
|
+
/* eslint-enable */
|
|
65
|
+
}
|
|
66
|
+
animate(root, fettis, dragFriction, decay, duration, stagger) {
|
|
67
|
+
let startTime;
|
|
68
|
+
return new Promise(resolve => {
|
|
69
|
+
const update = (time) => {
|
|
70
|
+
if (!startTime)
|
|
71
|
+
startTime = time;
|
|
72
|
+
const elapsed = time - startTime;
|
|
73
|
+
const progress = startTime === time ? 0 : (time - startTime) / duration;
|
|
74
|
+
fettis.slice(0, Math.ceil(elapsed / stagger)).forEach(fetti => {
|
|
75
|
+
this.updateFetti(fetti, progress, dragFriction, decay);
|
|
76
|
+
});
|
|
77
|
+
if (time - startTime < duration) {
|
|
78
|
+
requestAnimationFrame(update);
|
|
79
|
+
}
|
|
80
|
+
else {
|
|
81
|
+
fettis.forEach((fetti) => {
|
|
82
|
+
if (fetti.element.parentNode === root) {
|
|
83
|
+
root.removeChild(fetti.element);
|
|
84
|
+
}
|
|
85
|
+
});
|
|
86
|
+
resolve();
|
|
87
|
+
}
|
|
88
|
+
};
|
|
89
|
+
requestAnimationFrame(update);
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
launch(root, config) {
|
|
93
|
+
const { elementCount, colors, width, height, perspective, angle, spread, startVelocity, decay, dragFriction, duration, stagger, random, } = { ...defaultsConfettiConfig, ...config };
|
|
94
|
+
root.style.perspective = perspective;
|
|
95
|
+
const { fragment, elements } = this.createElements(elementCount ?? 50, colors, width, height);
|
|
96
|
+
root.appendChild(fragment);
|
|
97
|
+
const fettis = elements.map((element) => ({
|
|
98
|
+
element,
|
|
99
|
+
physics: this.randomPhysics(angle, spread, startVelocity, random),
|
|
100
|
+
}));
|
|
101
|
+
return this.animate(root, fettis, dragFriction, decay, duration, stagger);
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmV0dGktcmVuZGVyZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wYWNrYWdlcy9uZ3gtZG9tLWNvbmZldHRpL3NyYy9saWIvY29uZmV0dGktcmVuZGVyZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFrQixzQkFBc0IsRUFBRSxNQUFNLFVBQVUsQ0FBQztBQW9CbEUsTUFBTSxPQUFPLGdCQUFnQjtJQUUzQixZQUFvQixTQUFtQjtRQUFuQixjQUFTLEdBQVQsU0FBUyxDQUFVO0lBQUcsQ0FBQztJQUVuQyxjQUFjLENBQ3BCLFlBQW9CLEVBQ3BCLE1BQWdCLEVBQ2hCLEtBQWEsRUFDYixNQUFjO1FBS2QsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxzQkFBc0IsRUFBRSxDQUFDO1FBQ3pELE1BQU0sUUFBUSxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxFQUFFLEVBQUU7WUFDckUsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDcEQsTUFBTSxLQUFLLEdBQUcsTUFBTSxDQUFDLEtBQUssR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDNUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxlQUFlLEdBQUcsS0FBSyxDQUFDO1lBQ3RDLE9BQU8sQ0FBQyxLQUFLLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztZQUM1QixPQUFPLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUM7WUFDOUIsT0FBTyxDQUFDLEtBQUssQ0FBQyxRQUFRLEdBQUcsVUFBVSxDQUFDO1lBQ3BDLE9BQU8sQ0FBQyxLQUFLLENBQUMsVUFBVSxHQUFHLG9CQUFvQixDQUFDO1lBQ2hELE9BQU8sQ0FBQyxLQUFLLENBQUMsVUFBVSxHQUFHLFFBQVEsQ0FBQztZQUNwQyxRQUFRLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQzlCLE9BQU8sT0FBTyxDQUFDO1FBQ2pCLENBQUMsQ0FBQyxDQUFDO1FBRUgsT0FBTztZQUNMLFFBQVE7WUFDUixRQUFRO1NBQ1QsQ0FBQztJQUNKLENBQUM7SUFFTyxhQUFhLENBQ25CLEtBQWEsRUFDYixNQUFjLEVBQ2QsYUFBcUIsRUFDckIsTUFBb0I7UUFFcEIsTUFBTSxRQUFRLEdBQUcsS0FBSyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsR0FBRyxHQUFHLENBQUMsQ0FBQztRQUN6QyxNQUFNLFNBQVMsR0FBRyxNQUFNLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxHQUFHLEdBQUcsQ0FBQyxDQUFDO1FBQzNDLE9BQU87WUFDTCxDQUFDLEVBQUUsQ0FBQztZQUNKLENBQUMsRUFBRSxDQUFDO1lBQ0osQ0FBQyxFQUFFLENBQUM7WUFDSixNQUFNLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRTtZQUNyQixXQUFXLEVBQUUsR0FBRyxHQUFHLE1BQU0sRUFBRSxHQUFHLEdBQUc7WUFDakMsUUFBUSxFQUFFLGFBQWEsR0FBRyxHQUFHLEdBQUcsTUFBTSxFQUFFLEdBQUcsYUFBYTtZQUN4RCxPQUFPLEVBQUUsQ0FBQyxRQUFRLEdBQUcsQ0FBQyxHQUFHLEdBQUcsU0FBUyxHQUFHLE1BQU0sRUFBRSxHQUFHLFNBQVMsQ0FBQztZQUM3RCxPQUFPLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLEdBQUcsTUFBTSxFQUFFLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQztZQUNsRCxTQUFTLEVBQUUsTUFBTSxFQUFFLEdBQUcsSUFBSSxDQUFDLEVBQUU7WUFDN0IsY0FBYyxFQUFFLEdBQUcsR0FBRyxNQUFNLEVBQUUsR0FBRyxHQUFHO1NBQ3JDLENBQUM7SUFDSixDQUFDO0lBRU8sV0FBVyxDQUFDLEtBQWEsRUFBRSxRQUFnQixFQUFFLFlBQW9CLEVBQUUsS0FBYTtRQUN0RixzQ0FBc0M7UUFDdEMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDO1FBQzVFLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQztRQUM1RSxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUM7UUFDNUUsS0FBSyxDQUFDLE9BQU8sQ0FBQyxNQUFNLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUM7UUFDbEQseUJBQXlCO1FBQ3pCLElBQUksS0FBSyxFQUFFO1lBQ1QsS0FBSyxDQUFDLE9BQU8sQ0FBQyxRQUFRLElBQUksS0FBSyxDQUFDO1NBQ2pDO2FBQU07WUFDTCxLQUFLLENBQUMsT0FBTyxDQUFDLFFBQVEsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLFFBQVEsR0FBRyxZQUFZLENBQUM7U0FDakU7UUFDRCxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDckIsS0FBSyxDQUFDLE9BQU8sQ0FBQyxTQUFTLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxjQUFjLENBQUM7UUFFeEQsTUFBTSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDO1FBQ3JELE1BQU0sT0FBTyxHQUFHLENBQUMsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUMxQyxNQUFNLE9BQU8sR0FBRyxDQUFDLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDMUMsTUFBTSxTQUFTLEdBQUcsZUFBZSxPQUFPLE9BQU8sT0FBTyxPQUFPLENBQUMseUJBQXlCLFNBQVMsTUFBTSxDQUFDO1FBRXZHLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLFVBQVUsR0FBRyxTQUFTLENBQUM7UUFDM0MsS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsU0FBUyxHQUFHLFNBQVMsQ0FBQztRQUMxQyxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxPQUFPLEdBQUcsQ0FBQyxDQUFDLEdBQUcsUUFBUSxDQUFDLENBQUMsUUFBUSxFQUFFLENBQUM7UUFBQSxDQUFDO1FBQ3pELG1CQUFtQjtJQUNyQixDQUFDO0lBRU8sT0FBTyxDQUFDLElBQWlCLEVBQUUsTUFBcUIsRUFBRSxZQUFvQixFQUFFLEtBQWEsRUFBRSxRQUFnQixFQUFFLE9BQWU7UUFDOUgsSUFBSSxTQUFpQixDQUFDO1FBRXRCLE9BQU8sSUFBSSxPQUFPLENBQU8sT0FBTyxDQUFDLEVBQUU7WUFDL0IsTUFBTSxNQUFNLEdBQUcsQ0FBQyxJQUFZLEVBQUUsRUFBRTtnQkFDNUIsSUFBSSxDQUFDLFNBQVM7b0JBQUUsU0FBUyxHQUFHLElBQUksQ0FBQztnQkFDakMsTUFBTSxPQUFPLEdBQUcsSUFBSSxHQUFHLFNBQVMsQ0FBQztnQkFDakMsTUFBTSxRQUFRLEdBQUcsU0FBUyxLQUFLLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksR0FBRyxTQUFTLENBQUMsR0FBRyxRQUFRLENBQUM7Z0JBQ3hFLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxFQUFFO29CQUMxRCxJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssRUFBRSxRQUFRLEVBQUUsWUFBWSxFQUFFLEtBQUssQ0FBQyxDQUFDO2dCQUMzRCxDQUFDLENBQUMsQ0FBQztnQkFFSCxJQUFJLElBQUksR0FBRyxTQUFTLEdBQUcsUUFBUSxFQUFFO29CQUM3QixxQkFBcUIsQ0FBQyxNQUFNLENBQUMsQ0FBQztpQkFDakM7cUJBQU07b0JBQ0gsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFO3dCQUN2QixJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsVUFBVSxLQUFLLElBQUksRUFBRTs0QkFDckMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7eUJBQ2pDO29CQUNILENBQUMsQ0FBQyxDQUFBO29CQUVGLE9BQU8sRUFBRSxDQUFDO2lCQUNiO1lBQ0wsQ0FBQyxDQUFBO1lBRUQscUJBQXFCLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDbEMsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDO0lBRVEsTUFBTSxDQUFDLElBQWlCLEVBQUUsTUFBZ0M7UUFDL0QsTUFBTSxFQUNKLFlBQVksRUFDWixNQUFNLEVBQ04sS0FBSyxFQUNMLE1BQU0sRUFDTixXQUFXLEVBQ1gsS0FBSyxFQUNMLE1BQU0sRUFDTixhQUFhLEVBQ2IsS0FBSyxFQUNMLFlBQVksRUFDWixRQUFRLEVBQ1IsT0FBTyxFQUNQLE1BQU0sR0FDUCxHQUFHLEVBQUUsR0FBRyxzQkFBc0IsRUFBRSxHQUFHLE1BQU0sRUFBb0IsQ0FBQztRQUMvRCxJQUFJLENBQUMsS0FBSyxDQUFDLFdBQVcsR0FBRyxXQUFXLENBQUM7UUFDckMsTUFBTSxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUNoRCxZQUFZLElBQUksRUFBRSxFQUNsQixNQUFNLEVBQ04sS0FBSyxFQUNMLE1BQU0sQ0FDUCxDQUFDO1FBQ0YsSUFBSSxDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUMzQixNQUFNLE1BQU0sR0FBRyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBQ3hDLE9BQU87WUFDUCxPQUFPLEVBQUUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxLQUFLLEVBQUUsTUFBTSxFQUFFLGFBQWEsRUFBRSxNQUFNLENBQUM7U0FDbEUsQ0FBQyxDQUFDLENBQUM7UUFFSixPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxPQUFPLENBQUMsQ0FBQztJQUM1RSxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb25mZXR0aUNvbmZpZywgZGVmYXVsdHNDb25mZXR0aUNvbmZpZyB9IGZyb20gJy4vY29uZmlnJztcblxuaW50ZXJmYWNlIElQaHlzaWNzIHtcbiAgeDogbnVtYmVyO1xuICB5OiBudW1iZXI7XG4gIHo6IG51bWJlcjtcbiAgd29iYmxlOiBudW1iZXI7XG4gIHdvYmJsZVNwZWVkOiBudW1iZXI7XG4gIHZlbG9jaXR5OiBudW1iZXI7XG4gIGFuZ2xlMkQ6IG51bWJlcjtcbiAgYW5nbGUzRDogbnVtYmVyO1xuICB0aWx0QW5nbGU6IG51bWJlcjtcbiAgdGlsdEFuZ2xlU3BlZWQ6IG51bWJlcjtcbn1cblxuaW50ZXJmYWNlIElGZXR0aSB7XG4gIGVsZW1lbnQ6IEhUTUxEaXZFbGVtZW50LFxuICBwaHlzaWNzOiBJUGh5c2ljc1xufVxuXG5leHBvcnQgY2xhc3MgQ29uZmV0dGlSZW5kZXJlciB7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBfZG9jdW1lbnQ6IERvY3VtZW50KSB7fVxuXG4gIHByaXZhdGUgY3JlYXRlRWxlbWVudHMoXG4gICAgZWxlbWVudENvdW50OiBudW1iZXIsXG4gICAgY29sb3JzOiBzdHJpbmdbXSxcbiAgICB3aWR0aDogc3RyaW5nLFxuICAgIGhlaWdodDogc3RyaW5nXG4gICk6IHtcbiAgICBmcmFnbWVudDogRG9jdW1lbnRGcmFnbWVudCxcbiAgICBlbGVtZW50czogSFRNTERpdkVsZW1lbnRbXVxuICAgfSB7XG4gICAgY29uc3QgZnJhZ21lbnQgPSB0aGlzLl9kb2N1bWVudC5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCk7XG4gICAgY29uc3QgZWxlbWVudHMgPSBBcnJheS5mcm9tKHsgbGVuZ3RoOiBlbGVtZW50Q291bnQgfSkubWFwKChfLCBpbmRleCkgPT4ge1xuICAgICAgY29uc3QgZWxlbWVudCA9IHRoaXMuX2RvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgY29uc3QgY29sb3IgPSBjb2xvcnNbaW5kZXggJSBjb2xvcnMubGVuZ3RoXTtcbiAgICAgIGVsZW1lbnQuc3R5bGUuYmFja2dyb3VuZENvbG9yID0gY29sb3I7XG4gICAgICBlbGVtZW50LnN0eWxlLndpZHRoID0gd2lkdGg7XG4gICAgICBlbGVtZW50LnN0eWxlLmhlaWdodCA9IGhlaWdodDtcbiAgICAgIGVsZW1lbnQuc3R5bGUucG9zaXRpb24gPSAnYWJzb2x1dGUnO1xuICAgICAgZWxlbWVudC5zdHlsZS53aWxsQ2hhbmdlID0gJ3RyYW5zZm9ybSwgb3BhY2l0eSc7XG4gICAgICBlbGVtZW50LnN0eWxlLnZpc2liaWxpdHkgPSAnaGlkZGVuJztcbiAgICAgIGZyYWdtZW50LmFwcGVuZENoaWxkKGVsZW1lbnQpO1xuICAgICAgcmV0dXJuIGVsZW1lbnQ7XG4gICAgfSk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgZnJhZ21lbnQsXG4gICAgICBlbGVtZW50cyxcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSByYW5kb21QaHlzaWNzKFxuICAgIGFuZ2xlOiBudW1iZXIsXG4gICAgc3ByZWFkOiBudW1iZXIsXG4gICAgc3RhcnRWZWxvY2l0eTogbnVtYmVyLFxuICAgIHJhbmRvbTogKCkgPT4gbnVtYmVyXG4gICk6IElQaHlzaWNzIHtcbiAgICBjb25zdCByYWRBbmdsZSA9IGFuZ2xlICogKE1hdGguUEkgLyAxODApO1xuICAgIGNvbnN0IHJhZFNwcmVhZCA9IHNwcmVhZCAqIChNYXRoLlBJIC8gMTgwKTtcbiAgICByZXR1cm4ge1xuICAgICAgeDogMCxcbiAgICAgIHk6IDAsXG4gICAgICB6OiAwLFxuICAgICAgd29iYmxlOiByYW5kb20oKSAqIDEwLFxuICAgICAgd29iYmxlU3BlZWQ6IDAuMSArIHJhbmRvbSgpICogMC4xLFxuICAgICAgdmVsb2NpdHk6IHN0YXJ0VmVsb2NpdHkgKiAwLjUgKyByYW5kb20oKSAqIHN0YXJ0VmVsb2NpdHksXG4gICAgICBhbmdsZTJEOiAtcmFkQW5nbGUgKyAoMC41ICogcmFkU3ByZWFkIC0gcmFuZG9tKCkgKiByYWRTcHJlYWQpLFxuICAgICAgYW5nbGUzRDogLShNYXRoLlBJIC8gNCkgKyByYW5kb20oKSAqIChNYXRoLlBJIC8gMiksXG4gICAgICB0aWx0QW5nbGU6IHJhbmRvbSgpICogTWF0aC5QSSxcbiAgICAgIHRpbHRBbmdsZVNwZWVkOiAwLjEgKyByYW5kb20oKSAqIDAuMyxcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVGZXR0aShmZXR0aTogSUZldHRpLCBwcm9ncmVzczogbnVtYmVyLCBkcmFnRnJpY3Rpb246IG51bWJlciwgZGVjYXk6IG51bWJlcikge1xuICAgIC8qIGVzbGludC1kaXNhYmxlIG5vLXBhcmFtLXJlYXNzaWduICovXG4gICAgZmV0dGkucGh5c2ljcy54ICs9IE1hdGguY29zKGZldHRpLnBoeXNpY3MuYW5nbGUyRCkgKiBmZXR0aS5waHlzaWNzLnZlbG9jaXR5O1xuICAgIGZldHRpLnBoeXNpY3MueSArPSBNYXRoLnNpbihmZXR0aS5waHlzaWNzLmFuZ2xlMkQpICogZmV0dGkucGh5c2ljcy52ZWxvY2l0eTtcbiAgICBmZXR0aS5waHlzaWNzLnogKz0gTWF0aC5zaW4oZmV0dGkucGh5c2ljcy5hbmdsZTNEKSAqIGZldHRpLnBoeXNpY3MudmVsb2NpdHk7XG4gICAgZmV0dGkucGh5c2ljcy53b2JibGUgKz0gZmV0dGkucGh5c2ljcy53b2JibGVTcGVlZDtcbiAgICAvLyBCYWNrd2FyZCBjb21wYXRpYmlsaXR5XG4gICAgaWYgKGRlY2F5KSB7XG4gICAgICBmZXR0aS5waHlzaWNzLnZlbG9jaXR5ICo9IGRlY2F5O1xuICAgIH0gZWxzZSB7XG4gICAgICBmZXR0aS5waHlzaWNzLnZlbG9jaXR5IC09IGZldHRpLnBoeXNpY3MudmVsb2NpdHkgKiBkcmFnRnJpY3Rpb247XG4gICAgfVxuICAgIGZldHRpLnBoeXNpY3MueSArPSAzO1xuICAgIGZldHRpLnBoeXNpY3MudGlsdEFuZ2xlICs9IGZldHRpLnBoeXNpY3MudGlsdEFuZ2xlU3BlZWQ7XG5cbiAgICBjb25zdCB7IHgsIHksIHosIHRpbHRBbmdsZSwgd29iYmxlIH0gPSBmZXR0aS5waHlzaWNzO1xuICAgIGNvbnN0IHdvYmJsZVggPSB4ICsgMTAgKiBNYXRoLmNvcyh3b2JibGUpO1xuICAgIGNvbnN0IHdvYmJsZVkgPSB5ICsgMTAgKiBNYXRoLnNpbih3b2JibGUpO1xuICAgIGNvbnN0IHRyYW5zZm9ybSA9IGB0cmFuc2xhdGUzZCgke3dvYmJsZVh9cHgsICR7d29iYmxlWX1weCwgJHt6fXB4KSByb3RhdGUzZCgxLCAxLCAxLCAke3RpbHRBbmdsZX1yYWQpYDtcblxuICAgIGZldHRpLmVsZW1lbnQuc3R5bGUudmlzaWJpbGl0eSA9IFwidmlzaWJsZVwiO1xuICAgIGZldHRpLmVsZW1lbnQuc3R5bGUudHJhbnNmb3JtID0gdHJhbnNmb3JtO1xuICAgIGZldHRpLmVsZW1lbnQuc3R5bGUub3BhY2l0eSA9ICgxIC0gcHJvZ3Jlc3MpLnRvU3RyaW5nKCk7O1xuICAgIC8qIGVzbGludC1lbmFibGUgKi9cbiAgfVxuXG4gIHByaXZhdGUgYW5pbWF0ZShyb290OiBIVE1MRWxlbWVudCwgZmV0dGlzOiBBcnJheTxJRmV0dGk+LCBkcmFnRnJpY3Rpb246IG51bWJlciwgZGVjYXk6IG51bWJlciwgZHVyYXRpb246IG51bWJlciwgc3RhZ2dlcjogbnVtYmVyKSB7XG4gICAgbGV0IHN0YXJ0VGltZTogbnVtYmVyO1xuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlPHZvaWQ+KHJlc29sdmUgPT4ge1xuICAgICAgICBjb25zdCB1cGRhdGUgPSAodGltZTogbnVtYmVyKSA9PiB7XG4gICAgICAgICAgICBpZiAoIXN0YXJ0VGltZSkgc3RhcnRUaW1lID0gdGltZTtcbiAgICAgICAgICAgIGNvbnN0IGVsYXBzZWQgPSB0aW1lIC0gc3RhcnRUaW1lO1xuICAgICAgICAgICAgY29uc3QgcHJvZ3Jlc3MgPSBzdGFydFRpbWUgPT09IHRpbWUgPyAwIDogKHRpbWUgLSBzdGFydFRpbWUpIC8gZHVyYXRpb247XG4gICAgICAgICAgICBmZXR0aXMuc2xpY2UoMCwgTWF0aC5jZWlsKGVsYXBzZWQgLyBzdGFnZ2VyKSkuZm9yRWFjaChmZXR0aSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy51cGRhdGVGZXR0aShmZXR0aSwgcHJvZ3Jlc3MsIGRyYWdGcmljdGlvbiwgZGVjYXkpO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIGlmICh0aW1lIC0gc3RhcnRUaW1lIDwgZHVyYXRpb24pIHtcbiAgICAgICAgICAgICAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUodXBkYXRlKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgZmV0dGlzLmZvckVhY2goKGZldHRpKSA9PiB7XG4gICAgICAgICAgICAgICAgICBpZiAoZmV0dGkuZWxlbWVudC5wYXJlbnROb2RlID09PSByb290KSB7XG4gICAgICAgICAgICAgICAgICAgIHJvb3QucmVtb3ZlQ2hpbGQoZmV0dGkuZWxlbWVudCk7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSlcblxuICAgICAgICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZSh1cGRhdGUpO1xuICAgIH0pO1xufVxuXG4gIHB1YmxpYyBsYXVuY2gocm9vdDogSFRNTEVsZW1lbnQsIGNvbmZpZz86IFBhcnRpYWw8Q29uZmV0dGlDb25maWc+KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3Qge1xuICAgICAgZWxlbWVudENvdW50LFxuICAgICAgY29sb3JzLFxuICAgICAgd2lkdGgsXG4gICAgICBoZWlnaHQsXG4gICAgICBwZXJzcGVjdGl2ZSxcbiAgICAgIGFuZ2xlLFxuICAgICAgc3ByZWFkLFxuICAgICAgc3RhcnRWZWxvY2l0eSxcbiAgICAgIGRlY2F5LFxuICAgICAgZHJhZ0ZyaWN0aW9uLFxuICAgICAgZHVyYXRpb24sXG4gICAgICBzdGFnZ2VyLFxuICAgICAgcmFuZG9tLFxuICAgIH0gPSB7IC4uLmRlZmF1bHRzQ29uZmV0dGlDb25maWcsIC4uLmNvbmZpZyB9IGFzIENvbmZldHRpQ29uZmlnO1xuICAgIHJvb3Quc3R5bGUucGVyc3BlY3RpdmUgPSBwZXJzcGVjdGl2ZTtcbiAgICBjb25zdCB7IGZyYWdtZW50LCBlbGVtZW50cyB9ID0gdGhpcy5jcmVhdGVFbGVtZW50cyhcbiAgICAgIGVsZW1lbnRDb3VudCA/PyA1MCxcbiAgICAgIGNvbG9ycyxcbiAgICAgIHdpZHRoLFxuICAgICAgaGVpZ2h0XG4gICAgKTtcbiAgICByb290LmFwcGVuZENoaWxkKGZyYWdtZW50KTtcbiAgICBjb25zdCBmZXR0aXMgPSBlbGVtZW50cy5tYXAoKGVsZW1lbnQpID0+ICh7XG4gICAgICBlbGVtZW50LFxuICAgICAgcGh5c2ljczogdGhpcy5yYW5kb21QaHlzaWNzKGFuZ2xlLCBzcHJlYWQsIHN0YXJ0VmVsb2NpdHksIHJhbmRvbSksXG4gICAgfSkpO1xuXG4gICAgcmV0dXJuIHRoaXMuYW5pbWF0ZShyb290LCBmZXR0aXMsIGRyYWdGcmljdGlvbiwgZGVjYXksIGR1cmF0aW9uLCBzdGFnZ2VyKTtcbiAgfVxufVxuIl19
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { coerceElement } from '@angular/cdk/coercion';
|
|
2
|
+
import { DOCUMENT } from '@angular/common';
|
|
3
|
+
import { Inject, Injectable, Optional } from '@angular/core';
|
|
4
|
+
import { ConfettiRenderer } from './confetti-renderer';
|
|
5
|
+
import { NGX_CONFETTI_GLOBAL_CONFIG } from './config';
|
|
6
|
+
import * as i0 from "@angular/core";
|
|
7
|
+
export class NgxDomConfettiService {
|
|
8
|
+
constructor(document, globalConfig) {
|
|
9
|
+
this._confettiRenderer = new ConfettiRenderer(document);
|
|
10
|
+
this._globalConfig = globalConfig;
|
|
11
|
+
}
|
|
12
|
+
open(el, config) {
|
|
13
|
+
this._confettiRenderer.launch(coerceElement(el), config ?? this._globalConfig);
|
|
14
|
+
}
|
|
15
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.0.0", ngImport: i0, type: NgxDomConfettiService, deps: [{ token: DOCUMENT, optional: true }, { token: NGX_CONFETTI_GLOBAL_CONFIG }], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
16
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.0.0", ngImport: i0, type: NgxDomConfettiService }); }
|
|
17
|
+
}
|
|
18
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.0.0", ngImport: i0, type: NgxDomConfettiService, decorators: [{
|
|
19
|
+
type: Injectable
|
|
20
|
+
}], ctorParameters: function () { return [{ type: undefined, decorators: [{
|
|
21
|
+
type: Optional
|
|
22
|
+
}, {
|
|
23
|
+
type: Inject,
|
|
24
|
+
args: [DOCUMENT]
|
|
25
|
+
}] }, { type: undefined, decorators: [{
|
|
26
|
+
type: Inject,
|
|
27
|
+
args: [NGX_CONFETTI_GLOBAL_CONFIG]
|
|
28
|
+
}] }]; } });
|
|
29
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmV0dGktc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3BhY2thZ2VzL25neC1kb20tY29uZmV0dGkvc3JjL2xpYi9jb25mZXR0aS1zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUN0RCxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDM0MsT0FBTyxFQUFjLE1BQU0sRUFBRSxVQUFVLEVBQUUsUUFBUSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3pFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3ZELE9BQU8sRUFBa0IsMEJBQTBCLEVBQUUsTUFBTSxVQUFVLENBQUM7O0FBR3RFLE1BQU0sT0FBTyxxQkFBcUI7SUFNaEMsWUFDZ0MsUUFBYSxFQUNQLFlBQTRCO1FBRWhFLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxJQUFJLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ3hELElBQUksQ0FBQyxhQUFhLEdBQUcsWUFBWSxDQUFDO0lBQ3BDLENBQUM7SUFFTSxJQUFJLENBQUMsRUFBNEIsRUFBRSxNQUFnQztRQUN4RSxJQUFJLENBQUMsaUJBQWlCLENBQUMsTUFBTSxDQUMzQixhQUFhLENBQUMsRUFBRSxDQUFDLEVBQ2pCLE1BQU0sSUFBSSxJQUFJLENBQUMsYUFBYSxDQUM3QixDQUFDO0lBQ0osQ0FBQzs4R0FuQlUscUJBQXFCLGtCQU9WLFFBQVEsNkJBQ3BCLDBCQUEwQjtrSEFSekIscUJBQXFCOzsyRkFBckIscUJBQXFCO2tCQURqQyxVQUFVOzswQkFRTixRQUFROzswQkFBSSxNQUFNOzJCQUFDLFFBQVE7OzBCQUMzQixNQUFNOzJCQUFDLDBCQUEwQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGNvZXJjZUVsZW1lbnQgfSBmcm9tICdAYW5ndWxhci9jZGsvY29lcmNpb24nO1xuaW1wb3J0IHsgRE9DVU1FTlQgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgRWxlbWVudFJlZiwgSW5qZWN0LCBJbmplY3RhYmxlLCBPcHRpb25hbCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ29uZmV0dGlSZW5kZXJlciB9IGZyb20gJy4vY29uZmV0dGktcmVuZGVyZXInO1xuaW1wb3J0IHsgQ29uZmV0dGlDb25maWcsIE5HWF9DT05GRVRUSV9HTE9CQUxfQ09ORklHIH0gZnJvbSAnLi9jb25maWcnO1xuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgTmd4RG9tQ29uZmV0dGlTZXJ2aWNlIHtcblxuICBwcml2YXRlIF9jb25mZXR0aVJlbmRlcmVyOiBDb25mZXR0aVJlbmRlcmVyO1xuXG4gIHByaXZhdGUgX2dsb2JhbENvbmZpZzogQ29uZmV0dGlDb25maWc7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgQE9wdGlvbmFsKCkgQEluamVjdChET0NVTUVOVCkgZG9jdW1lbnQ6IGFueSxcbiAgICBASW5qZWN0KE5HWF9DT05GRVRUSV9HTE9CQUxfQ09ORklHKSBnbG9iYWxDb25maWc6IENvbmZldHRpQ29uZmlnLFxuICApIHtcbiAgICB0aGlzLl9jb25mZXR0aVJlbmRlcmVyID0gbmV3IENvbmZldHRpUmVuZGVyZXIoZG9jdW1lbnQpO1xuICAgIHRoaXMuX2dsb2JhbENvbmZpZyA9IGdsb2JhbENvbmZpZztcbiAgfVxuXG4gIHB1YmxpYyBvcGVuKGVsOiBIVE1MRWxlbWVudCB8IEVsZW1lbnRSZWYsIGNvbmZpZz86IFBhcnRpYWw8Q29uZmV0dGlDb25maWc+KSB7XG4gICAgdGhpcy5fY29uZmV0dGlSZW5kZXJlci5sYXVuY2goXG4gICAgICBjb2VyY2VFbGVtZW50KGVsKSxcbiAgICAgIGNvbmZpZyA/PyB0aGlzLl9nbG9iYWxDb25maWdcbiAgICApO1xuICB9XG59XG4iXX0=
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { InjectionToken } from "@angular/core";
|
|
2
|
+
export const NGX_CONFETTI_GLOBAL_CONFIG = new InjectionToken('ngx-confetti-global-config');
|
|
3
|
+
const defaultColors = ["#a864fd", "#29cdff", "#78ff44", "#ff718d", "#fdff6a"];
|
|
4
|
+
export const defaultsConfettiConfig = {
|
|
5
|
+
angle: 90,
|
|
6
|
+
spread: 45,
|
|
7
|
+
startVelocity: 45,
|
|
8
|
+
elementCount: 50,
|
|
9
|
+
width: "10px",
|
|
10
|
+
height: "10px",
|
|
11
|
+
perspective: "",
|
|
12
|
+
colors: defaultColors,
|
|
13
|
+
duration: 3000,
|
|
14
|
+
stagger: 0,
|
|
15
|
+
dragFriction: 0.1,
|
|
16
|
+
random: Math.random
|
|
17
|
+
};
|
|
18
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlnLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcGFja2FnZXMvbmd4LWRvbS1jb25mZXR0aS9zcmMvbGliL2NvbmZpZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBa0IvQyxNQUFNLENBQUMsTUFBTSwwQkFBMEIsR0FBRyxJQUFJLGNBQWMsQ0FDMUQsNEJBQTRCLENBQzdCLENBQUM7QUFFRixNQUFNLGFBQWEsR0FBRyxDQUFDLFNBQVMsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxTQUFTLENBQUMsQ0FBQztBQUU5RSxNQUFNLENBQUMsTUFBTSxzQkFBc0IsR0FBRztJQUNwQyxLQUFLLEVBQUUsRUFBRTtJQUNULE1BQU0sRUFBRSxFQUFFO0lBQ1YsYUFBYSxFQUFFLEVBQUU7SUFDakIsWUFBWSxFQUFFLEVBQUU7SUFDaEIsS0FBSyxFQUFFLE1BQU07SUFDYixNQUFNLEVBQUUsTUFBTTtJQUNkLFdBQVcsRUFBRSxFQUFFO0lBQ2YsTUFBTSxFQUFFLGFBQWE7SUFDckIsUUFBUSxFQUFFLElBQUk7SUFDZCxPQUFPLEVBQUUsQ0FBQztJQUNWLFlBQVksRUFBRSxHQUFHO0lBQ2pCLE1BQU0sRUFBRSxJQUFJLENBQUMsTUFBTTtDQUNwQixDQUFBIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0aW9uVG9rZW4gfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xuXG5leHBvcnQgaW50ZXJmYWNlIENvbmZldHRpQ29uZmlnIHtcbiAgYW5nbGU6IG51bWJlcjtcbiAgc3ByZWFkOiBudW1iZXI7XG4gIHdpZHRoOiBzdHJpbmc7XG4gIGhlaWdodDogc3RyaW5nO1xuICBwZXJzcGVjdGl2ZTogc3RyaW5nO1xuICBkdXJhdGlvbjogbnVtYmVyO1xuICBkcmFnRnJpY3Rpb246IG51bWJlcjtcbiAgc3RhZ2dlcjogbnVtYmVyO1xuICBzdGFydFZlbG9jaXR5OiBudW1iZXI7XG4gIGVsZW1lbnRDb3VudDogbnVtYmVyO1xuICBkZWNheTogbnVtYmVyO1xuICBjb2xvcnM6IHN0cmluZ1tdO1xuICByYW5kb206ICgpID0+IG51bWJlcjtcbn1cblxuZXhwb3J0IGNvbnN0IE5HWF9DT05GRVRUSV9HTE9CQUxfQ09ORklHID0gbmV3IEluamVjdGlvblRva2VuPENvbmZldHRpQ29uZmlnPihcbiAgJ25neC1jb25mZXR0aS1nbG9iYWwtY29uZmlnJyxcbik7XG5cbmNvbnN0IGRlZmF1bHRDb2xvcnMgPSBbXCIjYTg2NGZkXCIsIFwiIzI5Y2RmZlwiLCBcIiM3OGZmNDRcIiwgXCIjZmY3MThkXCIsIFwiI2ZkZmY2YVwiXTtcblxuZXhwb3J0IGNvbnN0IGRlZmF1bHRzQ29uZmV0dGlDb25maWcgPSB7XG4gIGFuZ2xlOiA5MCxcbiAgc3ByZWFkOiA0NSxcbiAgc3RhcnRWZWxvY2l0eTogNDUsXG4gIGVsZW1lbnRDb3VudDogNTAsXG4gIHdpZHRoOiBcIjEwcHhcIixcbiAgaGVpZ2h0OiBcIjEwcHhcIixcbiAgcGVyc3BlY3RpdmU6IFwiXCIsXG4gIGNvbG9yczogZGVmYXVsdENvbG9ycyxcbiAgZHVyYXRpb246IDMwMDAsXG4gIHN0YWdnZXI6IDAsXG4gIGRyYWdGcmljdGlvbjogMC4xLFxuICByYW5kb206IE1hdGgucmFuZG9tXG59XG4iXX0=
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Public API Surface of ngx-dom-confetti
|
|
3
|
+
*/
|
|
4
|
+
export * from './lib/confetti-directive';
|
|
5
|
+
export * from './lib/confetti-service';
|
|
6
|
+
export * from './lib/confetti-component';
|
|
7
|
+
export * from './lib/confetti-module';
|
|
8
|
+
export * from './lib/config';
|
|
9
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHVibGljLWFwaS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3BhY2thZ2VzL25neC1kb20tY29uZmV0dGkvc3JjL3B1YmxpYy1hcGkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7O0dBRUc7QUFDSCxjQUFjLDBCQUEwQixDQUFDO0FBQ3pDLGNBQWMsd0JBQXdCLENBQUM7QUFDdkMsY0FBYywwQkFBMEIsQ0FBQztBQUN6QyxjQUFjLHVCQUF1QixDQUFDO0FBQ3RDLGNBQWMsY0FBYyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLypcbiAqIFB1YmxpYyBBUEkgU3VyZmFjZSBvZiBuZ3gtZG9tLWNvbmZldHRpXG4gKi9cbmV4cG9ydCAqIGZyb20gJy4vbGliL2NvbmZldHRpLWRpcmVjdGl2ZSc7XG5leHBvcnQgKiBmcm9tICcuL2xpYi9jb25mZXR0aS1zZXJ2aWNlJztcbmV4cG9ydCAqIGZyb20gJy4vbGliL2NvbmZldHRpLWNvbXBvbmVudCc7XG5leHBvcnQgKiBmcm9tICcuL2xpYi9jb25mZXR0aS1tb2R1bGUnO1xuZXhwb3J0ICogZnJvbSAnLi9saWIvY29uZmlnJztcbiJdfQ==
|