angular-three 2.0.0-beta.286 → 2.0.0-beta.287

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/esm2022/index.mjs CHANGED
@@ -1,9 +1,11 @@
1
1
  export * from './lib/canvas';
2
2
  export * from './lib/directives/args';
3
+ export * from './lib/directives/selection';
3
4
  export * from './lib/html';
4
5
  export * from './lib/instance';
5
6
  export * from './lib/loader';
6
7
  export * from './lib/loop';
8
+ export * from './lib/pipes/hexify';
7
9
  export * from './lib/portal';
8
10
  export * from './lib/renderer';
9
11
  export * from './lib/roots';
@@ -19,4 +21,4 @@ export * from './lib/utils/parameters';
19
21
  export * from './lib/utils/resolve-ref';
20
22
  export * from './lib/utils/signal-store';
21
23
  export * from './lib/utils/update';
22
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9saWJzL2NvcmUvc3JjL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGNBQWMsY0FBYyxDQUFDO0FBQzdCLGNBQWMsdUJBQXVCLENBQUM7QUFDdEMsY0FBYyxZQUFZLENBQUM7QUFDM0IsY0FBYyxnQkFBZ0IsQ0FBQztBQUMvQixjQUFjLGNBQWMsQ0FBQztBQUM3QixjQUFjLFlBQVksQ0FBQztBQUMzQixjQUFjLGNBQWMsQ0FBQztBQUM3QixjQUFjLGdCQUFnQixDQUFDO0FBQy9CLGNBQWMsYUFBYSxDQUFDO0FBQzVCLGNBQWMsb0JBQW9CLENBQUM7QUFDbkMsY0FBYyxhQUFhLENBQUM7QUFDNUIsY0FBYyx5QkFBeUIsQ0FBQztBQUN4QyxjQUFjLG9CQUFvQixDQUFDO0FBQ25DLGNBQWMsMkJBQTJCLENBQUM7QUFDMUMsY0FBYyxnQkFBZ0IsQ0FBQztBQUMvQixjQUFjLGtCQUFrQixDQUFDO0FBQ2pDLGNBQWMsMkJBQTJCLENBQUM7QUFDMUMsY0FBYyx3QkFBd0IsQ0FBQztBQUN2QyxjQUFjLHlCQUF5QixDQUFDO0FBQ3hDLGNBQWMsMEJBQTBCLENBQUM7QUFDekMsY0FBYyxvQkFBb0IsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCAqIGZyb20gJy4vbGliL2NhbnZhcyc7XG5leHBvcnQgKiBmcm9tICcuL2xpYi9kaXJlY3RpdmVzL2FyZ3MnO1xuZXhwb3J0ICogZnJvbSAnLi9saWIvaHRtbCc7XG5leHBvcnQgKiBmcm9tICcuL2xpYi9pbnN0YW5jZSc7XG5leHBvcnQgKiBmcm9tICcuL2xpYi9sb2FkZXInO1xuZXhwb3J0ICogZnJvbSAnLi9saWIvbG9vcCc7XG5leHBvcnQgKiBmcm9tICcuL2xpYi9wb3J0YWwnO1xuZXhwb3J0ICogZnJvbSAnLi9saWIvcmVuZGVyZXInO1xuZXhwb3J0ICogZnJvbSAnLi9saWIvcm9vdHMnO1xuZXhwb3J0ICogZnJvbSAnLi9saWIvcm91dGVkLXNjZW5lJztcbmV4cG9ydCAqIGZyb20gJy4vbGliL3N0b3JlJztcbmV4cG9ydCAqIGZyb20gJy4vbGliL3V0aWxzL2FwcGx5LXByb3BzJztcbmV4cG9ydCAqIGZyb20gJy4vbGliL3V0aWxzL2F0dGFjaCc7XG5leHBvcnQgKiBmcm9tICcuL2xpYi91dGlscy9iZWZvcmUtcmVuZGVyJztcbmV4cG9ydCAqIGZyb20gJy4vbGliL3V0aWxzL2lzJztcbmV4cG9ydCAqIGZyb20gJy4vbGliL3V0aWxzL21ha2UnO1xuZXhwb3J0ICogZnJvbSAnLi9saWIvdXRpbHMvb2JqZWN0LWV2ZW50cyc7XG5leHBvcnQgKiBmcm9tICcuL2xpYi91dGlscy9wYXJhbWV0ZXJzJztcbmV4cG9ydCAqIGZyb20gJy4vbGliL3V0aWxzL3Jlc29sdmUtcmVmJztcbmV4cG9ydCAqIGZyb20gJy4vbGliL3V0aWxzL3NpZ25hbC1zdG9yZSc7XG5leHBvcnQgKiBmcm9tICcuL2xpYi91dGlscy91cGRhdGUnO1xuXG5leHBvcnQgdHlwZSAqIGZyb20gJy4vbGliL3RocmVlLXR5cGVzJztcbmV4cG9ydCB0eXBlICogZnJvbSAnLi9saWIvdHlwZXMnO1xuIl19
24
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9saWJzL2NvcmUvc3JjL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGNBQWMsY0FBYyxDQUFDO0FBQzdCLGNBQWMsdUJBQXVCLENBQUM7QUFDdEMsY0FBYyw0QkFBNEIsQ0FBQztBQUMzQyxjQUFjLFlBQVksQ0FBQztBQUMzQixjQUFjLGdCQUFnQixDQUFDO0FBQy9CLGNBQWMsY0FBYyxDQUFDO0FBQzdCLGNBQWMsWUFBWSxDQUFDO0FBQzNCLGNBQWMsb0JBQW9CLENBQUM7QUFDbkMsY0FBYyxjQUFjLENBQUM7QUFDN0IsY0FBYyxnQkFBZ0IsQ0FBQztBQUMvQixjQUFjLGFBQWEsQ0FBQztBQUM1QixjQUFjLG9CQUFvQixDQUFDO0FBQ25DLGNBQWMsYUFBYSxDQUFDO0FBQzVCLGNBQWMseUJBQXlCLENBQUM7QUFDeEMsY0FBYyxvQkFBb0IsQ0FBQztBQUNuQyxjQUFjLDJCQUEyQixDQUFDO0FBQzFDLGNBQWMsZ0JBQWdCLENBQUM7QUFDL0IsY0FBYyxrQkFBa0IsQ0FBQztBQUNqQyxjQUFjLDJCQUEyQixDQUFDO0FBQzFDLGNBQWMsd0JBQXdCLENBQUM7QUFDdkMsY0FBYyx5QkFBeUIsQ0FBQztBQUN4QyxjQUFjLDBCQUEwQixDQUFDO0FBQ3pDLGNBQWMsb0JBQW9CLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgKiBmcm9tICcuL2xpYi9jYW52YXMnO1xuZXhwb3J0ICogZnJvbSAnLi9saWIvZGlyZWN0aXZlcy9hcmdzJztcbmV4cG9ydCAqIGZyb20gJy4vbGliL2RpcmVjdGl2ZXMvc2VsZWN0aW9uJztcbmV4cG9ydCAqIGZyb20gJy4vbGliL2h0bWwnO1xuZXhwb3J0ICogZnJvbSAnLi9saWIvaW5zdGFuY2UnO1xuZXhwb3J0ICogZnJvbSAnLi9saWIvbG9hZGVyJztcbmV4cG9ydCAqIGZyb20gJy4vbGliL2xvb3AnO1xuZXhwb3J0ICogZnJvbSAnLi9saWIvcGlwZXMvaGV4aWZ5JztcbmV4cG9ydCAqIGZyb20gJy4vbGliL3BvcnRhbCc7XG5leHBvcnQgKiBmcm9tICcuL2xpYi9yZW5kZXJlcic7XG5leHBvcnQgKiBmcm9tICcuL2xpYi9yb290cyc7XG5leHBvcnQgKiBmcm9tICcuL2xpYi9yb3V0ZWQtc2NlbmUnO1xuZXhwb3J0ICogZnJvbSAnLi9saWIvc3RvcmUnO1xuZXhwb3J0ICogZnJvbSAnLi9saWIvdXRpbHMvYXBwbHktcHJvcHMnO1xuZXhwb3J0ICogZnJvbSAnLi9saWIvdXRpbHMvYXR0YWNoJztcbmV4cG9ydCAqIGZyb20gJy4vbGliL3V0aWxzL2JlZm9yZS1yZW5kZXInO1xuZXhwb3J0ICogZnJvbSAnLi9saWIvdXRpbHMvaXMnO1xuZXhwb3J0ICogZnJvbSAnLi9saWIvdXRpbHMvbWFrZSc7XG5leHBvcnQgKiBmcm9tICcuL2xpYi91dGlscy9vYmplY3QtZXZlbnRzJztcbmV4cG9ydCAqIGZyb20gJy4vbGliL3V0aWxzL3BhcmFtZXRlcnMnO1xuZXhwb3J0ICogZnJvbSAnLi9saWIvdXRpbHMvcmVzb2x2ZS1yZWYnO1xuZXhwb3J0ICogZnJvbSAnLi9saWIvdXRpbHMvc2lnbmFsLXN0b3JlJztcbmV4cG9ydCAqIGZyb20gJy4vbGliL3V0aWxzL3VwZGF0ZSc7XG5cbmV4cG9ydCB0eXBlICogZnJvbSAnLi9saWIvdGhyZWUtdHlwZXMnO1xuZXhwb3J0IHR5cGUgKiBmcm9tICcuL2xpYi90eXBlcyc7XG4iXX0=
@@ -0,0 +1,86 @@
1
+ import { afterNextRender, booleanAttribute, ChangeDetectionStrategy, Component, CUSTOM_ELEMENTS_SCHEMA, Directive, inject, input, signal, untracked, viewChild, } from '@angular/core';
2
+ import { injectAutoEffect } from 'ngxtension/auto-effect';
3
+ import { Group } from 'three';
4
+ import { getLocalState } from '../instance';
5
+ import { extend } from '../renderer';
6
+ import { NgtObjectEvents, NgtObjectEventsHostDirective } from '../utils/object-events';
7
+ import * as i0 from "@angular/core";
8
+ import * as i1 from "../utils/object-events";
9
+ export class NgtSelection {
10
+ constructor() {
11
+ this.enabled = input(true, { alias: 'ngtSelection', transform: booleanAttribute });
12
+ this.selection = signal([]);
13
+ this.collection = this.selection.asReadonly();
14
+ }
15
+ select(...objects) {
16
+ this.selection.update((prev) => [...prev, ...objects]);
17
+ }
18
+ unselect(...objects) {
19
+ this.selection.update((prev) => prev.filter((selected) => !objects.includes(selected)));
20
+ }
21
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.1.3", ngImport: i0, type: NgtSelection, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
22
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "18.1.3", type: NgtSelection, isStandalone: true, selector: "[ngtSelection]", inputs: { enabled: { classPropertyName: "enabled", publicName: "ngtSelection", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0 }); }
23
+ }
24
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.1.3", ngImport: i0, type: NgtSelection, decorators: [{
25
+ type: Directive,
26
+ args: [{ standalone: true, selector: '[ngtSelection]' }]
27
+ }] });
28
+ export class NgtSelect {
29
+ constructor() {
30
+ this.enabled = input(false, { transform: booleanAttribute });
31
+ this.options = input({});
32
+ this.groupRef = viewChild.required('group');
33
+ extend({ Group });
34
+ const objectEvents = inject(NgtObjectEvents, { host: true });
35
+ const selection = inject(NgtSelection);
36
+ const autoEffect = injectAutoEffect();
37
+ afterNextRender(() => {
38
+ objectEvents.ngtObjectEvents.set(this.groupRef());
39
+ autoEffect(() => {
40
+ const group = this.groupRef().nativeElement;
41
+ const localState = getLocalState(group);
42
+ if (!localState)
43
+ return;
44
+ const enabled = this.enabled();
45
+ if (!enabled)
46
+ return;
47
+ const [collection] = [untracked(selection.collection), localState.objects()];
48
+ let changed = false;
49
+ const current = [];
50
+ group.traverse((child) => {
51
+ child.type === 'Mesh' && current.push(child);
52
+ if (collection.indexOf(child) === -1)
53
+ changed = true;
54
+ });
55
+ if (!changed)
56
+ return;
57
+ selection.select(...current);
58
+ return () => {
59
+ selection.unselect(...current);
60
+ };
61
+ }, { allowSignalWrites: true });
62
+ });
63
+ }
64
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.1.3", ngImport: i0, type: NgtSelect, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
65
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.2.0", version: "18.1.3", type: NgtSelect, isStandalone: true, selector: "ngt-select", inputs: { enabled: { classPropertyName: "enabled", publicName: "enabled", isSignal: true, isRequired: false, transformFunction: null }, options: { classPropertyName: "options", publicName: "options", isSignal: true, isRequired: false, transformFunction: null } }, viewQueries: [{ propertyName: "groupRef", first: true, predicate: ["group"], descendants: true, isSignal: true }], hostDirectives: [{ directive: i1.NgtObjectEvents, inputs: ["ngtObjectEvents", "ngtObjectEvents"], outputs: ["click", "click", "dblclick", "dblclick", "contextmenu", "contextmenu", "pointerup", "pointerup", "pointerdown", "pointerdown", "pointerover", "pointerover", "pointerout", "pointerout", "pointerenter", "pointerenter", "pointerleave", "pointerleave", "pointermove", "pointermove", "pointermissed", "pointermissed", "pointercancel", "pointercancel", "wheel", "wheel"] }], ngImport: i0, template: `
66
+ <ngt-group #group [parameters]="options()">
67
+ <ng-content />
68
+ </ngt-group>
69
+ `, isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
70
+ }
71
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.1.3", ngImport: i0, type: NgtSelect, decorators: [{
72
+ type: Component,
73
+ args: [{
74
+ selector: 'ngt-select',
75
+ standalone: true,
76
+ template: `
77
+ <ngt-group #group [parameters]="options()">
78
+ <ng-content />
79
+ </ngt-group>
80
+ `,
81
+ hostDirectives: [NgtObjectEventsHostDirective],
82
+ schemas: [CUSTOM_ELEMENTS_SCHEMA],
83
+ changeDetection: ChangeDetectionStrategy.OnPush,
84
+ }]
85
+ }], ctorParameters: () => [] });
86
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VsZWN0aW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9jb3JlL3NyYy9saWIvZGlyZWN0aXZlcy9zZWxlY3Rpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNOLGVBQWUsRUFDZixnQkFBZ0IsRUFDaEIsdUJBQXVCLEVBQ3ZCLFNBQVMsRUFDVCxzQkFBc0IsRUFDdEIsU0FBUyxFQUVULE1BQU0sRUFDTixLQUFLLEVBQ0wsTUFBTSxFQUNOLFNBQVMsRUFDVCxTQUFTLEdBQ1QsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDMUQsT0FBTyxFQUFFLEtBQUssRUFBWSxNQUFNLE9BQU8sQ0FBQztBQUN4QyxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQzVDLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFFckMsT0FBTyxFQUFFLGVBQWUsRUFBRSw0QkFBNEIsRUFBRSxNQUFNLHdCQUF3QixDQUFDOzs7QUFHdkYsTUFBTSxPQUFPLFlBQVk7SUFEekI7UUFFQyxZQUFPLEdBQUcsS0FBSyxDQUFDLElBQUksRUFBRSxFQUFFLEtBQUssRUFBRSxjQUFjLEVBQUUsU0FBUyxFQUFFLGdCQUFnQixFQUFFLENBQUMsQ0FBQztRQUV0RSxjQUFTLEdBQUcsTUFBTSxDQUF5QyxFQUFFLENBQUMsQ0FBQztRQUN2RSxlQUFVLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxVQUFVLEVBQUUsQ0FBQztLQVN6QztJQVBBLE1BQU0sQ0FBQyxHQUFHLE9BQStDO1FBQ3hELElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxDQUFDLEdBQUcsSUFBSSxFQUFFLEdBQUcsT0FBTyxDQUFDLENBQUMsQ0FBQztJQUN4RCxDQUFDO0lBRUQsUUFBUSxDQUFDLEdB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QkFBNEIsQ0FBQztvQkFDOUMsT0FBTyxFQUFFLENBQUMsc0JBQXNCLENBQUM7b0JBQ2pDLGVBQWUsRUFBRSx1QkFBdUIsQ0FBQyxNQUFNO2lCQUMvQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG5cdGFmdGVyTmV4dFJlbmRlcixcblx0Ym9vbGVhbkF0dHJpYnV0ZSxcblx0Q2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG5cdENvbXBvbmVudCxcblx0Q1VTVE9NX0VMRU1FTlRTX1NDSEVNQSxcblx0RGlyZWN0aXZlLFxuXHRFbGVtZW50UmVmLFxuXHRpbmplY3QsXG5cdGlucHV0LFxuXHRzaWduYWwsXG5cdHVudHJhY2tlZCxcblx0dmlld0NoaWxkLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IGluamVjdEF1dG9FZmZlY3QgfSBmcm9tICduZ3h0ZW5zaW9uL2F1dG8tZWZmZWN0JztcbmltcG9ydCB7IEdyb3VwLCBPYmplY3QzRCB9IGZyb20gJ3RocmVlJztcbmltcG9ydCB7IGdldExvY2FsU3RhdGUgfSBmcm9tICcuLi9pbnN0YW5jZSc7XG5pbXBvcnQgeyBleHRlbmQgfSBmcm9tICcuLi9yZW5kZXJlcic7XG5pbXBvcnQgeyBOZ3RHcm91cCB9IGZyb20gJy4uL3RocmVlLXR5cGVzJztcbmltcG9ydCB7IE5ndE9iamVjdEV2ZW50cywgTmd0T2JqZWN0RXZlbnRzSG9zdERpcmVjdGl2ZSB9IGZyb20gJy4uL3V0aWxzL29iamVjdC1ldmVudHMnO1xuXG5ARGlyZWN0aXZlKHsgc3RhbmRhbG9uZTogdHJ1ZSwgc2VsZWN0b3I6ICdbbmd0U2VsZWN0aW9uXScgfSlcbmV4cG9ydCBjbGFzcyBOZ3RTZWxlY3Rpb24ge1xuXHRlbmFibGVkID0gaW5wdXQodHJ1ZSwgeyBhbGlhczogJ25ndFNlbGVjdGlvbicsIHRyYW5zZm9ybTogYm9vbGVhbkF0dHJpYnV0ZSB9KTtcblxuXHRwcml2YXRlIHNlbGVjdGlvbiA9IHNpZ25hbDxBcnJheTxFbGVtZW50UmVmPE9iamVjdDNEPiB8IE9iamVjdDNEPj4oW10pO1xuXHRjb2xsZWN0aW9uID0gdGhpcy5zZWxlY3Rpb24uYXNSZWFkb25seSgpO1xuXG5cdHNlbGVjdCguLi5vYmplY3RzOiBBcnJheTxFbGVtZW50UmVmPE9iamVjdDNEPiB8IE9iamVjdDNEPikge1xuXHRcdHRoaXMuc2VsZWN0aW9uLnVwZGF0ZSgocHJldikgPT4gWy4uLnByZXYsIC4uLm9iamVjdHNdKTtcblx0fVxuXG5cdHVuc2VsZWN0KC4uLm9iamVjdHM6IEFycmF5PEVsZW1lbnRSZWY8T2JqZWN0M0Q+IHwgT2JqZWN0M0Q+KSB7XG5cdFx0dGhpcy5zZWxlY3Rpb24udXBkYXRlKChwcmV2KSA9PiBwcmV2LmZpbHRlcigoc2VsZWN0ZWQpID0+ICFvYmplY3RzLmluY2x1ZGVzKHNlbGVjdGVkKSkpO1xuXHR9XG59XG5cbkBDb21wb25lbnQoe1xuXHRzZWxlY3RvcjogJ25ndC1zZWxlY3QnLFxuXHRzdGFuZGFsb25lOiB0cnVlLFxuXHR0ZW1wbGF0ZTogYFxuXHRcdDxuZ3QtZ3JvdXAgI2dyb3VwIFtwYXJhbWV0ZXJzXT1cIm9wdGlvbnMoKVwiPlxuXHRcdFx0PG5nLWNvbnRlbnQgLz5cblx0XHQ8L25ndC1ncm91cD5cblx0YCxcblx0aG9zdERpcmVjdGl2ZXM6IFtOZ3RPYmplY3RFdmVudHNIb3N0RGlyZWN0aXZlXSxcblx0c2NoZW1hczogW0NVU1RPTV9FTEVNRU5UU19TQ0hFTUFdLFxuXHRjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbn0pXG5leHBvcnQgY2xhc3MgTmd0U2VsZWN0IHtcblx0ZW5hYmxlZCA9IGlucHV0KGZhbHNlLCB7IHRyYW5zZm9ybTogYm9vbGVhbkF0dHJpYnV0ZSB9KTtcblx0b3B0aW9ucyA9IGlucHV0KHt9IGFzIFBhcnRpYWw8Tmd0R3JvdXA+KTtcblxuXHRncm91cFJlZiA9IHZpZXdDaGlsZC5yZXF1aXJlZDxFbGVtZW50UmVmPEdyb3VwPj4oJ2dyb3VwJyk7XG5cblx0Y29uc3RydWN0b3IoKSB7XG5cdFx0ZXh0ZW5kKHsgR3JvdXAgfSk7XG5cblx0XHRjb25zdCBvYmplY3RFdmVudHMgPSBpbmplY3QoTmd0T2JqZWN0RXZlbnRzLCB7IGhvc3Q6IHRydWUgfSk7XG5cdFx0Y29uc3Qgc2VsZWN0aW9uID0gaW5qZWN0KE5ndFNlbGVjdGlvbik7XG5cdFx0Y29uc3QgYXV0b0VmZmVjdCA9IGluamVjdEF1dG9FZmZlY3QoKTtcblxuXHRcdGFmdGVyTmV4dFJlbmRlcigoKSA9PiB7XG5cdFx0XHRvYmplY3RFdmVudHMubmd0T2JqZWN0RXZlbnRzLnNldCh0aGlzLmdyb3VwUmVmKCkpO1xuXG5cdFx0XHRhdXRvRWZmZWN0KFxuXHRcdFx0XHQoKSA9PiB7XG5cdFx0XHRcdFx0Y29uc3QgZ3JvdXAgPSB0aGlzLmdyb3VwUmVmKCkubmF0aXZlRWxlbWVudDtcblx0XHRcdFx0XHRjb25zdCBsb2NhbFN0YXRlID0gZ2V0TG9jYWxTdGF0ZShncm91cCk7XG5cdFx0XHRcdFx0aWYgKCFsb2NhbFN0YXRlKSByZXR1cm47XG5cblx0XHRcdFx0XHRjb25zdCBlbmFibGVkID0gdGhpcy5lbmFibGVkKCk7XG5cdFx0XHRcdFx0aWYgKCFlbmFibGVkKSByZXR1cm47XG5cblx0XHRcdFx0XHRjb25zdCBbY29sbGVjdGlvbl0gPSBbdW50cmFja2VkKHNlbGVjdGlvbi5jb2xsZWN0aW9uKSwgbG9jYWxTdGF0ZS5vYmplY3RzKCldO1xuXHRcdFx0XHRcdGxldCBjaGFuZ2VkID0gZmFsc2U7XG5cdFx0XHRcdFx0Y29uc3QgY3VycmVudDogT2JqZWN0M0RbXSA9IFtdO1xuXHRcdFx0XHRcdGdyb3VwLnRyYXZlcnNlKChjaGlsZCkgPT4ge1xuXHRcdFx0XHRcdFx0Y2hpbGQudHlwZSA9PT0gJ01lc2gnICYmIGN1cnJlbnQucHVzaChjaGlsZCk7XG5cdFx0XHRcdFx0XHRpZiAoY29sbGVjdGlvbi5pbmRleE9mKGNoaWxkKSA9PT0gLTEpIGNoYW5nZWQgPSB0cnVlO1xuXHRcdFx0XHRcdH0pO1xuXG5cdFx0XHRcdFx0aWYgKCFjaGFuZ2VkKSByZXR1cm47XG5cblx0XHRcdFx0XHRzZWxlY3Rpb24uc2VsZWN0KC4uLmN1cnJlbnQpO1xuXHRcdFx0XHRcdHJldHVybiAoKSA9PiB7XG5cdFx0XHRcdFx0XHRzZWxlY3Rpb24udW5zZWxlY3QoLi4uY3VycmVudCk7XG5cdFx0XHRcdFx0fTtcblx0XHRcdFx0fSxcblx0XHRcdFx0eyBhbGxvd1NpZ25hbFdyaXRlczogdHJ1ZSB9LFxuXHRcdFx0KTtcblx0XHR9KTtcblx0fVxufVxuIl19
@@ -0,0 +1,67 @@
1
+ import { DOCUMENT } from '@angular/common';
2
+ import { inject, Pipe } from '@angular/core';
3
+ import * as i0 from "@angular/core";
4
+ export class NgtHexify {
5
+ constructor() {
6
+ this.document = inject(DOCUMENT, { optional: true });
7
+ }
8
+ /**
9
+ * transforms a:
10
+ * - hex string to a hex number
11
+ * - rgb string to a hex number
12
+ * - rgba string to a hex number
13
+ * - css color string to a hex number
14
+ *
15
+ * always default to black if failed
16
+ * @param value
17
+ */
18
+ transform(value) {
19
+ if (value == null)
20
+ return 0x000000;
21
+ if (value.startsWith('#')) {
22
+ return this.hexStringToNumber(value);
23
+ }
24
+ if (!this.ctx) {
25
+ this.ctx = this.document?.createElement('canvas').getContext('2d');
26
+ }
27
+ if (!this.ctx)
28
+ return 0x000000;
29
+ this.ctx.fillStyle = value;
30
+ const computedValue = this.ctx.fillStyle;
31
+ if (computedValue.startsWith('#')) {
32
+ return this.hexStringToNumber(computedValue);
33
+ }
34
+ if (!computedValue.startsWith('rgba'))
35
+ return 0x000000;
36
+ const regex = /rgba?\((\d+),\s*(\d+),\s*(\d+),?\s*(\d*\.?\d+)?\)/;
37
+ const match = computedValue.match(regex);
38
+ if (!match)
39
+ return 0x000000;
40
+ const r = parseInt(match[1], 10);
41
+ const g = parseInt(match[2], 10);
42
+ const b = parseInt(match[3], 10);
43
+ const a = match[4] ? parseFloat(match[4]) : 1.0;
44
+ // Convert the components to hex strings
45
+ const hexR = this.componentToHex(r);
46
+ const hexG = this.componentToHex(g);
47
+ const hexB = this.componentToHex(b);
48
+ const hexA = this.componentToHex(Math.round(a * 255));
49
+ // Combine the hex components into a single hex string
50
+ const hex = `#${hexR}${hexG}${hexB}${hexA}`;
51
+ return this.hexStringToNumber(hex);
52
+ }
53
+ hexStringToNumber(hexString) {
54
+ return parseInt(hexString.replace('#', ''), 16);
55
+ }
56
+ componentToHex(component) {
57
+ const hex = component.toString(16);
58
+ return hex.length === 1 ? '0' + hex : hex;
59
+ }
60
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.1.3", ngImport: i0, type: NgtHexify, deps: [], target: i0.ɵɵFactoryTarget.Pipe }); }
61
+ static { this.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "18.1.3", ngImport: i0, type: NgtHexify, isStandalone: true, name: "hexify" }); }
62
+ }
63
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.1.3", ngImport: i0, type: NgtHexify, decorators: [{
64
+ type: Pipe,
65
+ args: [{ name: 'hexify', pure: true, standalone: true }]
66
+ }] });
67
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGV4aWZ5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9jb3JlL3NyYy9saWIvcGlwZXMvaGV4aWZ5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMzQyxPQUFPLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxNQUFNLGVBQWUsQ0FBQzs7QUFHN0MsTUFBTSxPQUFPLFNBQVM7SUFEdEI7UUFFUyxhQUFRLEdBQUcsTUFBTSxDQUFDLFFBQVEsRUFBRSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO0tBK0R4RDtJQTVEQTs7Ozs7Ozs7O09BU0c7SUFDSCxTQUFTLENBQUMsS0FBYTtRQUN0QixJQUFJLEtBQUssSUFBSSxJQUFJO1lBQUUsT0FBTyxRQUFRLENBQUM7UUFFbkMsSUFBSSxLQUFLLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDM0IsT0FBTyxJQUFJLENBQUMsaUJBQWlCLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDdEMsQ0FBQztRQUVELElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7WUFDZixJQUFJLENBQUMsR0FBRyxHQUFHLElBQUksQ0FBQyxRQUFRLEVBQUUsYUFBYSxDQUFDLFFBQVEsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNwRSxDQUFDO1FBRUQsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHO1lBQUUsT0FBTyxRQUFRLENBQUM7UUFFL0IsSUFBSSxDQUFDLEdBQUcsQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFDO1FBQzNCLE1BQU0sYUFBYSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDO1FBRXpDLElBQUksYUFBYSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQ25DLE9BQU8sSUFBSSxDQUFDLGlCQUFpQixDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBQzlDLENBQUM7UUFFRCxJQUFJLENBQUMsYUFBYSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUM7WUFBRSxPQUFPLFFBQVEsQ0FBQztRQUV2RCxNQUFNLEtBQUssR0FBRyxtREFBbUQsQ0FBQztRQUNsRSxNQUFNLEtBQUssR0FBRyxhQUFhLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3pDLElBQUksQ0FBQyxLQUFLO1lBQUUsT0FBTyxRQUFRLENBQUM7UUFFNUIsTUFBTSxDQUFDLEdBQUcsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUNqQyxNQUFNLENBQUMsR0FBRyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQ2pDLE1BQU0sQ0FBQyxHQUFHLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDakMsTUFBTSxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQztRQUVoRCx3Q0FBd0M7UUFDeEMsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNwQyxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3BDLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDcEMsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBRXRELHNEQUFzRDtRQUN0RCxNQUFNLEdBQUcsR0FBRyxJQUFJLElBQUksR0FBRyxJQUFJLEdBQUcsSUFBSSxHQUFHLElBQUksRUFBRSxDQUFDO1FBQzVDLE9BQU8sSUFBSSxDQUFDLGlCQUFpQixDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ3BDLENBQUM7SUFFTyxpQkFBaUIsQ0FBQyxTQUFpQjtRQUMxQyxPQUFPLFFBQVEsQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztJQUNqRCxDQUFDO0lBRU8sY0FBYyxDQUFDLFNBQWlCO1FBQ3ZDLE1BQU0sR0FBRyxHQUFHLFNBQVMsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDbkMsT0FBTyxHQUFHLENBQUMsTUFBTSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDO0lBQzNDLENBQUM7OEdBL0RXLFNBQVM7NEdBQVQsU0FBUzs7MkZBQVQsU0FBUztrQkFEckIsSUFBSTttQkFBQyxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUUsSUFBSSxFQUFFIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRE9DVU1FTlQgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgaW5qZWN0LCBQaXBlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbkBQaXBlKHsgbmFtZTogJ2hleGlmeScsIHB1cmU6IHRydWUsIHN0YW5kYWxvbmU6IHRydWUgfSlcbmV4cG9ydCBjbGFzcyBOZ3RIZXhpZnkge1xuXHRwcml2YXRlIGRvY3VtZW50ID0gaW5qZWN0KERPQ1VNRU5ULCB7IG9wdGlvbmFsOiB0cnVlIH0pO1xuXHRwcml2YXRlIGN0eD86IENhbnZhc1JlbmRlcmluZ0NvbnRleHQyRCB8IG51bGw7XG5cblx0LyoqXG5cdCAqIHRyYW5zZm9ybXMgYTpcblx0ICogLSBoZXggc3RyaW5nIHRvIGEgaGV4IG51bWJlclxuXHQgKiAtIHJnYiBzdHJpbmcgdG8gYSBoZXggbnVtYmVyXG5cdCAqIC0gcmdiYSBzdHJpbmcgdG8gYSBoZXggbnVtYmVyXG5cdCAqIC0gY3NzIGNvbG9yIHN0cmluZyB0byBhIGhleCBudW1iZXJcblx0ICpcblx0ICogYWx3YXlzIGRlZmF1bHQgdG8gYmxhY2sgaWYgZmFpbGVkXG5cdCAqIEBwYXJhbSB2YWx1ZVxuXHQgKi9cblx0dHJhbnNmb3JtKHZhbHVlOiBzdHJpbmcpOiBudW1iZXIge1xuXHRcdGlmICh2YWx1ZSA9PSBudWxsKSByZXR1cm4gMHgwMDAwMDA7XG5cblx0XHRpZiAodmFsdWUuc3RhcnRzV2l0aCgnIycpKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5oZXhTdHJpbmdUb051bWJlcih2YWx1ZSk7XG5cdFx0fVxuXG5cdFx0aWYgKCF0aGlzLmN0eCkge1xuXHRcdFx0dGhpcy5jdHggPSB0aGlzLmRvY3VtZW50Py5jcmVhdGVFbGVtZW50KCdjYW52YXMnKS5nZXRDb250ZXh0KCcyZCcpO1xuXHRcdH1cblxuXHRcdGlmICghdGhpcy5jdHgpIHJldHVybiAweDAwMDAwMDtcblxuXHRcdHRoaXMuY3R4LmZpbGxTdHlsZSA9IHZhbHVlO1xuXHRcdGNvbnN0IGNvbXB1dGVkVmFsdWUgPSB0aGlzLmN0eC5maWxsU3R5bGU7XG5cblx0XHRpZiAoY29tcHV0ZWRWYWx1ZS5zdGFydHNXaXRoKCcjJykpIHtcblx0XHRcdHJldHVybiB0aGlzLmhleFN0cmluZ1RvTnVtYmVyKGNvbXB1dGVkVmFsdWUpO1xuXHRcdH1cblxuXHRcdGlmICghY29tcHV0ZWRWYWx1ZS5zdGFydHNXaXRoKCdyZ2JhJykpIHJldHVybiAweDAwMDAwMDtcblxuXHRcdGNvbnN0IHJlZ2V4ID0gL3JnYmE/XFwoKFxcZCspLFxccyooXFxkKyksXFxzKihcXGQrKSw/XFxzKihcXGQqXFwuP1xcZCspP1xcKS87XG5cdFx0Y29uc3QgbWF0Y2ggPSBjb21wdXRlZFZhbHVlLm1hdGNoKHJlZ2V4KTtcblx0XHRpZiAoIW1hdGNoKSByZXR1cm4gMHgwMDAwMDA7XG5cblx0XHRjb25zdCByID0gcGFyc2VJbnQobWF0Y2hbMV0sIDEwKTtcblx0XHRjb25zdCBnID0gcGFyc2VJbnQobWF0Y2hbMl0sIDEwKTtcblx0XHRjb25zdCBiID0gcGFyc2VJbnQobWF0Y2hbM10sIDEwKTtcblx0XHRjb25zdCBhID0gbWF0Y2hbNF0gPyBwYXJzZUZsb2F0KG1hdGNoWzRdKSA6IDEuMDtcblxuXHRcdC8vIENvbnZlcnQgdGhlIGNvbXBvbmVudHMgdG8gaGV4IHN0cmluZ3Ncblx0XHRjb25zdCBoZXhSID0gdGhpcy5jb21wb25lbnRUb0hleChyKTtcblx0XHRjb25zdCBoZXhHID0gdGhpcy5jb21wb25lbnRUb0hleChnKTtcblx0XHRjb25zdCBoZXhCID0gdGhpcy5jb21wb25lbnRUb0hleChiKTtcblx0XHRjb25zdCBoZXhBID0gdGhpcy5jb21wb25lbnRUb0hleChNYXRoLnJvdW5kKGEgKiAyNTUpKTtcblxuXHRcdC8vIENvbWJpbmUgdGhlIGhleCBjb21wb25lbnRzIGludG8gYSBzaW5nbGUgaGV4IHN0cmluZ1xuXHRcdGNvbnN0IGhleCA9IGAjJHtoZXhSfSR7aGV4R30ke2hleEJ9JHtoZXhBfWA7XG5cdFx0cmV0dXJuIHRoaXMuaGV4U3RyaW5nVG9OdW1iZXIoaGV4KTtcblx0fVxuXG5cdHByaXZhdGUgaGV4U3RyaW5nVG9OdW1iZXIoaGV4U3RyaW5nOiBzdHJpbmcpOiBudW1iZXIge1xuXHRcdHJldHVybiBwYXJzZUludChoZXhTdHJpbmcucmVwbGFjZSgnIycsICcnKSwgMTYpO1xuXHR9XG5cblx0cHJpdmF0ZSBjb21wb25lbnRUb0hleChjb21wb25lbnQ6IG51bWJlcik6IHN0cmluZyB7XG5cdFx0Y29uc3QgaGV4ID0gY29tcG9uZW50LnRvU3RyaW5nKDE2KTtcblx0XHRyZXR1cm4gaGV4Lmxlbmd0aCA9PT0gMSA/ICcwJyArIGhleCA6IGhleDtcblx0fVxufVxuIl19
@@ -1,7 +1,70 @@
1
- import { afterNextRender, DestroyRef, inject, Renderer2 } from '@angular/core';
1
+ import { afterNextRender, DestroyRef, Directive, inject, Injector, model, output, Renderer2, } from '@angular/core';
2
2
  import { assertInjector } from 'ngxtension/assert-injector';
3
3
  import { injectAutoEffect } from 'ngxtension/auto-effect';
4
4
  import { resolveRef } from './resolve-ref';
5
+ import * as i0 from "@angular/core";
6
+ export class NgtObjectEvents {
7
+ constructor() {
8
+ this.click = output();
9
+ this.dblclick = output();
10
+ this.contextmenu = output();
11
+ this.pointerup = output();
12
+ this.pointerdown = output();
13
+ this.pointerover = output();
14
+ this.pointerout = output();
15
+ this.pointerenter = output();
16
+ this.pointerleave = output();
17
+ this.pointermove = output();
18
+ this.pointermissed = output();
19
+ this.pointercancel = output();
20
+ this.wheel = output();
21
+ // NOTE: we use model here to allow for the hostDirective host to set this value
22
+ this.ngtObjectEvents = model();
23
+ const injector = inject(Injector);
24
+ afterNextRender(() => {
25
+ injectObjectEvents(this.ngtObjectEvents, {
26
+ click: (event) => this.click.emit(event),
27
+ dblclick: (event) => this.dblclick.emit(event),
28
+ contextmenu: (event) => this.contextmenu.emit(event),
29
+ pointerup: (event) => this.pointerup.emit(event),
30
+ pointerdown: (event) => this.pointerdown.emit(event),
31
+ pointerover: (event) => this.pointerover.emit(event),
32
+ pointerout: (event) => this.pointerout.emit(event),
33
+ pointerenter: (event) => this.pointerenter.emit(event),
34
+ pointerleave: (event) => this.pointerleave.emit(event),
35
+ pointermove: (event) => this.pointermove.emit(event),
36
+ pointermissed: (event) => this.pointermissed.emit(event),
37
+ pointercancel: (event) => this.pointercancel.emit(event),
38
+ wheel: (event) => this.wheel.emit(event),
39
+ }, { injector });
40
+ });
41
+ }
42
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.1.3", ngImport: i0, type: NgtObjectEvents, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
43
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "18.1.3", type: NgtObjectEvents, isStandalone: true, selector: "[ngtObjectEvents]", inputs: { ngtObjectEvents: { classPropertyName: "ngtObjectEvents", publicName: "ngtObjectEvents", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { click: "click", dblclick: "dblclick", contextmenu: "contextmenu", pointerup: "pointerup", pointerdown: "pointerdown", pointerover: "pointerover", pointerout: "pointerout", pointerenter: "pointerenter", pointerleave: "pointerleave", pointermove: "pointermove", pointermissed: "pointermissed", pointercancel: "pointercancel", wheel: "wheel", ngtObjectEvents: "ngtObjectEventsChange" }, ngImport: i0 }); }
44
+ }
45
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.1.3", ngImport: i0, type: NgtObjectEvents, decorators: [{
46
+ type: Directive,
47
+ args: [{ standalone: true, selector: '[ngtObjectEvents]' }]
48
+ }], ctorParameters: () => [] });
49
+ export const NgtObjectEventsHostDirective = {
50
+ directive: NgtObjectEvents,
51
+ inputs: ['ngtObjectEvents'],
52
+ outputs: [
53
+ 'click',
54
+ 'dblclick',
55
+ 'contextmenu',
56
+ 'pointerup',
57
+ 'pointerdown',
58
+ 'pointerover',
59
+ 'pointerout',
60
+ 'pointerenter',
61
+ 'pointerleave',
62
+ 'pointermove',
63
+ 'pointermissed',
64
+ 'pointercancel',
65
+ 'wheel',
66
+ ],
67
+ };
5
68
  export function injectObjectEvents(target, events, { injector } = {}) {
6
69
  return assertInjector(injectObjectEvents, injector, () => {
7
70
  const autoEffect = injectAutoEffect();
@@ -26,4 +89,4 @@ export function injectObjectEvents(target, events, { injector } = {}) {
26
89
  return cleanUps;
27
90
  });
28
91
  }
29
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib2JqZWN0LWV2ZW50cy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvY29yZS9zcmMvbGliL3V0aWxzL29iamVjdC1ldmVudHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGVBQWUsRUFBRSxVQUFVLEVBQWMsTUFBTSxFQUFZLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNyRyxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDNUQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFJMUQsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUUzQyxNQUFNLFVBQVUsa0JBQWtCLENBQ2pDLE1BQWdFLEVBQ2hFLE1BRUMsRUFDRCxFQUFFLFFBQVEsS0FBOEIsRUFBRTtJQUUxQyxPQUFPLGNBQWMsQ0FBQyxrQkFBa0IsRUFBRSxRQUFRLEVBQUUsR0FBRyxFQUFFO1FBQ3hELE1BQU0sVUFBVSxHQUFHLGdCQUFnQixFQUFFLENBQUM7UUFDdEMsTUFBTSxRQUFRLEdBQUcsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBRW5DLE1BQU0sUUFBUSxHQUFzQixFQUFFLENBQUM7UUFFdkMsZUFBZSxDQUFDLEdBQUcsRUFBRTtZQUNwQixVQUFVLENBQUMsR0FBRyxFQUFFO2dCQUNmLE1BQU0sU0FBUyxHQUFHLFVBQVUsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDO2dCQUN2QyxJQUFJLENBQUMsU0FBUztvQkFBRSxPQUFPO2dCQUV2QixNQUFNLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsU0FBUyxFQUFFLFlBQVksQ0FBQyxFQUFFLEVBQUU7b0JBQzVELFFBQVEsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxTQUFTLEVBQUUsU0FBUyxFQUFFLFlBQVksQ0FBQyxDQUFDLENBQUM7Z0JBQ3BFLENBQUMsQ0FBQyxDQUFDO2dCQUVILE9BQU8sR0FBRyxFQUFFO29CQUNYLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUM7Z0JBQzFDLENBQUMsQ0FBQztZQUNILENBQUMsQ0FBQyxDQUFDO1FBQ0osQ0FBQyxDQUFDLENBQUM7UUFFSCxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRTtZQUNqQyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO1FBQzFDLENBQUMsQ0FBQyxDQUFDO1FBRUgsT0FBTyxRQUFRLENBQUM7SUFDakIsQ0FBQyxDQUFDLENBQUM7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgYWZ0ZXJOZXh0UmVuZGVyLCBEZXN0cm95UmVmLCBFbGVtZW50UmVmLCBpbmplY3QsIEluamVjdG9yLCBSZW5kZXJlcjIgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IGFzc2VydEluamVjdG9yIH0gZnJvbSAnbmd4dGVuc2lvbi9hc3NlcnQtaW5qZWN0b3InO1xuaW1wb3J0IHsgaW5qZWN0QXV0b0VmZmVjdCB9IGZyb20gJ25neHRlbnNpb24vYXV0by1lZmZlY3QnO1xuaW1wb3J0IHsgT2JqZWN0M0QgfSBmcm9tICd0aHJlZSc7XG5pbXBvcnQgeyBzdXBwb3J0ZWRFdmVudHMgfSBmcm9tICcuLi9kb20vZXZlbnRzJztcbmltcG9ydCB7IE5ndERvbUV2ZW50LCBOZ3RUaHJlZUV2ZW50IH0gZnJvbSAnLi4vdHlwZXMnO1xuaW1wb3J0IHsgcmVzb2x2ZVJlZiB9IGZyb20gJy4vcmVzb2x2ZS1yZWYnO1xuXG5leHBvcnQgZnVuY3Rpb24gaW5qZWN0T2JqZWN0RXZlbnRzKFxuXHR0YXJnZXQ6ICgpID0+IEVsZW1lbnRSZWY8T2JqZWN0M0Q+IHwgT2JqZWN0M0QgfCBudWxsIHwgdW5kZWZpbmVkLFxuXHRldmVudHM6IHtcblx0XHRbSyBpbiAodHlwZW9mIHN1cHBvcnRlZEV2ZW50cylbbnVtYmVyXV0/OiAoZXZlbnQ6IE5ndFRocmVlRXZlbnQ8Tmd0RG9tRXZlbnQ+KSA9PiB2b2lkO1xuXHR9LFxuXHR7IGluamVjdG9yIH06IHsgaW5qZWN0b3I/OiBJbmplY3RvciB9ID0ge30sXG4pIHtcblx0cmV0dXJuIGFzc2VydEluamVjdG9yKGluamVjdE9iamVjdEV2ZW50cywgaW5qZWN0b3IsICgpID0+IHtcblx0XHRjb25zdCBhdXRvRWZmZWN0ID0gaW5qZWN0QXV0b0VmZmVjdCgpO1xuXHRcdGNvbnN0IHJlbmRlcmVyID0gaW5qZWN0KFJlbmRlcmVyMik7XG5cblx0XHRjb25zdCBjbGVhblVwczogQXJyYXk8KCkgPT4gdm9pZD4gPSBbXTtcblxuXHRcdGFmdGVyTmV4dFJlbmRlcigoKSA9PiB7XG5cdFx0XHRhdXRvRWZmZWN0KCgpID0+IHtcblx0XHRcdFx0Y29uc3QgdGFyZ2V0UmVmID0gcmVzb2x2ZVJlZih0YXJnZXQoKSk7XG5cdFx0XHRcdGlmICghdGFyZ2V0UmVmKSByZXR1cm47XG5cblx0XHRcdFx0T2JqZWN0LmVudHJpZXMoZXZlbnRzKS5mb3JFYWNoKChbZXZlbnROYW1lLCBldmVudEhhbmRsZXJdKSA9PiB7XG5cdFx0XHRcdFx0Y2xlYW5VcHMucHVzaChyZW5kZXJlci5saXN0ZW4odGFyZ2V0UmVmLCBldmVudE5hbWUsIGV2ZW50SGFuZGxlcikpO1xuXHRcdFx0XHR9KTtcblxuXHRcdFx0XHRyZXR1cm4gKCkgPT4ge1xuXHRcdFx0XHRcdGNsZWFuVXBzLmZvckVhY2goKGNsZWFuVXApID0+IGNsZWFuVXAoKSk7XG5cdFx0XHRcdH07XG5cdFx0XHR9KTtcblx0XHR9KTtcblxuXHRcdGluamVjdChEZXN0cm95UmVmKS5vbkRlc3Ryb3koKCkgPT4ge1xuXHRcdFx0Y2xlYW5VcHMuZm9yRWFjaCgoY2xlYW5VcCkgPT4gY2xlYW5VcCgpKTtcblx0XHR9KTtcblxuXHRcdHJldHVybiBjbGVhblVwcztcblx0fSk7XG59XG4iXX0=
92
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib2JqZWN0LWV2ZW50cy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvY29yZS9zcmMvbGliL3V0aWxzL29iamVjdC1ldmVudHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNOLGVBQWUsRUFDZixVQUFVLEVBQ1YsU0FBUyxFQUVULE1BQU0sRUFDTixRQUFRLEVBQ1IsS0FBSyxFQUNMLE1BQU0sRUFDTixTQUFTLEdBQ1QsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQzVELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBSTFELE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7O0FBRzNDLE1BQU0sT0FBTyxlQUFlO0lBa0IzQjtRQWpCQSxVQUFLLEdBQUcsTUFBTSxFQUE2QixDQUFDO1FBQzVDLGFBQVEsR0FBRyxNQUFNLEVBQTZCLENBQUM7UUFDL0MsZ0JBQVcsR0FBRyxNQUFNLEVBQTZCLENBQUM7UUFDbEQsY0FBUyxHQUFHLE1BQU0sRUFBK0IsQ0FBQztRQUNsRCxnQkFBVyxHQUFHLE1BQU0sRUFBK0IsQ0FBQztRQUNwRCxnQkFBVyxHQUFHLE1BQU0sRUFBK0IsQ0FBQztRQUNwRCxlQUFVLEdBQUcsTUFBTSxFQUErQixDQUFDO1FBQ25ELGlCQUFZLEdBQUcsTUFBTSxFQUErQixDQUFDO1FBQ3JELGlCQUFZLEdBQUcsTUFBTSxFQUErQixDQUFDO1FBQ3JELGdCQUFXLEdBQUcsTUFBTSxFQUErQixDQUFDO1FBQ3BELGtCQUFhLEdBQUcsTUFBTSxFQUE2QixDQUFDO1FBQ3BELGtCQUFhLEdBQUcsTUFBTSxFQUErQixDQUFDO1FBQ3RELFVBQUssR0FBRyxNQUFNLEVBQTZCLENBQUM7UUFFNUMsZ0ZBQWdGO1FBQ2hGLG9CQUFlLEdBQUcsS0FBSyxFQUFzRCxDQUFDO1FBRzdFLE1BQU0s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QUVuQyxNQUFNLFFBQVEsR0FBc0IsRUFBRSxDQUFDO1FBRXZDLGVBQWUsQ0FBQyxHQUFHLEVBQUU7WUFDcEIsVUFBVSxDQUFDLEdBQUcsRUFBRTtnQkFDZixNQUFNLFNBQVMsR0FBRyxVQUFVLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQztnQkFDdkMsSUFBSSxDQUFDLFNBQVM7b0JBQUUsT0FBTztnQkFFdkIsTUFBTSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLFNBQVMsRUFBRSxZQUFZLENBQUMsRUFBRSxFQUFFO29CQUM1RCxRQUFRLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsU0FBUyxFQUFFLFNBQVMsRUFBRSxZQUFZLENBQUMsQ0FBQyxDQUFDO2dCQUNwRSxDQUFDLENBQUMsQ0FBQztnQkFFSCxPQUFPLEdBQUcsRUFBRTtvQkFDWCxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO2dCQUMxQyxDQUFDLENBQUM7WUFDSCxDQUFDLENBQUMsQ0FBQztRQUNKLENBQUMsQ0FBQyxDQUFDO1FBRUgsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxHQUFHLEVBQUU7WUFDakMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQztRQUMxQyxDQUFDLENBQUMsQ0FBQztRQUVILE9BQU8sUUFBUSxDQUFDO0lBQ2pCLENBQUMsQ0FBQyxDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG5cdGFmdGVyTmV4dFJlbmRlcixcblx0RGVzdHJveVJlZixcblx0RGlyZWN0aXZlLFxuXHRFbGVtZW50UmVmLFxuXHRpbmplY3QsXG5cdEluamVjdG9yLFxuXHRtb2RlbCxcblx0b3V0cHV0LFxuXHRSZW5kZXJlcjIsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgYXNzZXJ0SW5qZWN0b3IgfSBmcm9tICduZ3h0ZW5zaW9uL2Fzc2VydC1pbmplY3Rvcic7XG5pbXBvcnQgeyBpbmplY3RBdXRvRWZmZWN0IH0gZnJvbSAnbmd4dGVuc2lvbi9hdXRvLWVmZmVjdCc7XG5pbXBvcnQgeyBPYmplY3QzRCB9IGZyb20gJ3RocmVlJztcbmltcG9ydCB7IHN1cHBvcnRlZEV2ZW50cyB9IGZyb20gJy4uL2RvbS9ldmVudHMnO1xuaW1wb3J0IHsgTmd0RG9tRXZlbnQsIE5ndFRocmVlRXZlbnQgfSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQgeyByZXNvbHZlUmVmIH0gZnJvbSAnLi9yZXNvbHZlLXJlZic7XG5cbkBEaXJlY3RpdmUoeyBzdGFuZGFsb25lOiB0cnVlLCBzZWxlY3RvcjogJ1tuZ3RPYmplY3RFdmVudHNdJyB9KVxuZXhwb3J0IGNsYXNzIE5ndE9iamVjdEV2ZW50cyB7XG5cdGNsaWNrID0gb3V0cHV0PE5ndFRocmVlRXZlbnQ8TW91c2VFdmVudD4+KCk7XG5cdGRibGNsaWNrID0gb3V0cHV0PE5ndFRocmVlRXZlbnQ8TW91c2VFdmVudD4+KCk7XG5cdGNvbnRleHRtZW51ID0gb3V0cHV0PE5ndFRocmVlRXZlbnQ8TW91c2VFdmVudD4+KCk7XG5cdHBvaW50ZXJ1cCA9IG91dHB1dDxOZ3RUaHJlZUV2ZW50PFBvaW50ZXJFdmVudD4+KCk7XG5cdHBvaW50ZXJkb3duID0gb3V0cHV0PE5ndFRocmVlRXZlbnQ8UG9pbnRlckV2ZW50Pj4oKTtcblx0cG9pbnRlcm92ZXIgPSBvdXRwdXQ8Tmd0VGhyZWVFdmVudDxQb2ludGVyRXZlbnQ+PigpO1xuXHRwb2ludGVyb3V0ID0gb3V0cHV0PE5ndFRocmVlRXZlbnQ8UG9pbnRlckV2ZW50Pj4oKTtcblx0cG9pbnRlcmVudGVyID0gb3V0cHV0PE5ndFRocmVlRXZlbnQ8UG9pbnRlckV2ZW50Pj4oKTtcblx0cG9pbnRlcmxlYXZlID0gb3V0cHV0PE5ndFRocmVlRXZlbnQ8UG9pbnRlckV2ZW50Pj4oKTtcblx0cG9pbnRlcm1vdmUgPSBvdXRwdXQ8Tmd0VGhyZWVFdmVudDxQb2ludGVyRXZlbnQ+PigpO1xuXHRwb2ludGVybWlzc2VkID0gb3V0cHV0PE5ndFRocmVlRXZlbnQ8TW91c2VFdmVudD4+KCk7XG5cdHBvaW50ZXJjYW5jZWwgPSBvdXRwdXQ8Tmd0VGhyZWVFdmVudDxQb2ludGVyRXZlbnQ+PigpO1xuXHR3aGVlbCA9IG91dHB1dDxOZ3RUaHJlZUV2ZW50PFdoZWVsRXZlbnQ+PigpO1xuXG5cdC8vIE5PVEU6IHdlIHVzZSBtb2RlbCBoZXJlIHRvIGFsbG93IGZvciB0aGUgaG9zdERpcmVjdGl2ZSBob3N0IHRvIHNldCB0aGlzIHZhbHVlXG5cdG5ndE9iamVjdEV2ZW50cyA9IG1vZGVsPEVsZW1lbnRSZWY8T2JqZWN0M0Q+IHwgT2JqZWN0M0QgfCBudWxsIHwgdW5kZWZpbmVkPigpO1xuXG5cdGNvbnN0cnVjdG9yKCkge1xuXHRcdGNvbnN0IGluamVjdG9yID0gaW5qZWN0KEluamVjdG9yKTtcblxuXHRcdGFmdGVyTmV4dFJlbmRlcigoKSA9PiB7XG5cdFx0XHRpbmplY3RPYmplY3RFdmVudHMoXG5cdFx0XHRcdHRoaXMubmd0T2JqZWN0RXZlbnRzLFxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0Y2xpY2s6IChldmVudCkgPT4gdGhpcy5jbGljay5lbWl0KGV2ZW50KSxcblx0XHRcdFx0XHRkYmxjbGljazogKGV2ZW50KSA9PiB0aGlzLmRibGNsaWNrLmVtaXQoZXZlbnQpLFxuXHRcdFx0XHRcdGNvbnRleHRtZW51OiAoZXZlbnQpID0+IHRoaXMuY29udGV4dG1lbnUuZW1pdChldmVudCksXG5cdFx0XHRcdFx0cG9pbnRlcnVwOiAoZXZlbnQpID0+IHRoaXMucG9pbnRlcnVwLmVtaXQoZXZlbnQgYXMgTmd0VGhyZWVFdmVudDxQb2ludGVyRXZlbnQ+KSxcblx0XHRcdFx0XHRwb2ludGVyZG93bjogKGV2ZW50KSA9PiB0aGlzLnBvaW50ZXJkb3duLmVtaXQoZXZlbnQgYXMgTmd0VGhyZWVFdmVudDxQb2ludGVyRXZlbnQ+KSxcblx0XHRcdFx0XHRwb2ludGVyb3ZlcjogKGV2ZW50KSA9PiB0aGlzLnBvaW50ZXJvdmVyLmVtaXQoZXZlbnQgYXMgTmd0VGhyZWVFdmVudDxQb2ludGVyRXZlbnQ+KSxcblx0XHRcdFx0XHRwb2ludGVyb3V0OiAoZXZlbnQpID0+IHRoaXMucG9pbnRlcm91dC5lbWl0KGV2ZW50IGFzIE5ndFRocmVlRXZlbnQ8UG9pbnRlckV2ZW50PiksXG5cdFx0XHRcdFx0cG9pbnRlcmVudGVyOiAoZXZlbnQpID0+IHRoaXMucG9pbnRlcmVudGVyLmVtaXQoZXZlbnQgYXMgTmd0VGhyZWVFdmVudDxQb2ludGVyRXZlbnQ+KSxcblx0XHRcdFx0XHRwb2ludGVybGVhdmU6IChldmVudCkgPT4gdGhpcy5wb2ludGVybGVhdmUuZW1pdChldmVudCBhcyBOZ3RUaHJlZUV2ZW50PFBvaW50ZXJFdmVudD4pLFxuXHRcdFx0XHRcdHBvaW50ZXJtb3ZlOiAoZXZlbnQpID0+IHRoaXMucG9pbnRlcm1vdmUuZW1pdChldmVudCBhcyBOZ3RUaHJlZUV2ZW50PFBvaW50ZXJFdmVudD4pLFxuXHRcdFx0XHRcdHBvaW50ZXJtaXNzZWQ6IChldmVudCkgPT4gdGhpcy5wb2ludGVybWlzc2VkLmVtaXQoZXZlbnQpLFxuXHRcdFx0XHRcdHBvaW50ZXJjYW5jZWw6IChldmVudCkgPT4gdGhpcy5wb2ludGVyY2FuY2VsLmVtaXQoZXZlbnQgYXMgTmd0VGhyZWVFdmVudDxQb2ludGVyRXZlbnQ+KSxcblx0XHRcdFx0XHR3aGVlbDogKGV2ZW50KSA9PiB0aGlzLndoZWVsLmVtaXQoZXZlbnQgYXMgTmd0VGhyZWVFdmVudDxXaGVlbEV2ZW50PiksXG5cdFx0XHRcdH0sXG5cdFx0XHRcdHsgaW5qZWN0b3IgfSxcblx0XHRcdCk7XG5cdFx0fSk7XG5cdH1cbn1cblxuZXhwb3J0IGNvbnN0IE5ndE9iamVjdEV2ZW50c0hvc3REaXJlY3RpdmUgPSB7XG5cdGRpcmVjdGl2ZTogTmd0T2JqZWN0RXZlbnRzLFxuXHRpbnB1dHM6IFsnbmd0T2JqZWN0RXZlbnRzJ10sXG5cdG91dHB1dHM6IFtcblx0XHQnY2xpY2snLFxuXHRcdCdkYmxjbGljaycsXG5cdFx0J2NvbnRleHRtZW51Jyxcblx0XHQncG9pbnRlcnVwJyxcblx0XHQncG9pbnRlcmRvd24nLFxuXHRcdCdwb2ludGVyb3ZlcicsXG5cdFx0J3BvaW50ZXJvdXQnLFxuXHRcdCdwb2ludGVyZW50ZXInLFxuXHRcdCdwb2ludGVybGVhdmUnLFxuXHRcdCdwb2ludGVybW92ZScsXG5cdFx0J3BvaW50ZXJtaXNzZWQnLFxuXHRcdCdwb2ludGVyY2FuY2VsJyxcblx0XHQnd2hlZWwnLFxuXHRdLFxufTtcblxuZXhwb3J0IGZ1bmN0aW9uIGluamVjdE9iamVjdEV2ZW50cyhcblx0dGFyZ2V0OiAoKSA9PiBFbGVtZW50UmVmPE9iamVjdDNEPiB8IE9iamVjdDNEIHwgbnVsbCB8IHVuZGVmaW5lZCxcblx0ZXZlbnRzOiB7XG5cdFx0W0sgaW4gKHR5cGVvZiBzdXBwb3J0ZWRFdmVudHMpW251bWJlcl1dPzogKGV2ZW50OiBOZ3RUaHJlZUV2ZW50PE5ndERvbUV2ZW50PikgPT4gdm9pZDtcblx0fSxcblx0eyBpbmplY3RvciB9OiB7IGluamVjdG9yPzogSW5qZWN0b3IgfSA9IHt9LFxuKSB7XG5cdHJldHVybiBhc3NlcnRJbmplY3RvcihpbmplY3RPYmplY3RFdmVudHMsIGluamVjdG9yLCAoKSA9PiB7XG5cdFx0Y29uc3QgYXV0b0VmZmVjdCA9IGluamVjdEF1dG9FZmZlY3QoKTtcblx0XHRjb25zdCByZW5kZXJlciA9IGluamVjdChSZW5kZXJlcjIpO1xuXG5cdFx0Y29uc3QgY2xlYW5VcHM6IEFycmF5PCgpID0+IHZvaWQ+ID0gW107XG5cblx0XHRhZnRlck5leHRSZW5kZXIoKCkgPT4ge1xuXHRcdFx0YXV0b0VmZmVjdCgoKSA9PiB7XG5cdFx0XHRcdGNvbnN0IHRhcmdldFJlZiA9IHJlc29sdmVSZWYodGFyZ2V0KCkpO1xuXHRcdFx0XHRpZiAoIXRhcmdldFJlZikgcmV0dXJuO1xuXG5cdFx0XHRcdE9iamVjdC5lbnRyaWVzKGV2ZW50cykuZm9yRWFjaCgoW2V2ZW50TmFtZSwgZXZlbnRIYW5kbGVyXSkgPT4ge1xuXHRcdFx0XHRcdGNsZWFuVXBzLnB1c2gocmVuZGVyZXIubGlzdGVuKHRhcmdldFJlZiwgZXZlbnROYW1lLCBldmVudEhhbmRsZXIpKTtcblx0XHRcdFx0fSk7XG5cblx0XHRcdFx0cmV0dXJuICgpID0+IHtcblx0XHRcdFx0XHRjbGVhblVwcy5mb3JFYWNoKChjbGVhblVwKSA9PiBjbGVhblVwKCkpO1xuXHRcdFx0XHR9O1xuXHRcdFx0fSk7XG5cdFx0fSk7XG5cblx0XHRpbmplY3QoRGVzdHJveVJlZikub25EZXN0cm95KCgpID0+IHtcblx0XHRcdGNsZWFuVXBzLmZvckVhY2goKGNsZWFuVXApID0+IGNsZWFuVXAoKSk7XG5cdFx0fSk7XG5cblx0XHRyZXR1cm4gY2xlYW5VcHM7XG5cdH0pO1xufVxuIl19
@@ -1,9 +1,9 @@
1
1
  import * as i0 from '@angular/core';
2
- import { untracked, computed, signal, ElementRef, input, inject, ViewContainerRef, NgZone, TemplateRef, afterNextRender, DestroyRef, Directive, effect, InjectionToken, getDebugNode, RendererFactory2, Injectable, makeEnvironmentProviders, Component, EnvironmentInjector, Injector, booleanAttribute, output, viewChild, createEnvironmentInjector, ChangeDetectionStrategy, CUSTOM_ELEMENTS_SCHEMA, contentChild, Renderer2 } from '@angular/core';
2
+ import { untracked, computed, signal, ElementRef, input, inject, ViewContainerRef, NgZone, TemplateRef, afterNextRender, DestroyRef, Directive, effect, InjectionToken, getDebugNode, RendererFactory2, Injectable, makeEnvironmentProviders, Component, EnvironmentInjector, Injector, booleanAttribute, output, viewChild, createEnvironmentInjector, ChangeDetectionStrategy, model, Renderer2, CUSTOM_ELEMENTS_SCHEMA, Pipe, contentChild } from '@angular/core';
3
3
  import { takeUntilDestroyed, outputFromObservable } from '@angular/core/rxjs-interop';
4
4
  import { injectAutoEffect } from 'ngxtension/auto-effect';
5
5
  import { provideResizeOptions, NgxResize } from 'ngxtension/resize';
6
- import { MathUtils, WebGLRenderer, OrthographicCamera, PerspectiveCamera, Vector3, Vector2, Clock, Layers, Color, ColorManagement, Texture, RGBAFormat, UnsignedByteType, Raycaster, Scene, PCFSoftShadowMap, BasicShadowMap, PCFShadowMap, VSMShadowMap, NoToneMapping, ACESFilmicToneMapping, Vector4 } from 'three';
6
+ import { MathUtils, WebGLRenderer, OrthographicCamera, PerspectiveCamera, Vector3, Vector2, Clock, Layers, Color, ColorManagement, Texture, RGBAFormat, UnsignedByteType, Raycaster, Scene, PCFSoftShadowMap, BasicShadowMap, PCFShadowMap, VSMShadowMap, NoToneMapping, ACESFilmicToneMapping, Group, Vector4 } from 'three';
7
7
  import { DOCUMENT } from '@angular/common';
8
8
  import { Subject, filter } from 'rxjs';
9
9
  import { createInjectionToken } from 'ngxtension/create-injection-token';
@@ -2515,6 +2515,178 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.1.3", ngImpor
2515
2515
  }]
2516
2516
  }], ctorParameters: () => [] });
2517
2517
 
2518
+ function resolveRef(ref) {
2519
+ if (is.ref(ref)) {
2520
+ return ref.nativeElement;
2521
+ }
2522
+ return ref;
2523
+ }
2524
+
2525
+ class NgtObjectEvents {
2526
+ constructor() {
2527
+ this.click = output();
2528
+ this.dblclick = output();
2529
+ this.contextmenu = output();
2530
+ this.pointerup = output();
2531
+ this.pointerdown = output();
2532
+ this.pointerover = output();
2533
+ this.pointerout = output();
2534
+ this.pointerenter = output();
2535
+ this.pointerleave = output();
2536
+ this.pointermove = output();
2537
+ this.pointermissed = output();
2538
+ this.pointercancel = output();
2539
+ this.wheel = output();
2540
+ // NOTE: we use model here to allow for the hostDirective host to set this value
2541
+ this.ngtObjectEvents = model();
2542
+ const injector = inject(Injector);
2543
+ afterNextRender(() => {
2544
+ injectObjectEvents(this.ngtObjectEvents, {
2545
+ click: (event) => this.click.emit(event),
2546
+ dblclick: (event) => this.dblclick.emit(event),
2547
+ contextmenu: (event) => this.contextmenu.emit(event),
2548
+ pointerup: (event) => this.pointerup.emit(event),
2549
+ pointerdown: (event) => this.pointerdown.emit(event),
2550
+ pointerover: (event) => this.pointerover.emit(event),
2551
+ pointerout: (event) => this.pointerout.emit(event),
2552
+ pointerenter: (event) => this.pointerenter.emit(event),
2553
+ pointerleave: (event) => this.pointerleave.emit(event),
2554
+ pointermove: (event) => this.pointermove.emit(event),
2555
+ pointermissed: (event) => this.pointermissed.emit(event),
2556
+ pointercancel: (event) => this.pointercancel.emit(event),
2557
+ wheel: (event) => this.wheel.emit(event),
2558
+ }, { injector });
2559
+ });
2560
+ }
2561
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.1.3", ngImport: i0, type: NgtObjectEvents, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
2562
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "18.1.3", type: NgtObjectEvents, isStandalone: true, selector: "[ngtObjectEvents]", inputs: { ngtObjectEvents: { classPropertyName: "ngtObjectEvents", publicName: "ngtObjectEvents", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { click: "click", dblclick: "dblclick", contextmenu: "contextmenu", pointerup: "pointerup", pointerdown: "pointerdown", pointerover: "pointerover", pointerout: "pointerout", pointerenter: "pointerenter", pointerleave: "pointerleave", pointermove: "pointermove", pointermissed: "pointermissed", pointercancel: "pointercancel", wheel: "wheel", ngtObjectEvents: "ngtObjectEventsChange" }, ngImport: i0 }); }
2563
+ }
2564
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.1.3", ngImport: i0, type: NgtObjectEvents, decorators: [{
2565
+ type: Directive,
2566
+ args: [{ standalone: true, selector: '[ngtObjectEvents]' }]
2567
+ }], ctorParameters: () => [] });
2568
+ const NgtObjectEventsHostDirective = {
2569
+ directive: NgtObjectEvents,
2570
+ inputs: ['ngtObjectEvents'],
2571
+ outputs: [
2572
+ 'click',
2573
+ 'dblclick',
2574
+ 'contextmenu',
2575
+ 'pointerup',
2576
+ 'pointerdown',
2577
+ 'pointerover',
2578
+ 'pointerout',
2579
+ 'pointerenter',
2580
+ 'pointerleave',
2581
+ 'pointermove',
2582
+ 'pointermissed',
2583
+ 'pointercancel',
2584
+ 'wheel',
2585
+ ],
2586
+ };
2587
+ function injectObjectEvents(target, events, { injector } = {}) {
2588
+ return assertInjector(injectObjectEvents, injector, () => {
2589
+ const autoEffect = injectAutoEffect();
2590
+ const renderer = inject(Renderer2);
2591
+ const cleanUps = [];
2592
+ afterNextRender(() => {
2593
+ autoEffect(() => {
2594
+ const targetRef = resolveRef(target());
2595
+ if (!targetRef)
2596
+ return;
2597
+ Object.entries(events).forEach(([eventName, eventHandler]) => {
2598
+ cleanUps.push(renderer.listen(targetRef, eventName, eventHandler));
2599
+ });
2600
+ return () => {
2601
+ cleanUps.forEach((cleanUp) => cleanUp());
2602
+ };
2603
+ });
2604
+ });
2605
+ inject(DestroyRef).onDestroy(() => {
2606
+ cleanUps.forEach((cleanUp) => cleanUp());
2607
+ });
2608
+ return cleanUps;
2609
+ });
2610
+ }
2611
+
2612
+ class NgtSelection {
2613
+ constructor() {
2614
+ this.enabled = input(true, { alias: 'ngtSelection', transform: booleanAttribute });
2615
+ this.selection = signal([]);
2616
+ this.collection = this.selection.asReadonly();
2617
+ }
2618
+ select(...objects) {
2619
+ this.selection.update((prev) => [...prev, ...objects]);
2620
+ }
2621
+ unselect(...objects) {
2622
+ this.selection.update((prev) => prev.filter((selected) => !objects.includes(selected)));
2623
+ }
2624
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.1.3", ngImport: i0, type: NgtSelection, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
2625
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "18.1.3", type: NgtSelection, isStandalone: true, selector: "[ngtSelection]", inputs: { enabled: { classPropertyName: "enabled", publicName: "ngtSelection", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0 }); }
2626
+ }
2627
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.1.3", ngImport: i0, type: NgtSelection, decorators: [{
2628
+ type: Directive,
2629
+ args: [{ standalone: true, selector: '[ngtSelection]' }]
2630
+ }] });
2631
+ class NgtSelect {
2632
+ constructor() {
2633
+ this.enabled = input(false, { transform: booleanAttribute });
2634
+ this.options = input({});
2635
+ this.groupRef = viewChild.required('group');
2636
+ extend({ Group });
2637
+ const objectEvents = inject(NgtObjectEvents, { host: true });
2638
+ const selection = inject(NgtSelection);
2639
+ const autoEffect = injectAutoEffect();
2640
+ afterNextRender(() => {
2641
+ objectEvents.ngtObjectEvents.set(this.groupRef());
2642
+ autoEffect(() => {
2643
+ const group = this.groupRef().nativeElement;
2644
+ const localState = getLocalState(group);
2645
+ if (!localState)
2646
+ return;
2647
+ const enabled = this.enabled();
2648
+ if (!enabled)
2649
+ return;
2650
+ const [collection] = [untracked(selection.collection), localState.objects()];
2651
+ let changed = false;
2652
+ const current = [];
2653
+ group.traverse((child) => {
2654
+ child.type === 'Mesh' && current.push(child);
2655
+ if (collection.indexOf(child) === -1)
2656
+ changed = true;
2657
+ });
2658
+ if (!changed)
2659
+ return;
2660
+ selection.select(...current);
2661
+ return () => {
2662
+ selection.unselect(...current);
2663
+ };
2664
+ }, { allowSignalWrites: true });
2665
+ });
2666
+ }
2667
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.1.3", ngImport: i0, type: NgtSelect, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
2668
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.2.0", version: "18.1.3", type: NgtSelect, isStandalone: true, selector: "ngt-select", inputs: { enabled: { classPropertyName: "enabled", publicName: "enabled", isSignal: true, isRequired: false, transformFunction: null }, options: { classPropertyName: "options", publicName: "options", isSignal: true, isRequired: false, transformFunction: null } }, viewQueries: [{ propertyName: "groupRef", first: true, predicate: ["group"], descendants: true, isSignal: true }], hostDirectives: [{ directive: NgtObjectEvents, inputs: ["ngtObjectEvents", "ngtObjectEvents"], outputs: ["click", "click", "dblclick", "dblclick", "contextmenu", "contextmenu", "pointerup", "pointerup", "pointerdown", "pointerdown", "pointerover", "pointerover", "pointerout", "pointerout", "pointerenter", "pointerenter", "pointerleave", "pointerleave", "pointermove", "pointermove", "pointermissed", "pointermissed", "pointercancel", "pointercancel", "wheel", "wheel"] }], ngImport: i0, template: `
2669
+ <ngt-group #group [parameters]="options()">
2670
+ <ng-content />
2671
+ </ngt-group>
2672
+ `, isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
2673
+ }
2674
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.1.3", ngImport: i0, type: NgtSelect, decorators: [{
2675
+ type: Component,
2676
+ args: [{
2677
+ selector: 'ngt-select',
2678
+ standalone: true,
2679
+ template: `
2680
+ <ngt-group #group [parameters]="options()">
2681
+ <ng-content />
2682
+ </ngt-group>
2683
+ `,
2684
+ hostDirectives: [NgtObjectEventsHostDirective],
2685
+ schemas: [CUSTOM_ELEMENTS_SCHEMA],
2686
+ changeDetection: ChangeDetectionStrategy.OnPush,
2687
+ }]
2688
+ }], ctorParameters: () => [] });
2689
+
2518
2690
  var _a;
2519
2691
  const NGT_HTML_DOM_ELEMENT = new InjectionToken('NGT_HTML_DOM_ELEMENT');
2520
2692
  function provideHTMLDomElement(...args) {
@@ -2640,6 +2812,70 @@ _injectLoader.clear = (urls) => {
2640
2812
  };
2641
2813
  const injectLoader = _injectLoader;
2642
2814
 
2815
+ class NgtHexify {
2816
+ constructor() {
2817
+ this.document = inject(DOCUMENT, { optional: true });
2818
+ }
2819
+ /**
2820
+ * transforms a:
2821
+ * - hex string to a hex number
2822
+ * - rgb string to a hex number
2823
+ * - rgba string to a hex number
2824
+ * - css color string to a hex number
2825
+ *
2826
+ * always default to black if failed
2827
+ * @param value
2828
+ */
2829
+ transform(value) {
2830
+ if (value == null)
2831
+ return 0x000000;
2832
+ if (value.startsWith('#')) {
2833
+ return this.hexStringToNumber(value);
2834
+ }
2835
+ if (!this.ctx) {
2836
+ this.ctx = this.document?.createElement('canvas').getContext('2d');
2837
+ }
2838
+ if (!this.ctx)
2839
+ return 0x000000;
2840
+ this.ctx.fillStyle = value;
2841
+ const computedValue = this.ctx.fillStyle;
2842
+ if (computedValue.startsWith('#')) {
2843
+ return this.hexStringToNumber(computedValue);
2844
+ }
2845
+ if (!computedValue.startsWith('rgba'))
2846
+ return 0x000000;
2847
+ const regex = /rgba?\((\d+),\s*(\d+),\s*(\d+),?\s*(\d*\.?\d+)?\)/;
2848
+ const match = computedValue.match(regex);
2849
+ if (!match)
2850
+ return 0x000000;
2851
+ const r = parseInt(match[1], 10);
2852
+ const g = parseInt(match[2], 10);
2853
+ const b = parseInt(match[3], 10);
2854
+ const a = match[4] ? parseFloat(match[4]) : 1.0;
2855
+ // Convert the components to hex strings
2856
+ const hexR = this.componentToHex(r);
2857
+ const hexG = this.componentToHex(g);
2858
+ const hexB = this.componentToHex(b);
2859
+ const hexA = this.componentToHex(Math.round(a * 255));
2860
+ // Combine the hex components into a single hex string
2861
+ const hex = `#${hexR}${hexG}${hexB}${hexA}`;
2862
+ return this.hexStringToNumber(hex);
2863
+ }
2864
+ hexStringToNumber(hexString) {
2865
+ return parseInt(hexString.replace('#', ''), 16);
2866
+ }
2867
+ componentToHex(component) {
2868
+ const hex = component.toString(16);
2869
+ return hex.length === 1 ? '0' + hex : hex;
2870
+ }
2871
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.1.3", ngImport: i0, type: NgtHexify, deps: [], target: i0.ɵɵFactoryTarget.Pipe }); }
2872
+ static { this.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "18.1.3", ngImport: i0, type: NgtHexify, isStandalone: true, name: "hexify" }); }
2873
+ }
2874
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.1.3", ngImport: i0, type: NgtHexify, decorators: [{
2875
+ type: Pipe,
2876
+ args: [{ name: 'hexify', pure: true, standalone: true }]
2877
+ }] });
2878
+
2643
2879
  function injectBeforeRender(cb, { priority = 0, injector } = {}) {
2644
2880
  return assertInjector(injectBeforeRender, injector, () => {
2645
2881
  const store = injectStore();
@@ -2860,38 +3096,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.1.3", ngImpor
2860
3096
  }]
2861
3097
  }], ctorParameters: () => [] });
2862
3098
 
2863
- function resolveRef(ref) {
2864
- if (is.ref(ref)) {
2865
- return ref.nativeElement;
2866
- }
2867
- return ref;
2868
- }
2869
-
2870
- function injectObjectEvents(target, events, { injector } = {}) {
2871
- return assertInjector(injectObjectEvents, injector, () => {
2872
- const autoEffect = injectAutoEffect();
2873
- const renderer = inject(Renderer2);
2874
- const cleanUps = [];
2875
- afterNextRender(() => {
2876
- autoEffect(() => {
2877
- const targetRef = resolveRef(target());
2878
- if (!targetRef)
2879
- return;
2880
- Object.entries(events).forEach(([eventName, eventHandler]) => {
2881
- cleanUps.push(renderer.listen(targetRef, eventName, eventHandler));
2882
- });
2883
- return () => {
2884
- cleanUps.forEach((cleanUp) => cleanUp());
2885
- };
2886
- });
2887
- });
2888
- inject(DestroyRef).onDestroy(() => {
2889
- cleanUps.forEach((cleanUp) => cleanUp());
2890
- });
2891
- return cleanUps;
2892
- });
2893
- }
2894
-
2895
3099
  function omit(objFn, keysToOmit) {
2896
3100
  return computed(() => {
2897
3101
  const obj = objFn();
@@ -2964,5 +3168,5 @@ const vector4 = createVectorComputed(Vector4);
2964
3168
  * Generated bundle index. Do not edit.
2965
3169
  */
2966
3170
 
2967
- export { HTML, NGT_STORE, NgtArgs, NgtCanvas, NgtHTML, NgtPortal, NgtPortalBeforeRender, NgtPortalContent, NgtRenderer, NgtRendererFactory, NgtRoutedScene, ROUTED_SCENE, addAfterEffect, addEffect, addTail, applyProps, attach, checkNeedsUpdate, checkUpdate, createAttachFunction, detach, dispose, extend, flushGlobalEffects, getLocalState, injectBeforeRender, injectCanvasRootInitializer, injectLoader, injectLoop, injectObjectEvents, injectStore, invalidateInstance, is, makeCameraInstance, makeDpr, makeId, makeObjectGraph, makeRendererInstance, merge, omit, pick, prepare, privateKeys, provideHTMLDomElement, provideNgtRenderer, provideStore, resolveRef, roots, signalStore, updateCamera, vector2, vector3, vector4 };
3171
+ export { HTML, NGT_STORE, NgtArgs, NgtCanvas, NgtHTML, NgtHexify, NgtObjectEvents, NgtObjectEventsHostDirective, NgtPortal, NgtPortalBeforeRender, NgtPortalContent, NgtRenderer, NgtRendererFactory, NgtRoutedScene, NgtSelect, NgtSelection, ROUTED_SCENE, addAfterEffect, addEffect, addTail, applyProps, attach, checkNeedsUpdate, checkUpdate, createAttachFunction, detach, dispose, extend, flushGlobalEffects, getLocalState, injectBeforeRender, injectCanvasRootInitializer, injectLoader, injectLoop, injectObjectEvents, injectStore, invalidateInstance, is, makeCameraInstance, makeDpr, makeId, makeObjectGraph, makeRendererInstance, merge, omit, pick, prepare, privateKeys, provideHTMLDomElement, provideNgtRenderer, provideStore, resolveRef, roots, signalStore, updateCamera, vector2, vector3, vector4 };
2968
3172
  //# sourceMappingURL=angular-three.mjs.map