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

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.
@@ -1,22 +1,13 @@
1
- import { afterNextRender, booleanAttribute, ChangeDetectionStrategy, Component, CUSTOM_ELEMENTS_SCHEMA, Directive, inject, input, signal, untracked, viewChild, } from '@angular/core';
1
+ import { afterNextRender, booleanAttribute, Directive, ElementRef, inject, input, signal, untracked, } from '@angular/core';
2
2
  import { injectAutoEffect } from 'ngxtension/auto-effect';
3
- import { Group } from 'three';
4
3
  import { getLocalState } from '../instance';
5
- import { extend } from '../renderer';
6
- import { NgtObjectEvents, NgtObjectEventsHostDirective } from '../utils/object-events';
7
4
  import * as i0 from "@angular/core";
8
- import * as i1 from "../utils/object-events";
9
5
  export class NgtSelection {
10
6
  constructor() {
11
7
  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)));
8
+ this.source = signal([]);
9
+ this.selected = this.source.asReadonly();
10
+ this.update = this.source.update.bind(this.source);
20
11
  }
21
12
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.1.3", ngImport: i0, type: NgtSelection, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
22
13
  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 }); }
@@ -27,60 +18,48 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.1.3", ngImpor
27
18
  }] });
28
19
  export class NgtSelect {
29
20
  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 });
21
+ this.enabled = input(false, { transform: booleanAttribute, alias: 'ngtSelect' });
22
+ const elementRef = inject(ElementRef);
35
23
  const selection = inject(NgtSelection);
36
24
  const autoEffect = injectAutoEffect();
37
25
  afterNextRender(() => {
38
- objectEvents.ngtObjectEvents.set(this.groupRef());
39
26
  autoEffect(() => {
40
- const group = this.groupRef().nativeElement;
41
- const localState = getLocalState(group);
27
+ const host = elementRef.nativeElement;
28
+ if (!host)
29
+ return;
30
+ const localState = getLocalState(host);
42
31
  if (!localState)
43
32
  return;
44
33
  const enabled = this.enabled();
45
34
  if (!enabled)
46
35
  return;
47
- const [collection] = [untracked(selection.collection), localState.objects()];
36
+ // ngt-mesh[ngtSelect]
37
+ if (host.type === 'Mesh') {
38
+ selection.update((prev) => [...prev, host]);
39
+ return () => selection.update((prev) => prev.filter((el) => el !== host));
40
+ }
41
+ const [collection] = [untracked(selection.selected), localState.objects()];
48
42
  let changed = false;
49
43
  const current = [];
50
- group.traverse((child) => {
44
+ host.traverse((child) => {
51
45
  child.type === 'Mesh' && current.push(child);
52
46
  if (collection.indexOf(child) === -1)
53
47
  changed = true;
54
48
  });
55
49
  if (!changed)
56
50
  return;
57
- selection.select(...current);
51
+ selection.update((prev) => [...prev, ...current]);
58
52
  return () => {
59
- selection.unselect(...current);
53
+ selection.update((prev) => prev.filter((el) => !current.includes(el)));
60
54
  };
61
55
  }, { allowSignalWrites: true });
62
56
  });
63
57
  }
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 }); }
58
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.1.3", ngImport: i0, type: NgtSelect, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
59
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "18.1.3", type: NgtSelect, isStandalone: true, selector: "ngt-group[ngtSelect], ngt-mesh[ngtSelect]", inputs: { enabled: { classPropertyName: "enabled", publicName: "ngtSelect", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0 }); }
70
60
  }
71
61
  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
- }]
62
+ type: Directive,
63
+ args: [{ standalone: true, selector: 'ngt-group[ngtSelect], ngt-mesh[ngtSelect]' }]
85
64
  }], ctorParameters: () => [] });
86
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VsZWN0aW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9jb3JlL3NyYy9saWIvZGlyZWN0aXZlcy9zZWxlY3Rpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNOLGVBQWUsRUFDZixnQkFBZ0IsRUFDaEIsdUJBQXVCLEVBQ3ZCLFNBQVMsRUFDVCxzQkFBc0IsRUFDdEIsU0FBUyxFQUVULE1BQU0sRUFDTixLQUFLLEVBQ0wsTUFBTSxFQUNOLFNBQVMsRUFDVCxTQUFTLEdBQ1QsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDMUQsT0FBTyxFQUFFLEtBQUssRUFBWSxNQUFNLE9BQU8sQ0FBQztBQUN4QyxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQzVDLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFFckMsT0FBTyxFQUFFLGVBQWUsRUFBRSw0QkFBNEIsRUFBRSxNQUFNLHdCQUF3QixDQUFDOzs7QUFHdkYsTUFBTSxPQUFPLFlBQVk7SUFEekI7UUFFQyxZQUFPLEdBQUcsS0FBSyxDQUFDLElBQUksRUFBRSxFQUFFLEtBQUssRUFBRSxjQUFjLEVBQUUsU0FBUyxFQUFFLGdCQUFnQixFQUFFLENBQUMsQ0FBQztRQUV0RSxjQUFTLEdBQUcsTUFBTSxDQUF5QyxFQUFFLENBQUMsQ0FBQztRQUN2RSxlQUFVLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxVQUFVLEVBQUUsQ0FBQztLQVN6QztJQVBBLE1BQU0sQ0FBQyxHQUFHLE9BQStDO1FBQ3hELElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxDQUFDLEdBQUcsSUFBSSxFQUFFLEdBQUcsT0FBTyxDQUFDLENBQUMsQ0FBQztJQUN4RCxDQUFDO0lBRUQsUUFBUSxDQUFDLEdB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QkFBNEIsQ0FBQztvQkFDOUMsT0FBTyxFQUFFLENBQUMsc0JBQXNCLENBQUM7b0JBQ2pDLGVBQWUsRUFBRSx1QkFBdUIsQ0FBQyxNQUFNO2lCQUMvQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG5cdGFmdGVyTmV4dFJlbmRlcixcblx0Ym9vbGVhbkF0dHJpYnV0ZSxcblx0Q2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG5cdENvbXBvbmVudCxcblx0Q1VTVE9NX0VMRU1FTlRTX1NDSEVNQSxcblx0RGlyZWN0aXZlLFxuXHRFbGVtZW50UmVmLFxuXHRpbmplY3QsXG5cdGlucHV0LFxuXHRzaWduYWwsXG5cdHVudHJhY2tlZCxcblx0dmlld0NoaWxkLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IGluamVjdEF1dG9FZmZlY3QgfSBmcm9tICduZ3h0ZW5zaW9uL2F1dG8tZWZmZWN0JztcbmltcG9ydCB7IEdyb3VwLCBPYmplY3QzRCB9IGZyb20gJ3RocmVlJztcbmltcG9ydCB7IGdldExvY2FsU3RhdGUgfSBmcm9tICcuLi9pbnN0YW5jZSc7XG5pbXBvcnQgeyBleHRlbmQgfSBmcm9tICcuLi9yZW5kZXJlcic7XG5pbXBvcnQgeyBOZ3RHcm91cCB9IGZyb20gJy4uL3RocmVlLXR5cGVzJztcbmltcG9ydCB7IE5ndE9iamVjdEV2ZW50cywgTmd0T2JqZWN0RXZlbnRzSG9zdERpcmVjdGl2ZSB9IGZyb20gJy4uL3V0aWxzL29iamVjdC1ldmVudHMnO1xuXG5ARGlyZWN0aXZlKHsgc3RhbmRhbG9uZTogdHJ1ZSwgc2VsZWN0b3I6ICdbbmd0U2VsZWN0aW9uXScgfSlcbmV4cG9ydCBjbGFzcyBOZ3RTZWxlY3Rpb24ge1xuXHRlbmFibGVkID0gaW5wdXQodHJ1ZSwgeyBhbGlhczogJ25ndFNlbGVjdGlvbicsIHRyYW5zZm9ybTogYm9vbGVhbkF0dHJpYnV0ZSB9KTtcblxuXHRwcml2YXRlIHNlbGVjdGlvbiA9IHNpZ25hbDxBcnJheTxFbGVtZW50UmVmPE9iamVjdDNEPiB8IE9iamVjdDNEPj4oW10pO1xuXHRjb2xsZWN0aW9uID0gdGhpcy5zZWxlY3Rpb24uYXNSZWFkb25seSgpO1xuXG5cdHNlbGVjdCguLi5vYmplY3RzOiBBcnJheTxFbGVtZW50UmVmPE9iamVjdDNEPiB8IE9iamVjdDNEPikge1xuXHRcdHRoaXMuc2VsZWN0aW9uLnVwZGF0ZSgocHJldikgPT4gWy4uLnByZXYsIC4uLm9iamVjdHNdKTtcblx0fVxuXG5cdHVuc2VsZWN0KC4uLm9iamVjdHM6IEFycmF5PEVsZW1lbnRSZWY8T2JqZWN0M0Q+IHwgT2JqZWN0M0Q+KSB7XG5cdFx0dGhpcy5zZWxlY3Rpb24udXBkYXRlKChwcmV2KSA9PiBwcmV2LmZpbHRlcigoc2VsZWN0ZWQpID0+ICFvYmplY3RzLmluY2x1ZGVzKHNlbGVjdGVkKSkpO1xuXHR9XG59XG5cbkBDb21wb25lbnQoe1xuXHRzZWxlY3RvcjogJ25ndC1zZWxlY3QnLFxuXHRzdGFuZGFsb25lOiB0cnVlLFxuXHR0ZW1wbGF0ZTogYFxuXHRcdDxuZ3QtZ3JvdXAgI2dyb3VwIFtwYXJhbWV0ZXJzXT1cIm9wdGlvbnMoKVwiPlxuXHRcdFx0PG5nLWNvbnRlbnQgLz5cblx0XHQ8L25ndC1ncm91cD5cblx0YCxcblx0aG9zdERpcmVjdGl2ZXM6IFtOZ3RPYmplY3RFdmVudHNIb3N0RGlyZWN0aXZlXSxcblx0c2NoZW1hczogW0NVU1RPTV9FTEVNRU5UU19TQ0hFTUFdLFxuXHRjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbn0pXG5leHBvcnQgY2xhc3MgTmd0U2VsZWN0IHtcblx0ZW5hYmxlZCA9IGlucHV0KGZhbHNlLCB7IHRyYW5zZm9ybTogYm9vbGVhbkF0dHJpYnV0ZSB9KTtcblx0b3B0aW9ucyA9IGlucHV0KHt9IGFzIFBhcnRpYWw8Tmd0R3JvdXA+KTtcblxuXHRncm91cFJlZiA9IHZpZXdDaGlsZC5yZXF1aXJlZDxFbGVtZW50UmVmPEdyb3VwPj4oJ2dyb3VwJyk7XG5cblx0Y29uc3RydWN0b3IoKSB7XG5cdFx0ZXh0ZW5kKHsgR3JvdXAgfSk7XG5cblx0XHRjb25zdCBvYmplY3RFdmVudHMgPSBpbmplY3QoTmd0T2JqZWN0RXZlbnRzLCB7IGhvc3Q6IHRydWUgfSk7XG5cdFx0Y29uc3Qgc2VsZWN0aW9uID0gaW5qZWN0KE5ndFNlbGVjdGlvbik7XG5cdFx0Y29uc3QgYXV0b0VmZmVjdCA9IGluamVjdEF1dG9FZmZlY3QoKTtcblxuXHRcdGFmdGVyTmV4dFJlbmRlcigoKSA9PiB7XG5cdFx0XHRvYmplY3RFdmVudHMubmd0T2JqZWN0RXZlbnRzLnNldCh0aGlzLmdyb3VwUmVmKCkpO1xuXG5cdFx0XHRhdXRvRWZmZWN0KFxuXHRcdFx0XHQoKSA9PiB7XG5cdFx0XHRcdFx0Y29uc3QgZ3JvdXAgPSB0aGlzLmdyb3VwUmVmKCkubmF0aXZlRWxlbWVudDtcblx0XHRcdFx0XHRjb25zdCBsb2NhbFN0YXRlID0gZ2V0TG9jYWxTdGF0ZShncm91cCk7XG5cdFx0XHRcdFx0aWYgKCFsb2NhbFN0YXRlKSByZXR1cm47XG5cblx0XHRcdFx0XHRjb25zdCBlbmFibGVkID0gdGhpcy5lbmFibGVkKCk7XG5cdFx0XHRcdFx0aWYgKCFlbmFibGVkKSByZXR1cm47XG5cblx0XHRcdFx0XHRjb25zdCBbY29sbGVjdGlvbl0gPSBbdW50cmFja2VkKHNlbGVjdGlvbi5jb2xsZWN0aW9uKSwgbG9jYWxTdGF0ZS5vYmplY3RzKCldO1xuXHRcdFx0XHRcdGxldCBjaGFuZ2VkID0gZmFsc2U7XG5cdFx0XHRcdFx0Y29uc3QgY3VycmVudDogT2JqZWN0M0RbXSA9IFtdO1xuXHRcdFx0XHRcdGdyb3VwLnRyYXZlcnNlKChjaGlsZCkgPT4ge1xuXHRcdFx0XHRcdFx0Y2hpbGQudHlwZSA9PT0gJ01lc2gnICYmIGN1cnJlbnQucHVzaChjaGlsZCk7XG5cdFx0XHRcdFx0XHRpZiAoY29sbGVjdGlvbi5pbmRleE9mKGNoaWxkKSA9PT0gLTEpIGNoYW5nZWQgPSB0cnVlO1xuXHRcdFx0XHRcdH0pO1xuXG5cdFx0XHRcdFx0aWYgKCFjaGFuZ2VkKSByZXR1cm47XG5cblx0XHRcdFx0XHRzZWxlY3Rpb24uc2VsZWN0KC4uLmN1cnJlbnQpO1xuXHRcdFx0XHRcdHJldHVybiAoKSA9PiB7XG5cdFx0XHRcdFx0XHRzZWxlY3Rpb24udW5zZWxlY3QoLi4uY3VycmVudCk7XG5cdFx0XHRcdFx0fTtcblx0XHRcdFx0fSxcblx0XHRcdFx0eyBhbGxvd1NpZ25hbFdyaXRlczogdHJ1ZSB9LFxuXHRcdFx0KTtcblx0XHR9KTtcblx0fVxufVxuIl19
65
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VsZWN0aW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9jb3JlL3NyYy9saWIvZGlyZWN0aXZlcy9zZWxlY3Rpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNOLGVBQWUsRUFDZixnQkFBZ0IsRUFDaEIsU0FBUyxFQUNULFVBQVUsRUFDVixNQUFNLEVBQ04sS0FBSyxFQUNMLE1BQU0sRUFDTixTQUFTLEdBQ1QsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFFMUQsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGFBQWEsQ0FBQzs7QUFHNUMsTUFBTSxPQUFPLFlBQVk7SUFEekI7UUFFQyxZQUFPLEdBQUcsS0FBSyxDQUFDLElBQUksRUFBRSxFQUFFLEtBQUssRUFBRSxjQUFjLEVBQUUsU0FBUyxFQUFFLGdCQUFnQixFQUFFLENBQUMsQ0FBQztRQUN0RSxXQUFNLEdBQUcsTUFBTSxDQUF5QyxFQUFFLENBQUMsQ0FBQztRQUNwRSxhQUFRLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUNwQyxXQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztLQUM5Qzs4R0FMWSxZQUFZO2tHQUFaLFlBQVk7OzJGQUFaLFlBQVk7a0JBRHhCLFNBQVM7bUJBQUMsRUFBRSxVQUFVLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxnQkFBZ0IsRUFBRTs7QUFTM0QsTUFBTSxPQUFPLFNBQVM7SUFHckI7UUFGQSxZQUFPLEdBQUcsS0FBSyxDQUFDLEtBQUssRUFBRSxFQUFFLFNBQVMsRUFBRSxnQkFBZ0IsRUFBRSxLQUFLLEVBQUUsV0FBVyxFQUFFLENBQUMsQ0FBQztRQUczRSxNQUFNLFVBQVUsR0FBRyxNQUFNLENBQTJCLFVBQVUsQ0FBQyxDQUFDO1FBQ2hFLE1BQU0sU0FBUyxHQUFHLE1BQU0sQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUN2QyxNQUFNLFVBQVUsR0FBRyxnQkFBZ0IsRUFBRSxDQUFDO1FBRXRDLGVBQWUsQ0FBQyxHQUFHLEVBQUU7WUFDcEIsVUFBVSxDQUNULEdBQUcsRUFBRTtnQkFDSixNQUFNLElBQUksR0FBRyxVQUFVLENBQUMsYUFBYSxDQUFDO2dCQUN0QyxJQUFJLENBQUMsSUFBSTtvQkFBRSxPQUFPO2dCQUVsQixNQUFNLFVBQVUsR0FBRyxhQUFhLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQ3ZDLElBQUksQ0FBQyxVQUFVO29CQUFFLE9BQU87Z0JBRXhCLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztnQkFDL0IsSUFBSSxDQUFDLE9BQU87b0JBQUUsT0FBTztnQkFFckIsc0JBQXNCO2dCQUN0QixJQUFJLElBQUksQ0FBQyxJQUFJLEtBQUssTUFBTSxFQUFFLENBQUM7b0JBQzFCLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQUMsR0FBRyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQztvQkFDNUMsT0FBTyxHQUFHLEVBQUUsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEtBQUssSUFBSSxDQUFDLENBQUMsQ0FBQztnQkFDM0UsQ0FBQztnQkFFRCxNQUFNLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO2dCQUMzRSxJQUFJLE9BQU8sR0FBRyxLQUFLLENBQUM7Z0JBQ3BCLE1BQU0sT0FBTyxHQUFlLEVBQUUsQ0FBQztnQkFDL0IsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFO29CQUN2QixLQUFLLENBQUMsSUFBSSxLQUFLLE1BQU0sSUFBSSxPQUFPLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO29CQUM3QyxJQUFJLFVBQVUsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO3dCQUFFLE9BQU8sR0FBRyxJQUFJLENBQUM7Z0JBQ3RELENBQUMsQ0FBQyxDQUFDO2dCQUVILElBQUksQ0FBQyxPQUFPO29CQUFFLE9BQU87Z0JBRXJCLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQUMsR0FBRyxJQUFJLEVBQUUsR0FBRyxPQUFPLENBQUMsQ0FBQyxDQUFDO2dCQUNsRCxPQUFPLEdBQUcsRUFBRTtvQkFDWCxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsRUFBYyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUNwRixDQUFDLENBQUM7WUFDSCxDQUFDLEVBQ0QsRUFBRSxpQkFBaUIsRUFBRSxJQUFJLEVBQUUsQ0FDM0IsQ0FBQztRQUNILENBQUMsQ0FBQyxDQUFDO0lBQ0osQ0FBQzs4R0E1Q1csU0FBUztrR0FBVCxTQUFTOzsyRkFBVCxTQUFTO2tCQURyQixTQUFTO21CQUFDLEVBQUUsVUFBVSxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsMkNBQTJDLEVBQUUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuXHRhZnRlck5leHRSZW5kZXIsXG5cdGJvb2xlYW5BdHRyaWJ1dGUsXG5cdERpcmVjdGl2ZSxcblx0RWxlbWVudFJlZixcblx0aW5qZWN0LFxuXHRpbnB1dCxcblx0c2lnbmFsLFxuXHR1bnRyYWNrZWQsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgaW5qZWN0QXV0b0VmZmVjdCB9IGZyb20gJ25neHRlbnNpb24vYXV0by1lZmZlY3QnO1xuaW1wb3J0IHsgR3JvdXAsIE1lc2gsIE9iamVjdDNEIH0gZnJvbSAndGhyZWUnO1xuaW1wb3J0IHsgZ2V0TG9jYWxTdGF0ZSB9IGZyb20gJy4uL2luc3RhbmNlJztcblxuQERpcmVjdGl2ZSh7IHN0YW5kYWxvbmU6IHRydWUsIHNlbGVjdG9yOiAnW25ndFNlbGVjdGlvbl0nIH0pXG5leHBvcnQgY2xhc3MgTmd0U2VsZWN0aW9uIHtcblx0ZW5hYmxlZCA9IGlucHV0KHRydWUsIHsgYWxpYXM6ICduZ3RTZWxlY3Rpb24nLCB0cmFuc2Zvcm06IGJvb2xlYW5BdHRyaWJ1dGUgfSk7XG5cdHByaXZhdGUgc291cmNlID0gc2lnbmFsPEFycmF5PEVsZW1lbnRSZWY8T2JqZWN0M0Q+IHwgT2JqZWN0M0Q+PihbXSk7XG5cdHNlbGVjdGVkID0gdGhpcy5zb3VyY2UuYXNSZWFkb25seSgpO1xuXHR1cGRhdGUgPSB0aGlzLnNvdXJjZS51cGRhdGUuYmluZCh0aGlzLnNvdXJjZSk7XG59XG5cbkBEaXJlY3RpdmUoeyBzdGFuZGFsb25lOiB0cnVlLCBzZWxlY3RvcjogJ25ndC1ncm91cFtuZ3RTZWxlY3RdLCBuZ3QtbWVzaFtuZ3RTZWxlY3RdJyB9KVxuZXhwb3J0IGNsYXNzIE5ndFNlbGVjdCB7XG5cdGVuYWJsZWQgPSBpbnB1dChmYWxzZSwgeyB0cmFuc2Zvcm06IGJvb2xlYW5BdHRyaWJ1dGUsIGFsaWFzOiAnbmd0U2VsZWN0JyB9KTtcblxuXHRjb25zdHJ1Y3RvcigpIHtcblx0XHRjb25zdCBlbGVtZW50UmVmID0gaW5qZWN0PEVsZW1lbnRSZWY8R3JvdXAgfCBNZXNoPj4oRWxlbWVudFJlZik7XG5cdFx0Y29uc3Qgc2VsZWN0aW9uID0gaW5qZWN0KE5ndFNlbGVjdGlvbik7XG5cdFx0Y29uc3QgYXV0b0VmZmVjdCA9IGluamVjdEF1dG9FZmZlY3QoKTtcblxuXHRcdGFmdGVyTmV4dFJlbmRlcigoKSA9PiB7XG5cdFx0XHRhdXRvRWZmZWN0KFxuXHRcdFx0XHQoKSA9PiB7XG5cdFx0XHRcdFx0Y29uc3QgaG9zdCA9IGVsZW1lbnRSZWYubmF0aXZlRWxlbWVudDtcblx0XHRcdFx0XHRpZiAoIWhvc3QpIHJldHVybjtcblxuXHRcdFx0XHRcdGNvbnN0IGxvY2FsU3RhdGUgPSBnZXRMb2NhbFN0YXRlKGhvc3QpO1xuXHRcdFx0XHRcdGlmICghbG9jYWxTdGF0ZSkgcmV0dXJuO1xuXG5cdFx0XHRcdFx0Y29uc3QgZW5hYmxlZCA9IHRoaXMuZW5hYmxlZCgpO1xuXHRcdFx0XHRcdGlmICghZW5hYmxlZCkgcmV0dXJuO1xuXG5cdFx0XHRcdFx0Ly8gbmd0LW1lc2hbbmd0U2VsZWN0XVxuXHRcdFx0XHRcdGlmIChob3N0LnR5cGUgPT09ICdNZXNoJykge1xuXHRcdFx0XHRcdFx0c2VsZWN0aW9uLnVwZGF0ZSgocHJldikgPT4gWy4uLnByZXYsIGhvc3RdKTtcblx0XHRcdFx0XHRcdHJldHVybiAoKSA9PiBzZWxlY3Rpb24udXBkYXRlKChwcmV2KSA9PiBwcmV2LmZpbHRlcigoZWwpID0+IGVsICE9PSBob3N0KSk7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0Y29uc3QgW2NvbGxlY3Rpb25dID0gW3VudHJhY2tlZChzZWxlY3Rpb24uc2VsZWN0ZWQpLCBsb2NhbFN0YXRlLm9iamVjdHMoKV07XG5cdFx0XHRcdFx0bGV0IGNoYW5nZWQgPSBmYWxzZTtcblx0XHRcdFx0XHRjb25zdCBjdXJyZW50OiBPYmplY3QzRFtdID0gW107XG5cdFx0XHRcdFx0aG9zdC50cmF2ZXJzZSgoY2hpbGQpID0+IHtcblx0XHRcdFx0XHRcdGNoaWxkLnR5cGUgPT09ICdNZXNoJyAmJiBjdXJyZW50LnB1c2goY2hpbGQpO1xuXHRcdFx0XHRcdFx0aWYgKGNvbGxlY3Rpb24uaW5kZXhPZihjaGlsZCkgPT09IC0xKSBjaGFuZ2VkID0gdHJ1ZTtcblx0XHRcdFx0XHR9KTtcblxuXHRcdFx0XHRcdGlmICghY2hhbmdlZCkgcmV0dXJuO1xuXG5cdFx0XHRcdFx0c2VsZWN0aW9uLnVwZGF0ZSgocHJldikgPT4gWy4uLnByZXYsIC4uLmN1cnJlbnRdKTtcblx0XHRcdFx0XHRyZXR1cm4gKCkgPT4ge1xuXHRcdFx0XHRcdFx0c2VsZWN0aW9uLnVwZGF0ZSgocHJldikgPT4gcHJldi5maWx0ZXIoKGVsKSA9PiAhY3VycmVudC5pbmNsdWRlcyhlbCBhcyBPYmplY3QzRCkpKTtcblx0XHRcdFx0XHR9O1xuXHRcdFx0XHR9LFxuXHRcdFx0XHR7IGFsbG93U2lnbmFsV3JpdGVzOiB0cnVlIH0sXG5cdFx0XHQpO1xuXHRcdH0pO1xuXHR9XG59XG4iXX0=
@@ -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, model, Renderer2, CUSTOM_ELEMENTS_SCHEMA, Pipe, contentChild } 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, Pipe, CUSTOM_ELEMENTS_SCHEMA, contentChild, model, Renderer2 } 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, Group, 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, 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,111 +2515,12 @@ 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
2518
  class NgtSelection {
2613
2519
  constructor() {
2614
2520
  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)));
2521
+ this.source = signal([]);
2522
+ this.selected = this.source.asReadonly();
2523
+ this.update = this.source.update.bind(this.source);
2623
2524
  }
2624
2525
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.1.3", ngImport: i0, type: NgtSelection, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
2625
2526
  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 }); }
@@ -2630,61 +2531,49 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.1.3", ngImpor
2630
2531
  }] });
2631
2532
  class NgtSelect {
2632
2533
  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 });
2534
+ this.enabled = input(false, { transform: booleanAttribute, alias: 'ngtSelect' });
2535
+ const elementRef = inject(ElementRef);
2638
2536
  const selection = inject(NgtSelection);
2639
2537
  const autoEffect = injectAutoEffect();
2640
2538
  afterNextRender(() => {
2641
- objectEvents.ngtObjectEvents.set(this.groupRef());
2642
2539
  autoEffect(() => {
2643
- const group = this.groupRef().nativeElement;
2644
- const localState = getLocalState(group);
2540
+ const host = elementRef.nativeElement;
2541
+ if (!host)
2542
+ return;
2543
+ const localState = getLocalState(host);
2645
2544
  if (!localState)
2646
2545
  return;
2647
2546
  const enabled = this.enabled();
2648
2547
  if (!enabled)
2649
2548
  return;
2650
- const [collection] = [untracked(selection.collection), localState.objects()];
2549
+ // ngt-mesh[ngtSelect]
2550
+ if (host.type === 'Mesh') {
2551
+ selection.update((prev) => [...prev, host]);
2552
+ return () => selection.update((prev) => prev.filter((el) => el !== host));
2553
+ }
2554
+ const [collection] = [untracked(selection.selected), localState.objects()];
2651
2555
  let changed = false;
2652
2556
  const current = [];
2653
- group.traverse((child) => {
2557
+ host.traverse((child) => {
2654
2558
  child.type === 'Mesh' && current.push(child);
2655
2559
  if (collection.indexOf(child) === -1)
2656
2560
  changed = true;
2657
2561
  });
2658
2562
  if (!changed)
2659
2563
  return;
2660
- selection.select(...current);
2564
+ selection.update((prev) => [...prev, ...current]);
2661
2565
  return () => {
2662
- selection.unselect(...current);
2566
+ selection.update((prev) => prev.filter((el) => !current.includes(el)));
2663
2567
  };
2664
2568
  }, { allowSignalWrites: true });
2665
2569
  });
2666
2570
  }
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 }); }
2571
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.1.3", ngImport: i0, type: NgtSelect, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
2572
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "18.1.3", type: NgtSelect, isStandalone: true, selector: "ngt-group[ngtSelect], ngt-mesh[ngtSelect]", inputs: { enabled: { classPropertyName: "enabled", publicName: "ngtSelect", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0 }); }
2673
2573
  }
2674
2574
  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
- }]
2575
+ type: Directive,
2576
+ args: [{ standalone: true, selector: 'ngt-group[ngtSelect], ngt-mesh[ngtSelect]' }]
2688
2577
  }], ctorParameters: () => [] });
2689
2578
 
2690
2579
  var _a;
@@ -3096,6 +2985,100 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.1.3", ngImpor
3096
2985
  }]
3097
2986
  }], ctorParameters: () => [] });
3098
2987
 
2988
+ function resolveRef(ref) {
2989
+ if (is.ref(ref)) {
2990
+ return ref.nativeElement;
2991
+ }
2992
+ return ref;
2993
+ }
2994
+
2995
+ class NgtObjectEvents {
2996
+ constructor() {
2997
+ this.click = output();
2998
+ this.dblclick = output();
2999
+ this.contextmenu = output();
3000
+ this.pointerup = output();
3001
+ this.pointerdown = output();
3002
+ this.pointerover = output();
3003
+ this.pointerout = output();
3004
+ this.pointerenter = output();
3005
+ this.pointerleave = output();
3006
+ this.pointermove = output();
3007
+ this.pointermissed = output();
3008
+ this.pointercancel = output();
3009
+ this.wheel = output();
3010
+ // NOTE: we use model here to allow for the hostDirective host to set this value
3011
+ this.ngtObjectEvents = model();
3012
+ const injector = inject(Injector);
3013
+ afterNextRender(() => {
3014
+ injectObjectEvents(this.ngtObjectEvents, {
3015
+ click: (event) => this.click.emit(event),
3016
+ dblclick: (event) => this.dblclick.emit(event),
3017
+ contextmenu: (event) => this.contextmenu.emit(event),
3018
+ pointerup: (event) => this.pointerup.emit(event),
3019
+ pointerdown: (event) => this.pointerdown.emit(event),
3020
+ pointerover: (event) => this.pointerover.emit(event),
3021
+ pointerout: (event) => this.pointerout.emit(event),
3022
+ pointerenter: (event) => this.pointerenter.emit(event),
3023
+ pointerleave: (event) => this.pointerleave.emit(event),
3024
+ pointermove: (event) => this.pointermove.emit(event),
3025
+ pointermissed: (event) => this.pointermissed.emit(event),
3026
+ pointercancel: (event) => this.pointercancel.emit(event),
3027
+ wheel: (event) => this.wheel.emit(event),
3028
+ }, { injector });
3029
+ });
3030
+ }
3031
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.1.3", ngImport: i0, type: NgtObjectEvents, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
3032
+ 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 }); }
3033
+ }
3034
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.1.3", ngImport: i0, type: NgtObjectEvents, decorators: [{
3035
+ type: Directive,
3036
+ args: [{ standalone: true, selector: '[ngtObjectEvents]' }]
3037
+ }], ctorParameters: () => [] });
3038
+ const NgtObjectEventsHostDirective = {
3039
+ directive: NgtObjectEvents,
3040
+ inputs: ['ngtObjectEvents'],
3041
+ outputs: [
3042
+ 'click',
3043
+ 'dblclick',
3044
+ 'contextmenu',
3045
+ 'pointerup',
3046
+ 'pointerdown',
3047
+ 'pointerover',
3048
+ 'pointerout',
3049
+ 'pointerenter',
3050
+ 'pointerleave',
3051
+ 'pointermove',
3052
+ 'pointermissed',
3053
+ 'pointercancel',
3054
+ 'wheel',
3055
+ ],
3056
+ };
3057
+ function injectObjectEvents(target, events, { injector } = {}) {
3058
+ return assertInjector(injectObjectEvents, injector, () => {
3059
+ const autoEffect = injectAutoEffect();
3060
+ const renderer = inject(Renderer2);
3061
+ const cleanUps = [];
3062
+ afterNextRender(() => {
3063
+ autoEffect(() => {
3064
+ const targetRef = resolveRef(target());
3065
+ if (!targetRef)
3066
+ return;
3067
+ Object.entries(events).forEach(([eventName, eventHandler]) => {
3068
+ cleanUps.push(renderer.listen(targetRef, eventName, eventHandler));
3069
+ });
3070
+ return () => {
3071
+ cleanUps.forEach((cleanUp) => cleanUp());
3072
+ };
3073
+ });
3074
+ });
3075
+ inject(DestroyRef).onDestroy(() => {
3076
+ cleanUps.forEach((cleanUp) => cleanUp());
3077
+ });
3078
+ return cleanUps;
3079
+ });
3080
+ }
3081
+
3099
3082
  function omit(objFn, keysToOmit) {
3100
3083
  return computed(() => {
3101
3084
  const obj = objFn();