angular-three 1.0.0-beta.3 → 1.0.0-beta.5

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 CHANGED
@@ -1,7 +1,58 @@
1
- # angular-three
1
+ # Angular Renderer for THREE.js
2
2
 
3
- This library was generated with [Nx](https://nx.dev).
3
+ Leverage your [Angular](https://angular.io) to build 3D applications with [THREE.js](https://threejs.org)
4
4
 
5
- ## Running unit tests
5
+ ## Installation
6
6
 
7
- Run `nx test angular-three` to execute the unit tests.
7
+ ```shell
8
+ npm i angular-three three
9
+ ```
10
+
11
+ ```shell
12
+ npm i -D @types/three
13
+ ```
14
+
15
+ > Typically, we'd want to keep `three` and `@types/three` on the same minor version. Eg: `0.147`, `0.148` etc..
16
+
17
+ ## Simple usage
18
+
19
+ 1. Create a `Scene` component as a Standalone Component
20
+
21
+ ```ts
22
+ import { extend } from 'angular-three';
23
+ import { Mesh, BoxGeometry, MeshBasicMaterial } from 'three';
24
+
25
+ extend({ Mesh, BoxGeometry, MeshBasicMaterial });
26
+
27
+ @Component({
28
+ standalone: true,
29
+ template: `
30
+ <ngt-mesh>
31
+ <ngt-box-geometry />
32
+ <ngt-mesh-basic-material color="darkred" />
33
+ </ngt-mesh>
34
+ `,
35
+ schemas: [CUSTOM_ELEMENTS_SCHEMA],
36
+ })
37
+ export class Scene {}
38
+ ```
39
+
40
+ - `extend` will add the THREE entities to `angular-three` catalogue which allows the renderer to recognize the custom tags: `ngt-mesh`, `ngt-box-geometry` etc..
41
+ - Custom Element tags follow this rule: `ngt-` + THREE classes in **kebab-case**. `Mesh` -> `ngt-mesh`
42
+ - `schemas: [CUSTOM_ELEMENTS_SCHEMA]` allows us to use custom tags on the template. This is Angular's limitation at the moment
43
+
44
+ 2. Render `<ngt-canvas>` component, use `Scene` component above to pass into `[scene]` input on `<ngt-canvas>`
45
+
46
+ ```html
47
+ <ngt-canvas [scene]="Scene" />
48
+ ```
49
+
50
+ - `ngt-canvas` creates the basic building blocks of THREE.js: a default `WebGLRenderer`, a default `Scene`, and a default `PerspectiveCamera`
51
+
52
+ ## Documentations
53
+
54
+ Read more about Angular Three usages in [TBD Documentations]()
55
+
56
+ ## Contributions
57
+
58
+ Contributions are welcomed
package/esm2020/index.mjs CHANGED
@@ -3,4 +3,12 @@ export * from './lib/types';
3
3
  export * from './lib/di/catalogue';
4
4
  export * from './lib/directives/args';
5
5
  export * from './lib/directives/repeat';
6
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9saWJzL2FuZ3VsYXItdGhyZWUvc3JjL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGNBQWMsY0FBYyxDQUFDO0FBQzdCLGNBQWMsYUFBYSxDQUFDO0FBQzVCLGNBQWMsb0JBQW9CLENBQUM7QUFDbkMsY0FBYyx1QkFBdUIsQ0FBQztBQUN0QyxjQUFjLHlCQUF5QixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0ICogZnJvbSAnLi9saWIvY2FudmFzJztcbmV4cG9ydCAqIGZyb20gJy4vbGliL3R5cGVzJztcbmV4cG9ydCAqIGZyb20gJy4vbGliL2RpL2NhdGFsb2d1ZSc7XG5leHBvcnQgKiBmcm9tICcuL2xpYi9kaXJlY3RpdmVzL2FyZ3MnO1xuZXhwb3J0ICogZnJvbSAnLi9saWIvZGlyZWN0aXZlcy9yZXBlYXQnO1xuIl19
6
+ export * from './lib/stores/store';
7
+ export * from './lib/stores/rx-store';
8
+ export * from './lib/utils/instance';
9
+ export * from './lib/utils/update';
10
+ export * from './lib/utils/is';
11
+ export * from './lib/loader';
12
+ export * from './lib/di/ref';
13
+ export * from './lib/di/destroy';
14
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9saWJzL2FuZ3VsYXItdGhyZWUvc3JjL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGNBQWMsY0FBYyxDQUFDO0FBQzdCLGNBQWMsYUFBYSxDQUFDO0FBQzVCLGNBQWMsb0JBQW9CLENBQUM7QUFDbkMsY0FBYyx1QkFBdUIsQ0FBQztBQUN0QyxjQUFjLHlCQUF5QixDQUFDO0FBQ3hDLGNBQWMsb0JBQW9CLENBQUM7QUFDbkMsY0FBYyx1QkFBdUIsQ0FBQztBQUN0QyxjQUFjLHNCQUFzQixDQUFDO0FBQ3JDLGNBQWMsb0JBQW9CLENBQUM7QUFDbkMsY0FBYyxnQkFBZ0IsQ0FBQztBQUMvQixjQUFjLGNBQWMsQ0FBQztBQUM3QixjQUFjLGNBQWMsQ0FBQztBQUM3QixjQUFjLGtCQUFrQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0ICogZnJvbSAnLi9saWIvY2FudmFzJztcbmV4cG9ydCAqIGZyb20gJy4vbGliL3R5cGVzJztcbmV4cG9ydCAqIGZyb20gJy4vbGliL2RpL2NhdGFsb2d1ZSc7XG5leHBvcnQgKiBmcm9tICcuL2xpYi9kaXJlY3RpdmVzL2FyZ3MnO1xuZXhwb3J0ICogZnJvbSAnLi9saWIvZGlyZWN0aXZlcy9yZXBlYXQnO1xuZXhwb3J0ICogZnJvbSAnLi9saWIvc3RvcmVzL3N0b3JlJztcbmV4cG9ydCAqIGZyb20gJy4vbGliL3N0b3Jlcy9yeC1zdG9yZSc7XG5leHBvcnQgKiBmcm9tICcuL2xpYi91dGlscy9pbnN0YW5jZSc7XG5leHBvcnQgKiBmcm9tICcuL2xpYi91dGlscy91cGRhdGUnO1xuZXhwb3J0ICogZnJvbSAnLi9saWIvdXRpbHMvaXMnO1xuZXhwb3J0ICogZnJvbSAnLi9saWIvbG9hZGVyJztcbmV4cG9ydCAqIGZyb20gJy4vbGliL2RpL3JlZic7XG5leHBvcnQgKiBmcm9tICcuL2xpYi9kaS9kZXN0cm95JztcbiJdfQ==
@@ -0,0 +1,24 @@
1
+ import { ChangeDetectorRef, inject } from '@angular/core';
2
+ import { ReplaySubject } from 'rxjs';
3
+ /**
4
+ * A utility injection fn that can be used in other injection fn to provide the destroy capability.
5
+ */
6
+ export function injectNgtDestroy(cb) {
7
+ try {
8
+ const cdr = inject(ChangeDetectorRef);
9
+ const destroy$ = new ReplaySubject();
10
+ queueMicrotask(() => {
11
+ cdr.onDestroy(() => {
12
+ destroy$.next();
13
+ destroy$.complete();
14
+ cb?.();
15
+ });
16
+ });
17
+ return { destroy$, cdr };
18
+ }
19
+ catch (e) {
20
+ console.warn(`[NGT] injectNgtDestroy is being called outside of Constructor Context`);
21
+ return {};
22
+ }
23
+ }
24
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVzdHJveS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvYW5ndWxhci10aHJlZS9zcmMvbGliL2RpL2Rlc3Ryb3kudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sRUFBVyxNQUFNLGVBQWUsQ0FBQztBQUNuRSxPQUFPLEVBQWMsYUFBYSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBRWpEOztHQUVHO0FBQ0gsTUFBTSxVQUFVLGdCQUFnQixDQUFDLEVBQWU7SUFDNUMsSUFBSTtRQUNBLE1BQU0sR0FBRyxHQUFHLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1FBQ3RDLE1BQU0sUUFBUSxHQUFHLElBQUksYUFBYSxFQUFRLENBQUM7UUFFM0MsY0FBYyxDQUFDLEdBQUcsRUFBRTtZQUNmLEdBQWUsQ0FBQyxTQUFTLENBQUMsR0FBRyxFQUFFO2dCQUM1QixRQUFRLENBQUMsSUFBSSxFQUFFLENBQUM7Z0JBQ2hCLFFBQVEsQ0FBQyxRQUFRLEVBQUUsQ0FBQztnQkFDcEIsRUFBRSxFQUFFLEVBQUUsQ0FBQztZQUNYLENBQUMsQ0FBQyxDQUFDO1FBQ1AsQ0FBQyxDQUFDLENBQUM7UUFFSCxPQUFPLEVBQUUsUUFBUSxFQUFFLEdBQUcsRUFBRSxDQUFDO0tBQzVCO0lBQUMsT0FBTyxDQUFDLEVBQUU7UUFDUixPQUFPLENBQUMsSUFBSSxDQUFDLHVFQUF1RSxDQUFDLENBQUM7UUFDdEYsT0FBTyxFQUF5QyxDQUFDO0tBQ3BEO0FBQ0wsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENoYW5nZURldGVjdG9yUmVmLCBpbmplY3QsIFZpZXdSZWYgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE9ic2VydmFibGUsIFJlcGxheVN1YmplY3QgfSBmcm9tICdyeGpzJztcblxuLyoqXG4gKiBBIHV0aWxpdHkgaW5qZWN0aW9uIGZuIHRoYXQgY2FuIGJlIHVzZWQgaW4gb3RoZXIgaW5qZWN0aW9uIGZuIHRvIHByb3ZpZGUgdGhlIGRlc3Ryb3kgY2FwYWJpbGl0eS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGluamVjdE5ndERlc3Ryb3koY2I/OiAoKSA9PiB2b2lkKTogeyBkZXN0cm95JDogT2JzZXJ2YWJsZTx2b2lkPjsgY2RyOiBDaGFuZ2VEZXRlY3RvclJlZiB9IHtcbiAgICB0cnkge1xuICAgICAgICBjb25zdCBjZHIgPSBpbmplY3QoQ2hhbmdlRGV0ZWN0b3JSZWYpO1xuICAgICAgICBjb25zdCBkZXN0cm95JCA9IG5ldyBSZXBsYXlTdWJqZWN0PHZvaWQ+KCk7XG5cbiAgICAgICAgcXVldWVNaWNyb3Rhc2soKCkgPT4ge1xuICAgICAgICAgICAgKGNkciBhcyBWaWV3UmVmKS5vbkRlc3Ryb3koKCkgPT4ge1xuICAgICAgICAgICAgICAgIGRlc3Ryb3kkLm5leHQoKTtcbiAgICAgICAgICAgICAgICBkZXN0cm95JC5jb21wbGV0ZSgpO1xuICAgICAgICAgICAgICAgIGNiPy4oKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4geyBkZXN0cm95JCwgY2RyIH07XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBjb25zb2xlLndhcm4oYFtOR1RdIGluamVjdE5ndERlc3Ryb3kgaXMgYmVpbmcgY2FsbGVkIG91dHNpZGUgb2YgQ29uc3RydWN0b3IgQ29udGV4dGApO1xuICAgICAgICByZXR1cm4ge30gYXMgUmV0dXJuVHlwZTx0eXBlb2YgaW5qZWN0Tmd0RGVzdHJveT47XG4gICAgfVxufVxuIl19
@@ -0,0 +1,71 @@
1
+ import { ElementRef } from '@angular/core';
2
+ import { BehaviorSubject, distinctUntilChanged, filter, map, merge, of, switchMap, takeUntil, } from 'rxjs';
3
+ import { getLocalState } from '../utils/instance';
4
+ import { is } from '../utils/is';
5
+ import { injectNgtDestroy } from './destroy';
6
+ export function injectNgtRef(initialValue = null) {
7
+ let ref = new ElementRef(initialValue);
8
+ if (is.ref(initialValue)) {
9
+ ref = initialValue;
10
+ }
11
+ let lastValue = ref.nativeElement;
12
+ const cdRefs = [];
13
+ const ref$ = new BehaviorSubject(lastValue);
14
+ const { destroy$, cdr } = injectNgtDestroy(() => {
15
+ ref$.complete();
16
+ });
17
+ cdRefs.push(cdr);
18
+ const obs$ = ref$.asObservable().pipe(distinctUntilChanged(), takeUntil(destroy$));
19
+ const subscribe = (callback) => {
20
+ return obs$.subscribe((current) => {
21
+ callback(current, lastValue);
22
+ lastValue = current;
23
+ });
24
+ };
25
+ const $ = obs$.pipe(filter((value, index) => index > 0 || value != null), takeUntil(destroy$));
26
+ const children$ = (type = 'objects') => $.pipe(switchMap((instance) => {
27
+ const localState = getLocalState(instance);
28
+ if (localState.objects && localState.nonObjects) {
29
+ return merge(localState.objects, localState.nonObjects).pipe(map(() => {
30
+ try {
31
+ return type === 'both'
32
+ ? [...localState.objects.value, ...localState.nonObjects.value]
33
+ : localState[type].value;
34
+ }
35
+ catch (e) {
36
+ console.error(`[NGT] Exception in accessing children of ${instance}`);
37
+ return [];
38
+ }
39
+ }));
40
+ }
41
+ return of([]);
42
+ }), filter((children, index) => index > 0 || children.length > 0), takeUntil(destroy$));
43
+ Object.defineProperty(ref, 'nativeElement', {
44
+ set: (newVal) => {
45
+ if (ref.nativeElement !== newVal) {
46
+ ref$.next(newVal);
47
+ lastValue = ref.nativeElement;
48
+ ref.nativeElement = newVal;
49
+ // clone the cdRefs so we can mutate cdRefs in the loop
50
+ const cds = [...cdRefs];
51
+ for (let i = 0; i < cds.length; i++) {
52
+ const cd = cds[i];
53
+ // if a ChangeDetectorRef is destroyed, we stop tracking it and go to the next one
54
+ if (cd.destroyed) {
55
+ cdRefs.splice(i, 1);
56
+ continue;
57
+ }
58
+ // during creation phase, 'context' on ViewRef will be null
59
+ // we check the "context" to avoid running detectChanges during this phase.
60
+ // becuase there's nothing to check
61
+ if (cd['context']) {
62
+ cd.detectChanges();
63
+ }
64
+ }
65
+ }
66
+ },
67
+ get: () => ref$.value,
68
+ });
69
+ return Object.assign(ref, { subscribe, $, children$, useCDR: (cdr) => void cdRefs.push(cdr) });
70
+ }
71
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVmLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9hbmd1bGFyLXRocmVlL3NyYy9saWIvZGkvcmVmLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBcUIsVUFBVSxFQUFXLE1BQU0sZUFBZSxDQUFDO0FBQ3ZFLE9BQU8sRUFDSCxlQUFlLEVBQ2Ysb0JBQW9CLEVBQ3BCLE1BQU0sRUFDTixHQUFHLEVBQ0gsS0FBSyxFQUVMLEVBQUUsRUFFRixTQUFTLEVBQ1QsU0FBUyxHQUNaLE1BQU0sTUFBTSxDQUFDO0FBRWQsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQ2xELE9BQU8sRUFBRSxFQUFFLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDakMsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sV0FBVyxDQUFDO0FBZTdDLE1BQU0sVUFBVSxZQUFZLENBQUksZUFBK0MsSUFBSTtJQUMvRSxJQUFJLEdBQUcsR0FBRyxJQUFJLFVBQVUsQ0FBSSxZQUFpQixDQUFDLENBQUM7SUFFL0MsSUFBSSxFQUFFLENBQUMsR0FBRyxDQUFDLFlBQVksQ0FBQyxFQUFFO1FBQ3RCLEdBQUcsR0FBRyxZQUFZLENBQUM7S0FDdEI7SUFFRCxJQUFJLFNBQVMsR0FBRyxHQUFHLENBQUMsYUFBYSxDQUFDO0lBQ2xDLE1BQU0sTUFBTSxHQUFHLEVBQXlCLENBQUM7SUFDekMsTUFBTSxJQUFJLEdBQUcsSUFBSSxlQUFlLENBQUksU0FBUyxDQUFDLENBQUM7SUFFL0MsTUFBTSxFQUFFLFFBQVEsRUFBRSxHQUFHLEVBQUUsR0FBRyxnQkFBZ0IsQ0FBQyxHQUFHLEVBQUU7UUFDNUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO0lBQ3BCLENBQUMsQ0FBQyxDQUFDO0lBRUgsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUVqQixNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsWUFBWSxF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QkFDM0UsbUNBQW1DO29CQUNuQyxJQUFLLEVBQW1CLENBQUMsU0FBUyxDQUFDLEVBQUU7d0JBQ2pDLEVBQUUsQ0FBQyxhQUFhLEVBQUUsQ0FBQztxQkFDdEI7aUJBQ0o7YUFDSjtRQUNMLENBQUM7UUFDRCxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLEtBQUs7S0FDeEIsQ0FBQyxDQUFDO0lBRUgsT0FBTyxNQUFNLENBQUMsTUFBTSxDQUFDLEdBQUcsRUFBRSxFQUFFLFNBQVMsRUFBRSxDQUFDLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBRSxDQUFDLEdBQXNCLEVBQUUsRUFBRSxDQUFDLEtBQUssTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDdEgsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENoYW5nZURldGVjdG9yUmVmLCBFbGVtZW50UmVmLCBWaWV3UmVmIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1xuICAgIEJlaGF2aW9yU3ViamVjdCxcbiAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCxcbiAgICBmaWx0ZXIsXG4gICAgbWFwLFxuICAgIG1lcmdlLFxuICAgIE9ic2VydmFibGUsXG4gICAgb2YsXG4gICAgU3Vic2NyaXB0aW9uLFxuICAgIHN3aXRjaE1hcCxcbiAgICB0YWtlVW50aWwsXG59IGZyb20gJ3J4anMnO1xuaW1wb3J0IHR5cGUgeyBOZ3RBbnlSZWNvcmQsIE5ndEluc3RhbmNlTm9kZSB9IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCB7IGdldExvY2FsU3RhdGUgfSBmcm9tICcuLi91dGlscy9pbnN0YW5jZSc7XG5pbXBvcnQgeyBpcyB9IGZyb20gJy4uL3V0aWxzL2lzJztcbmltcG9ydCB7IGluamVjdE5ndERlc3Ryb3kgfSBmcm9tICcuL2Rlc3Ryb3knO1xuXG50eXBlIFN1YnNjcmliZTxUPiA9IChjYWxsYmFjazogKGN1cnJlbnQ6IFQsIHByZXZpb3VzOiBUIHwgbnVsbCkgPT4gdm9pZCkgPT4gU3Vic2NyaXB0aW9uO1xuXG5leHBvcnQgdHlwZSBOZ3RJbmplY3RlZFJlZjxUPiA9IEVsZW1lbnRSZWY8VD4gJiB7XG4gICAgLyogYSBTdWJzY3JpYmUgZm4gdGhhdCBlbWl0cyBjdXJyZW50IGFuZCBwcmV2aW91cyB2YWx1ZS4gVXNlZnVsIGZvciBkZWJ1ZyAqL1xuICAgIHN1YnNjcmliZTogU3Vic2NyaWJlPFQ+O1xuICAgIC8qIGNvbnN1bWVycyBzaG91bGQgdXNlIHRoaXMgZm9yIGxpc3RlbmluZyB0byB2YWx1ZSBvZiB0aGlzIHJlZi4gVGhpcyBmaWx0ZXJzIG91dCBpbml0aWFsIG51bGwgdmFsdWUgKi9cbiAgICAkOiBPYnNlcnZhYmxlPFQ+O1xuICAgIC8qIGNvbnN1bWVycyBzaG91bGQgdXNlIHRoaXMgZm9yIGxpc3RlbnRpbmcgdG8gY2hpbGRyZW4gY2hhbmdlcyBvbiB0aGlzIHJlZiAqL1xuICAgIGNoaWxkcmVuJDogKHR5cGU/OiAnb2JqZWN0cycgfCAnbm9uT2JqZWN0cycgfCAnYm90aCcpID0+IE9ic2VydmFibGU8Tmd0SW5zdGFuY2VOb2RlW10+O1xuICAgIC8qIG5vdGlmeSB0aGlzIENEIHdoZW4gcmVmIHZhbHVlIGNoYW5nZXMgKi9cbiAgICB1c2VDRFI6IChjZHI6IENoYW5nZURldGVjdG9yUmVmKSA9PiB2b2lkO1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIGluamVjdE5ndFJlZjxUPihpbml0aWFsVmFsdWU6IE5ndEluamVjdGVkUmVmPFQ+IHwgKFQgfCBudWxsKSA9IG51bGwpOiBOZ3RJbmplY3RlZFJlZjxUPiB7XG4gICAgbGV0IHJlZiA9IG5ldyBFbGVtZW50UmVmPFQ+KGluaXRpYWxWYWx1ZSBhcyBUKTtcblxuICAgIGlmIChpcy5yZWYoaW5pdGlhbFZhbHVlKSkge1xuICAgICAgICByZWYgPSBpbml0aWFsVmFsdWU7XG4gICAgfVxuXG4gICAgbGV0IGxhc3RWYWx1ZSA9IHJlZi5uYXRpdmVFbGVtZW50O1xuICAgIGNvbnN0IGNkUmVmcyA9IFtdIGFzIENoYW5nZURldGVjdG9yUmVmW107XG4gICAgY29uc3QgcmVmJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8VD4obGFzdFZhbHVlKTtcblxuICAgIGNvbnN0IHsgZGVzdHJveSQsIGNkciB9ID0gaW5qZWN0Tmd0RGVzdHJveSgoKSA9PiB7XG4gICAgICAgIHJlZiQuY29tcGxldGUoKTtcbiAgICB9KTtcblxuICAgIGNkUmVmcy5wdXNoKGNkcik7XG5cbiAgICBjb25zdCBvYnMkID0gcmVmJC5hc09ic2VydmFibGUoKS5waXBlKGRpc3RpbmN0VW50aWxDaGFuZ2VkKCksIHRha2VVbnRpbChkZXN0cm95JCkpO1xuXG4gICAgY29uc3Qgc3Vic2NyaWJlOiBTdWJzY3JpYmU8VD4gPSAoY2FsbGJhY2spID0+IHtcbiAgICAgICAgcmV0dXJuIG9icyQuc3Vic2NyaWJlKChjdXJyZW50KSA9PiB7XG4gICAgICAgICAgICBjYWxsYmFjayhjdXJyZW50LCBsYXN0VmFsdWUpO1xuICAgICAgICAgICAgbGFzdFZhbHVlID0gY3VycmVudDtcbiAgICAgICAgfSk7XG4gICAgfTtcblxuICAgIGNvbnN0ICQgPSBvYnMkLnBpcGUoXG4gICAgICAgIGZpbHRlcigodmFsdWUsIGluZGV4KSA9PiBpbmRleCA+IDAgfHwgdmFsdWUgIT0gbnVsbCksXG4gICAgICAgIHRha2VVbnRpbChkZXN0cm95JClcbiAgICApO1xuXG4gICAgY29uc3QgY2hpbGRyZW4kID0gKHR5cGU6ICdvYmplY3RzJyB8ICdub25PYmplY3RzJyB8ICdib3RoJyA9ICdvYmplY3RzJykgPT5cbiAgICAgICAgJC5waXBlKFxuICAgICAgICAgICAgc3dpdGNoTWFwKChpbnN0YW5jZSkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGxvY2FsU3RhdGUgPSBnZXRMb2NhbFN0YXRlKGluc3RhbmNlIGFzIE5ndEluc3RhbmNlTm9kZSk7XG4gICAgICAgICAgICAgICAgaWYgKGxvY2FsU3RhdGUub2JqZWN0cyAmJiBsb2NhbFN0YXRlLm5vbk9iamVjdHMpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1lcmdlKGxvY2FsU3RhdGUub2JqZWN0cywgbG9jYWxTdGF0ZS5ub25PYmplY3RzKS5waXBlKFxuICAgICAgICAgICAgICAgICAgICAgICAgbWFwKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHlwZSA9PT0gJ2JvdGgnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IFsuLi5sb2NhbFN0YXRlLm9iamVjdHMudmFsdWUsIC4uLmxvY2FsU3RhdGUubm9uT2JqZWN0cy52YWx1ZV1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogbG9jYWxTdGF0ZVt0eXBlXS52YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYFtOR1RdIEV4Y2VwdGlvbiBpbiBhY2Nlc3NpbmcgY2hpbGRyZW4gb2YgJHtpbnN0YW5jZX1gKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgcmV0dXJuIG9mKFtdKTtcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgZmlsdGVyKChjaGlsZHJlbiwgaW5kZXgpID0+IGluZGV4ID4gMCB8fCBjaGlsZHJlbi5sZW5ndGggPiAwKSxcbiAgICAgICAgICAgIHRha2VVbnRpbChkZXN0cm95JClcbiAgICAgICAgKTtcblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShyZWYsICduYXRpdmVFbGVtZW50Jywge1xuICAgICAgICBzZXQ6IChuZXdWYWw6IFQpID0+IHtcbiAgICAgICAgICAgIGlmIChyZWYubmF0aXZlRWxlbWVudCAhPT0gbmV3VmFsKSB7XG4gICAgICAgICAgICAgICAgcmVmJC5uZXh0KG5ld1ZhbCk7XG5cbiAgICAgICAgICAgICAgICBsYXN0VmFsdWUgPSByZWYubmF0aXZlRWxlbWVudDtcbiAgICAgICAgICAgICAgICByZWYubmF0aXZlRWxlbWVudCA9IG5ld1ZhbDtcblxuICAgICAgICAgICAgICAgIC8vIGNsb25lIHRoZSBjZFJlZnMgc28gd2UgY2FuIG11dGF0ZSBjZFJlZnMgaW4gdGhlIGxvb3BcbiAgICAgICAgICAgICAgICBjb25zdCBjZHMgPSBbLi4uY2RSZWZzXTtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNkcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBjZCA9IGNkc1tpXTtcbiAgICAgICAgICAgICAgICAgICAgLy8gaWYgYSBDaGFuZ2VEZXRlY3RvclJlZiBpcyBkZXN0cm95ZWQsIHdlIHN0b3AgdHJhY2tpbmcgaXQgYW5kIGdvIHRvIHRoZSBuZXh0IG9uZVxuICAgICAgICAgICAgICAgICAgICBpZiAoKGNkIGFzIFZpZXdSZWYpLmRlc3Ryb3llZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY2RSZWZzLnNwbGljZShpLCAxKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIC8vIGR1cmluZyBjcmVhdGlvbiBwaGFzZSwgJ2NvbnRleHQnIG9uIFZpZXdSZWYgd2lsbCBiZSBudWxsXG4gICAgICAgICAgICAgICAgICAgIC8vIHdlIGNoZWNrIHRoZSBcImNvbnRleHRcIiB0byBhdm9pZCBydW5uaW5nIGRldGVjdENoYW5nZXMgZHVyaW5nIHRoaXMgcGhhc2UuXG4gICAgICAgICAgICAgICAgICAgIC8vIGJlY3Vhc2UgdGhlcmUncyBub3RoaW5nIHRvIGNoZWNrXG4gICAgICAgICAgICAgICAgICAgIGlmICgoY2QgYXMgTmd0QW55UmVjb3JkKVsnY29udGV4dCddKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjZC5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIGdldDogKCkgPT4gcmVmJC52YWx1ZSxcbiAgICB9KTtcblxuICAgIHJldHVybiBPYmplY3QuYXNzaWduKHJlZiwgeyBzdWJzY3JpYmUsICQsIGNoaWxkcmVuJCwgdXNlQ0RSOiAoY2RyOiBDaGFuZ2VEZXRlY3RvclJlZikgPT4gdm9pZCBjZFJlZnMucHVzaChjZHIpIH0pO1xufVxuIl19
@@ -1,7 +1,7 @@
1
1
  import * as i0 from '@angular/core';
2
2
  import { ElementRef, Injectable, inject, InjectionToken, ViewContainerRef, TemplateRef, Directive, Input, EventEmitter, getDebugNode, ChangeDetectorRef, RendererFactory2, Component, Output, EnvironmentInjector, createEnvironmentInjector, HostBinding, ViewChild } from '@angular/core';
3
3
  import { injectNgxResize, provideNgxResizeOptions } from 'ngx-resize';
4
- import { BehaviorSubject, startWith, tap, isObservable, of, map, from, retry, catchError, share, ReplaySubject, switchMap, forkJoin, take, filter } from 'rxjs';
4
+ import { BehaviorSubject, startWith, tap, isObservable, of, map, from, retry, catchError, share, ReplaySubject, switchMap, forkJoin, take, filter, distinctUntilChanged, takeUntil, merge } from 'rxjs';
5
5
  import { __rest } from 'tslib';
6
6
  import { DOCUMENT, NgForOf } from '@angular/common';
7
7
  import { RxState, selectSlice } from '@rx-angular/state';
@@ -2469,9 +2469,97 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.1.1", ngImpor
2469
2469
  type: Input
2470
2470
  }] } });
2471
2471
 
2472
+ /**
2473
+ * A utility injection fn that can be used in other injection fn to provide the destroy capability.
2474
+ */
2475
+ function injectNgtDestroy(cb) {
2476
+ try {
2477
+ const cdr = inject(ChangeDetectorRef);
2478
+ const destroy$ = new ReplaySubject();
2479
+ queueMicrotask(() => {
2480
+ cdr.onDestroy(() => {
2481
+ destroy$.next();
2482
+ destroy$.complete();
2483
+ cb === null || cb === void 0 ? void 0 : cb();
2484
+ });
2485
+ });
2486
+ return { destroy$, cdr };
2487
+ }
2488
+ catch (e) {
2489
+ console.warn(`[NGT] injectNgtDestroy is being called outside of Constructor Context`);
2490
+ return {};
2491
+ }
2492
+ }
2493
+
2494
+ function injectNgtRef(initialValue = null) {
2495
+ let ref = new ElementRef(initialValue);
2496
+ if (is.ref(initialValue)) {
2497
+ ref = initialValue;
2498
+ }
2499
+ let lastValue = ref.nativeElement;
2500
+ const cdRefs = [];
2501
+ const ref$ = new BehaviorSubject(lastValue);
2502
+ const { destroy$, cdr } = injectNgtDestroy(() => {
2503
+ ref$.complete();
2504
+ });
2505
+ cdRefs.push(cdr);
2506
+ const obs$ = ref$.asObservable().pipe(distinctUntilChanged(), takeUntil(destroy$));
2507
+ const subscribe = (callback) => {
2508
+ return obs$.subscribe((current) => {
2509
+ callback(current, lastValue);
2510
+ lastValue = current;
2511
+ });
2512
+ };
2513
+ const $ = obs$.pipe(filter((value, index) => index > 0 || value != null), takeUntil(destroy$));
2514
+ const children$ = (type = 'objects') => $.pipe(switchMap((instance) => {
2515
+ const localState = getLocalState(instance);
2516
+ if (localState.objects && localState.nonObjects) {
2517
+ return merge(localState.objects, localState.nonObjects).pipe(map(() => {
2518
+ try {
2519
+ return type === 'both'
2520
+ ? [...localState.objects.value, ...localState.nonObjects.value]
2521
+ : localState[type].value;
2522
+ }
2523
+ catch (e) {
2524
+ console.error(`[NGT] Exception in accessing children of ${instance}`);
2525
+ return [];
2526
+ }
2527
+ }));
2528
+ }
2529
+ return of([]);
2530
+ }), filter((children, index) => index > 0 || children.length > 0), takeUntil(destroy$));
2531
+ Object.defineProperty(ref, 'nativeElement', {
2532
+ set: (newVal) => {
2533
+ if (ref.nativeElement !== newVal) {
2534
+ ref$.next(newVal);
2535
+ lastValue = ref.nativeElement;
2536
+ ref.nativeElement = newVal;
2537
+ // clone the cdRefs so we can mutate cdRefs in the loop
2538
+ const cds = [...cdRefs];
2539
+ for (let i = 0; i < cds.length; i++) {
2540
+ const cd = cds[i];
2541
+ // if a ChangeDetectorRef is destroyed, we stop tracking it and go to the next one
2542
+ if (cd.destroyed) {
2543
+ cdRefs.splice(i, 1);
2544
+ continue;
2545
+ }
2546
+ // during creation phase, 'context' on ViewRef will be null
2547
+ // we check the "context" to avoid running detectChanges during this phase.
2548
+ // becuase there's nothing to check
2549
+ if (cd['context']) {
2550
+ cd.detectChanges();
2551
+ }
2552
+ }
2553
+ }
2554
+ },
2555
+ get: () => ref$.value,
2556
+ });
2557
+ return Object.assign(ref, { subscribe, $, children$, useCDR: (cdr) => void cdRefs.push(cdr) });
2558
+ }
2559
+
2472
2560
  /**
2473
2561
  * Generated bundle index. Do not edit.
2474
2562
  */
2475
2563
 
2476
- export { NGT_CATALOGUE, NgtArgs, NgtCanvas, NgtCanvasContainer, NgtRepeat, extend };
2564
+ export { NGT_CATALOGUE, NgtArgs, NgtCanvas, NgtCanvasContainer, NgtRepeat, NgtRxStore, NgtStore, checkNeedsUpdate, checkUpdate, extend, getLocalState, injectNgtDestroy, injectNgtLoader, injectNgtRef, invalidateInstance, is, prepare, rootStateMap, startWithUndefined, updateCamera };
2477
2565
  //# sourceMappingURL=angular-three.mjs.map