@foblex/flow 17.9.3 → 17.9.6

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,50 +1,56 @@
1
1
  import { __decorate } from "tslib";
2
- import { booleanAttribute, Directive, inject, Input, numberAttribute, Renderer2, } from "@angular/core";
2
+ import { booleanAttribute, Directive, effect, inject, Injector, input, Input, numberAttribute, untracked, } from '@angular/core';
3
3
  import { F_ZOOM, FZoomBase } from './f-zoom-base';
4
4
  import { FMediator } from '@foblex/mediator';
5
5
  import { AddZoomToStoreRequest, defaultEventTrigger, Deprecated, GetCanvasRequest, GetFlowHostElementRequest, isValidEventTrigger, RemoveZoomFromStoreRequest, ResetZoomRequest, SetZoomRequest, } from '../domain';
6
6
  import { PointExtensions, RectExtensions } from '@foblex/2d';
7
7
  import { isNode } from '../f-node';
8
8
  import { EFZoomDirection } from './e-f-zoom-direction';
9
+ import { EventExtensions } from '../drag-toolkit';
9
10
  import * as i0 from "@angular/core";
10
11
  export class FZoomDirective extends FZoomBase {
11
- _fMediator = inject(FMediator);
12
- _rendered = inject(Renderer2);
13
- _triggersListener = [];
14
- isEnabled = false;
12
+ _mediator = inject(FMediator);
13
+ _injector = inject(Injector);
14
+ _triggersListener = EventExtensions.emptyListener();
15
+ isEnabled = input(false, { alias: 'fZoom', transform: booleanAttribute });
15
16
  fWheelTrigger = defaultEventTrigger;
16
17
  fDblClickTrigger = defaultEventTrigger;
17
18
  minimum = 0.1;
18
19
  maximum = 4;
19
20
  step = 0.1;
20
21
  dblClickStep = 0.5;
21
- get _fHost() {
22
- return this._fMediator.execute(new GetFlowHostElementRequest());
22
+ get _hostElement() {
23
+ return this._mediator.execute(new GetFlowHostElementRequest());
23
24
  }
24
- get _fCanvas() {
25
- return this._fMediator.execute(new GetCanvasRequest());
25
+ get _canvas() {
26
+ return this._mediator.execute(new GetCanvasRequest());
26
27
  }
27
28
  ngOnInit() {
28
- this._fMediator.execute(new AddZoomToStoreRequest(this));
29
+ this._mediator.execute(new AddZoomToStoreRequest(this));
29
30
  }
30
31
  ngAfterViewInit() {
31
- this._listenTriggers();
32
+ this._listenZoomEnabledChanges();
32
33
  }
33
- ngOnChanges(changes) {
34
- if (changes['isEnabled']) {
35
- this._listenTriggers();
36
- }
34
+ _listenZoomEnabledChanges() {
35
+ effect(() => {
36
+ this.isEnabled();
37
+ untracked(() => this._listenTriggers());
38
+ }, { injector: this._injector });
37
39
  }
38
40
  _listenTriggers() {
39
- if (!this._fHost) {
41
+ if (!this._hostElement) {
40
42
  return;
41
43
  }
42
44
  this._disposeListeners();
43
- if (!this.isEnabled) {
45
+ if (!this.isEnabled()) {
44
46
  return;
45
47
  }
46
- this._triggersListener.push(this._rendered.listen(this._fHost, 'wheel', this._onWheel));
47
- this._triggersListener.push(this._rendered.listen(this._fHost, 'dblclick', this._onDoubleClick));
48
+ this._listen('wheel', this._onWheel, EventExtensions.activeListener());
49
+ this._listen('dblclick', this._onDoubleClick);
50
+ this._triggersListener = () => {
51
+ this._unlisten('wheel', this._onWheel, EventExtensions.activeListener());
52
+ this._unlisten('dblclick', this._onDoubleClick);
53
+ };
48
54
  }
49
55
  _onWheel = (event) => {
50
56
  if (!isValidEventTrigger(event, this.fWheelTrigger)) {
@@ -87,10 +93,10 @@ export class FZoomDirective extends FZoomBase {
87
93
  this._onZoomToCenter(EFZoomDirection.ZOOM_OUT, position);
88
94
  }
89
95
  _onZoomToCenter(direction, position) {
90
- this.setZoom(this._getToCenterPosition(position, RectExtensions.fromElement(this._fHost)), this.step, direction, false);
96
+ this.setZoom(this._getToCenterPosition(position, RectExtensions.fromElement(this._hostElement)), this.step, direction, false);
91
97
  }
92
98
  setZoom(position, step, direction, animated) {
93
- this._fMediator.execute(new SetZoomRequest(position, step, direction, animated));
99
+ this._mediator.execute(new SetZoomRequest(position, step, direction, animated));
94
100
  }
95
101
  /**
96
102
  * @deprecated Method "getScale" is deprecated. Use "getZoomValue" instead. This method will be removed in version 18.0.0.`,
@@ -99,21 +105,27 @@ export class FZoomDirective extends FZoomBase {
99
105
  return this.getZoomValue();
100
106
  }
101
107
  getZoomValue() {
102
- return this._fCanvas.transform.scale || 1;
108
+ return this._canvas.transform.scale || 1;
103
109
  }
104
110
  reset() {
105
- this._fMediator.execute(new ResetZoomRequest());
111
+ this._mediator.execute(new ResetZoomRequest());
106
112
  }
107
113
  _disposeListeners() {
108
- this._triggersListener.forEach((listener) => listener());
109
- this._triggersListener = [];
114
+ this._triggersListener();
115
+ this._triggersListener = EventExtensions.emptyListener();
110
116
  }
111
117
  ngOnDestroy() {
112
118
  this._disposeListeners();
113
- this._fMediator.execute(new RemoveZoomFromStoreRequest());
119
+ this._mediator.execute(new RemoveZoomFromStoreRequest());
120
+ }
121
+ _listen(type, listener, options) {
122
+ this._hostElement.addEventListener(type, listener, options);
123
+ }
124
+ _unlisten(type, listener, options) {
125
+ this._hostElement.removeEventListener(type, listener, options);
114
126
  }
115
127
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: FZoomDirective, deps: null, target: i0.ɵɵFactoryTarget.Directive });
116
- static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "16.1.0", version: "18.2.13", type: FZoomDirective, isStandalone: true, selector: "f-canvas[fZoom]", inputs: { isEnabled: ["fZoom", "isEnabled", booleanAttribute], fWheelTrigger: "fWheelTrigger", fDblClickTrigger: "fDblClickTrigger", minimum: ["fZoomMinimum", "minimum", numberAttribute], maximum: ["fZoomMaximum", "maximum", numberAttribute], step: ["fZoomStep", "step", numberAttribute], dblClickStep: ["fZoomDblClickStep", "dblClickStep", numberAttribute] }, host: { classAttribute: "f-zoom f-component" }, providers: [{ provide: F_ZOOM, useExisting: FZoomDirective }], exportAs: ["fComponent"], usesInheritance: true, usesOnChanges: true, ngImport: i0 });
128
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "18.2.13", type: FZoomDirective, isStandalone: true, selector: "f-canvas[fZoom]", inputs: { isEnabled: { classPropertyName: "isEnabled", publicName: "fZoom", isSignal: true, isRequired: false, transformFunction: null }, fWheelTrigger: { classPropertyName: "fWheelTrigger", publicName: "fWheelTrigger", isSignal: false, isRequired: false, transformFunction: null }, fDblClickTrigger: { classPropertyName: "fDblClickTrigger", publicName: "fDblClickTrigger", isSignal: false, isRequired: false, transformFunction: null }, minimum: { classPropertyName: "minimum", publicName: "fZoomMinimum", isSignal: false, isRequired: false, transformFunction: numberAttribute }, maximum: { classPropertyName: "maximum", publicName: "fZoomMaximum", isSignal: false, isRequired: false, transformFunction: numberAttribute }, step: { classPropertyName: "step", publicName: "fZoomStep", isSignal: false, isRequired: false, transformFunction: numberAttribute }, dblClickStep: { classPropertyName: "dblClickStep", publicName: "fZoomDblClickStep", isSignal: false, isRequired: false, transformFunction: numberAttribute } }, host: { classAttribute: "f-zoom f-component" }, providers: [{ provide: F_ZOOM, useExisting: FZoomDirective }], exportAs: ["fComponent"], usesInheritance: true, ngImport: i0 });
117
129
  }
118
130
  __decorate([
119
131
  Deprecated('getZoomValue')
@@ -121,7 +133,7 @@ __decorate([
121
133
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: FZoomDirective, decorators: [{
122
134
  type: Directive,
123
135
  args: [{
124
- selector: "f-canvas[fZoom]",
136
+ selector: 'f-canvas[fZoom]',
125
137
  exportAs: 'fComponent',
126
138
  standalone: true,
127
139
  host: {
@@ -129,10 +141,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
129
141
  },
130
142
  providers: [{ provide: F_ZOOM, useExisting: FZoomDirective }],
131
143
  }]
132
- }], propDecorators: { isEnabled: [{
133
- type: Input,
134
- args: [{ alias: 'fZoom', transform: booleanAttribute }]
135
- }], fWheelTrigger: [{
144
+ }], propDecorators: { fWheelTrigger: [{
136
145
  type: Input
137
146
  }], fDblClickTrigger: [{
138
147
  type: Input
@@ -149,4 +158,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
149
158
  type: Input,
150
159
  args: [{ alias: 'fZoomDblClickStep', transform: numberAttribute }]
151
160
  }], getScale: [] } });
152
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZi16b29tLmRpcmVjdGl2ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL2YtZmxvdy9zcmMvZi16b29tL2Ytem9vbS5kaXJlY3RpdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFFTCxnQkFBZ0IsRUFDaEIsU0FBUyxFQUNULE1BQU0sRUFDTixLQUFLLEVBQ0wsZUFBZSxFQUlmLFNBQVMsR0FFVixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNsRCxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDN0MsT0FBTyxFQUNMLHFCQUFxQixFQUFFLG1CQUFtQixFQUMxQyxVQUFVLEVBRVYsZ0JBQWdCLEVBQ2hCLHlCQUF5QixFQUFFLG1CQUFtQixFQUM5QywwQkFBMEIsRUFDMUIsZ0JBQWdCLEVBQ2hCLGNBQWMsR0FDZixNQUFNLFdBQVcsQ0FBQztBQUVuQixPQUFPLEVBQWlCLGVBQWUsRUFBRSxjQUFjLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFDNUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUNuQyxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7O0FBV3ZELE1BQU0sT0FBTyxjQUFlLFNBQVEsU0FBUztJQUVuQyxVQUFVLEdBQUcsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQy9CLFNBQVMsR0FBRyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUM7SUFFOUIsaUJBQWlCLEdBQW1CLEVBQUUsQ0FBQztJQUd4QyxTQUFTLEdBQVksS0FBSyxDQUFDO0lBRzNCLGFBQWEsR0FBa0IsbUJBQW1CLENBQUM7SUFHbkQsZ0JBQWdCLEdBQWtCLG1CQUFtQixDQUFDO0lBRzdDLE9BQU8sR0FBVyxHQUFHLENBQUM7SUFHdEIsT0FBTyxHQUFXLENBQUMsQ0FBQztJ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RUFBRSxNQUFNLEVBQUUsV0FBVyxFQUFFLGNBQWMsRUFBRSxDQUFFOztBQStJeEQ7SUFETixVQUFVLENBQUMsY0FBYyxDQUFDOzhDQUcxQjs0RkEvSVUsY0FBYztrQkFUMUIsU0FBUzttQkFBQztvQkFDVCxRQUFRLEVBQUUsaUJBQWlCO29CQUMzQixRQUFRLEVBQUUsWUFBWTtvQkFDdEIsVUFBVSxFQUFFLElBQUk7b0JBQ2hCLElBQUksRUFBRTt3QkFDSixPQUFPLEVBQUUsb0JBQW9CO3FCQUM5QjtvQkFDRCxTQUFTLEVBQUUsQ0FBRSxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsV0FBVyxnQkFBZ0IsRUFBRSxDQUFFO2lCQUNoRTs4QkFTUSxTQUFTO3NCQURmLEtBQUs7dUJBQUMsRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxnQkFBZ0IsRUFBRTtnQkFJL0MsYUFBYTtzQkFEbkIsS0FBSztnQkFJQyxnQkFBZ0I7c0JBRHRCLEtBQUs7Z0JBSVUsT0FBTztzQkFEdEIsS0FBSzt1QkFBQyxFQUFFLEtBQUssRUFBRSxjQUFjLEVBQUUsU0FBUyxFQUFFLGVBQWUsRUFBRTtnQkFJNUMsT0FBTztzQkFEdEIsS0FBSzt1QkFBQyxFQUFFLEtBQUssRUFBRSxjQUFjLEVBQUUsU0FBUyxFQUFFLGVBQWUsRUFBRTtnQkFJNUMsSUFBSTtzQkFEbkIsS0FBSzt1QkFBQyxFQUFFLEtBQUssRUFBRSxXQUFXLEVBQUUsU0FBUyxFQUFFLGVBQWUsRUFBRTtnQkFJekMsWUFBWTtzQkFEM0IsS0FBSzt1QkFBQyxFQUFFLEtBQUssRUFBRSxtQkFBbUIsRUFBRSxTQUFTLEVBQUUsZUFBZSxFQUFFO2dCQW9IMUQsUUFBUSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIEFmdGVyVmlld0luaXQsXG4gIGJvb2xlYW5BdHRyaWJ1dGUsXG4gIERpcmVjdGl2ZSxcbiAgaW5qZWN0LFxuICBJbnB1dCxcbiAgbnVtYmVyQXR0cmlidXRlLFxuICBPbkNoYW5nZXMsXG4gIE9uRGVzdHJveSxcbiAgT25Jbml0LFxuICBSZW5kZXJlcjIsXG4gIFNpbXBsZUNoYW5nZXMsXG59IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XG5pbXBvcnQgeyBGX1pPT00sIEZab29tQmFzZSB9IGZyb20gJy4vZi16b29tLWJhc2UnO1xuaW1wb3J0IHsgRk1lZGlhdG9yIH0gZnJvbSAnQGZvYmxleC9tZWRpYXRvcic7XG5pbXBvcnQge1xuICBBZGRab29tVG9TdG9yZVJlcXVlc3QsIGRlZmF1bHRFdmVudFRyaWdnZXIsXG4gIERlcHJlY2F0ZWQsXG4gIEZFdmVudFRyaWdnZXIsXG4gIEdldENhbnZhc1JlcXVlc3QsXG4gIEdldEZsb3dIb3N0RWxlbWVudFJlcXVlc3QsIGlzVmFsaWRFdmVudFRyaWdnZXIsXG4gIFJlbW92ZVpvb21Gcm9tU3RvcmVSZXF1ZXN0LFxuICBSZXNldFpvb21SZXF1ZXN0LFxuICBTZXRab29tUmVxdWVzdCxcbn0gZnJvbSAnLi4vZG9tYWluJztcbmltcG9ydCB7IEZDYW52YXNCYXNlIH0gZnJvbSAnLi4vZi1jYW52YXMnO1xuaW1wb3J0IHsgSVBvaW50LCBJUmVjdCwgUG9pbnRFeHRlbnNpb25zLCBSZWN0RXh0ZW5zaW9ucyB9IGZyb20gJ0Bmb2JsZXgvMmQnO1xuaW1wb3J0IHsgaXNOb2RlIH0gZnJvbSAnLi4vZi1ub2RlJztcbmltcG9ydCB7IEVGWm9vbURpcmVjdGlvbiB9IGZyb20gJy4vZS1mLXpvb20tZGlyZWN0aW9uJztcblxuQERpcmVjdGl2ZSh7XG4gIHNlbGVjdG9yOiBcImYtY2FudmFzW2Zab29tXVwiLFxuICBleHBvcnRBczogJ2ZDb21wb25lbnQnLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBob3N0OiB7XG4gICAgJ2NsYXNzJzogJ2Ytem9vbSBmLWNvbXBvbmVudCcsXG4gIH0sXG4gIHByb3ZpZGVyczogWyB7IHByb3ZpZGU6IEZfWk9PTSwgdXNlRXhpc3Rpbmc6IEZab29tRGlyZWN0aXZlIH0gXSxcbn0pXG5leHBvcnQgY2xhc3MgRlpvb21EaXJlY3RpdmUgZXh0ZW5kcyBGWm9vbUJhc2UgaW1wbGVtZW50cyBPbkluaXQsIEFmdGVyVmlld0luaXQsIE9uQ2hhbmdlcywgT25EZXN0cm95IHtcblxuICBwcml2YXRlIF9mTWVkaWF0b3IgPSBpbmplY3QoRk1lZGlhdG9yKTtcbiAgcHJpdmF0ZSBfcmVuZGVyZWQgPSBpbmplY3QoUmVuZGVyZXIyKTtcblxuICBwcml2YXRlIF90cmlnZ2Vyc0xpc3RlbmVyOiAoKCkgPT4gdm9pZClbXSA9IFtdO1xuXG4gIEBJbnB1dCh7IGFsaWFzOiAnZlpvb20nLCB0cmFuc2Zvcm06IGJvb2xlYW5BdHRyaWJ1dGUgfSlcbiAgcHVibGljIGlzRW5hYmxlZDogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBmV2hlZWxUcmlnZ2VyOiBGRXZlbnRUcmlnZ2VyID0gZGVmYXVsdEV2ZW50VHJpZ2dlcjtcblxuICBASW5wdXQoKVxuICBwdWJsaWMgZkRibENsaWNrVHJpZ2dlcjogRkV2ZW50VHJpZ2dlciA9IGRlZmF1bHRFdmVudFRyaWdnZXI7XG5cbiAgQElucHV0KHsgYWxpYXM6ICdmWm9vbU1pbmltdW0nLCB0cmFuc2Zvcm06IG51bWJlckF0dHJpYnV0ZSB9KVxuICBwdWJsaWMgb3ZlcnJpZGUgbWluaW11bTogbnVtYmVyID0gMC4xO1xuXG4gIEBJbnB1dCh7IGFsaWFzOiAnZlpvb21NYXhpbXVtJywgdHJhbnNmb3JtOiBudW1iZXJBdHRyaWJ1dGUgfSlcbiAgcHVibGljIG92ZXJyaWRlIG1heGltdW06IG51bWJlciA9IDQ7XG5cbiAgQElucHV0KHsgYWxpYXM6ICdmWm9vbVN0ZXAnLCB0cmFuc2Zvcm06IG51bWJlckF0dHJpYnV0ZSB9KVxuICBwdWJsaWMgb3ZlcnJpZGUgc3RlcDogbnVtYmVyID0gMC4xO1xuXG4gIEBJbnB1dCh7IGFsaWFzOiAnZlpvb21EYmxDbGlja1N0ZXAnLCB0cmFuc2Zvcm06IG51bWJlckF0dHJpYnV0ZSB9KVxuICBwdWJsaWMgb3ZlcnJpZGUgZGJsQ2xpY2tTdGVwOiBudW1iZXIgPSAwLjU7XG5cbiAgcHJpdmF0ZSBnZXQgX2ZIb3N0KCk6IEhUTUxFbGVtZW50IHtcbiAgICByZXR1cm4gdGhpcy5fZk1lZGlhdG9yLmV4ZWN1dGUobmV3IEdldEZsb3dIb3N0RWxlbWVudFJlcXVlc3QoKSk7XG4gIH1cblxuICBwcml2YXRlIGdldCBfZkNhbnZhcygpOiBGQ2FudmFzQmFzZSB7XG4gICAgcmV0dXJuIHRoaXMuX2ZNZWRpYXRvci5leGVjdXRlKG5ldyBHZXRDYW52YXNSZXF1ZXN0KCkpO1xuICB9XG5cbiAgcHVibGljIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMuX2ZNZWRpYXRvci5leGVjdXRlKG5ldyBBZGRab29tVG9TdG9yZVJlcXVlc3QodGhpcykpO1xuICB9XG5cbiAgcHVibGljIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLl9saXN0ZW5UcmlnZ2VycygpO1xuICB9XG5cbiAgcHVibGljIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICBpZiAoY2hhbmdlc1sgJ2lzRW5hYmxlZCcgXSkge1xuICAgICAgdGhpcy5fbGlzdGVuVHJpZ2dlcnMoKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9saXN0ZW5UcmlnZ2VycygpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuX2ZIb3N0KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5fZGlzcG9zZUxpc3RlbmVycygpO1xuICAgIGlmICghdGhpcy5pc0VuYWJsZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLl90cmlnZ2Vyc0xpc3RlbmVyLnB1c2godGhpcy5fcmVuZGVyZWQubGlzdGVuKHRoaXMuX2ZIb3N0LCAnd2hlZWwnLCB0aGlzLl9vbldoZWVsKSk7XG4gICAgdGhpcy5fdHJpZ2dlcnNMaXN0ZW5lci5wdXNoKHRoaXMuX3JlbmRlcmVkLmxpc3Rlbih0aGlzLl9mSG9zdCwgJ2RibGNsaWNrJywgdGhpcy5fb25Eb3VibGVDbGljaykpO1xuICB9XG5cbiAgcHJpdmF0ZSBfb25XaGVlbCA9IChldmVudDogV2hlZWxFdmVudCkgPT4ge1xuICAgIGlmICghaXNWYWxpZEV2ZW50VHJpZ2dlcihldmVudCwgdGhpcy5mV2hlZWxUcmlnZ2VyKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIGNvbnN0IHRhcmdldEVsZW1lbnQgPSBldmVudC50YXJnZXQgYXMgSFRNTEVsZW1lbnQ7XG5cbiAgICBpZiAodGFyZ2V0RWxlbWVudD8uY2xvc2VzdCgnW2ZMb2NrZWRDb250ZXh0XScpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qgc3RlcCA9IHRoaXMuX25vcm1hbGl6ZVdoZWVsU3RlcChldmVudC5kZWx0YVkpO1xuICAgIHRoaXMuc2V0Wm9vbShcbiAgICAgIFBvaW50RXh0ZW5zaW9ucy5pbml0aWFsaXplKGV2ZW50LmNsaWVudFgsIGV2ZW50LmNsaWVudFkpLFxuICAgICAgc3RlcCxcbiAgICAgIHRoaXMuX2NhbGN1bGF0ZURpcmVjdGlvbihldmVudC5kZWx0YVkpLFxuICAgICAgZmFsc2UsXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgX25vcm1hbGl6ZVdoZWVsU3RlcChkZWx0YVk6IG51bWJlcik6IG51bWJlciB7XG4gICAgY29uc3QgaW50ZW5zaXR5ID0gTWF0aC5hYnMoZGVsdGFZKSAvIDEwMDtcbiAgICBjb25zdCBub3JtYWxpemVkID0gTWF0aC5tYXgoMC4xLCBNYXRoLm1pbihpbnRlbnNpdHksIDEpKTtcblxuICAgIHJldHVybiB0aGlzLnN0ZXAgKiBub3JtYWxpemVkO1xuICB9XG5cbiAgcHJpdmF0ZSBfY2FsY3VsYXRlRGlyZWN0aW9uKGRlbHRhWTogbnVtYmVyKTogbnVtYmVyIHtcbiAgICByZXR1cm4gZGVsdGFZID4gMCA/IEVGWm9vbURpcmVjdGlvbi5aT09NX09VVCA6IEVGWm9vbURpcmVjdGlvbi5aT09NX0lOO1xuICB9XG5cbiAgcHJpdmF0ZSBfb25Eb3VibGVDbGljayA9IChldmVudDogTW91c2VFdmVudCkgPT4ge1xuICAgIGlmICghaXNWYWxpZEV2ZW50VHJpZ2dlcihldmVudCwgdGhpcy5mRGJsQ2xpY2tUcmlnZ2VyKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIGNvbnN0IHRhcmdldEVsZW1lbnQgPSBldmVudC50YXJnZXQgYXMgSFRNTEVsZW1lbnQ7XG5cbiAgICBpZiAoaXNOb2RlKHRhcmdldEVsZW1lbnQpIHx8IHRhcmdldEVsZW1lbnQ/LmNsb3Nlc3QoJ1tmTG9ja2VkQ29udGV4dF0nKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuc2V0Wm9vbShcbiAgICAgIFBvaW50RXh0ZW5zaW9ucy5pbml0aWFsaXplKGV2ZW50LmNsaWVudFgsIGV2ZW50LmNsaWVudFkpLFxuICAgICAgdGhpcy5kYmxDbGlja1N0ZXAsIEVGWm9vbURpcmVjdGlvbi5aT09NX0lOLCB0cnVlLFxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIF9nZXRUb0NlbnRlclBvc2l0aW9uKHBvc2l0aW9uOiBJUG9pbnQgfCB1bmRlZmluZWQsIHJlY3Q6IElSZWN0KTogSVBvaW50IHtcbiAgICByZXR1cm4gUG9pbnRFeHRlbnNpb25zLmluaXRpYWxpemUocG9zaXRpb24/LnggfHwgcmVjdC5ncmF2aXR5Q2VudGVyLngsIHBvc2l0aW9uPy55IHx8IHJlY3QuZ3Jhdml0eUNlbnRlci55KTtcbiAgfVxuXG4gIHB1YmxpYyB6b29tSW4ocG9zaXRpb24/OiBJUG9pbnQpOiB2b2lkIHtcbiAgICB0aGlzLl9vblpvb21Ub0NlbnRlcihFRlpvb21EaXJlY3Rpb24uWk9PTV9JTiwgcG9zaXRpb24pO1xuICB9XG5cbiAgcHVibGljIHpvb21PdXQocG9zaXRpb24/OiBJUG9pbnQpOiB2b2lkIHtcbiAgICB0aGlzLl9vblpvb21Ub0NlbnRlcihFRlpvb21EaXJlY3Rpb24uWk9PTV9PVVQsIHBvc2l0aW9uKTtcbiAgfVxuXG4gIHByaXZhdGUgX29uWm9vbVRvQ2VudGVyKGRpcmVjdGlvbjogRUZab29tRGlyZWN0aW9uLCBwb3NpdGlvbj86IElQb2ludCk6IHZvaWQge1xuICAgIHRoaXMuc2V0Wm9vbShcbiAgICAgIHRoaXMuX2dldFRvQ2VudGVyUG9zaXRpb24ocG9zaXRpb24sIFJlY3RFeHRlbnNpb25zLmZyb21FbGVtZW50KHRoaXMuX2ZIb3N0KSksXG4gICAgICB0aGlzLnN0ZXAsIGRpcmVjdGlvbiwgZmFsc2UsXG4gICAgKTtcbiAgfVxuXG4gIHB1YmxpYyBzZXRab29tKHBvc2l0aW9uOiBJUG9pbnQsIHN0ZXA6IG51bWJlciwgZGlyZWN0aW9uOiBFRlpvb21EaXJlY3Rpb24sIGFuaW1hdGVkOiBib29sZWFuKSB7XG4gICAgdGhpcy5fZk1lZGlhdG9yLmV4ZWN1dGUoXG4gICAgICBuZXcgU2V0Wm9vbVJlcXVlc3QocG9zaXRpb24sIHN0ZXAsIGRpcmVjdGlvbiwgYW5pbWF0ZWQpLFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogIEBkZXByZWNhdGVkIE1ldGhvZCBcImdldFNjYWxlXCIgaXMgZGVwcmVjYXRlZC4gVXNlIFwiZ2V0Wm9vbVZhbHVlXCIgaW5zdGVhZC4gVGhpcyBtZXRob2Qgd2lsbCBiZSByZW1vdmVkIGluIHZlcnNpb24gMTguMC4wLmAsXG4gICAqL1xuICBARGVwcmVjYXRlZCgnZ2V0Wm9vbVZhbHVlJylcbiAgcHVibGljIGdldFNjYWxlKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0Wm9vbVZhbHVlKCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0Wm9vbVZhbHVlKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuX2ZDYW52YXMudHJhbnNmb3JtLnNjYWxlIHx8IDE7XG4gIH1cblxuICBwdWJsaWMgcmVzZXQoKTogdm9pZCB7XG4gICAgdGhpcy5fZk1lZGlhdG9yLmV4ZWN1dGUobmV3IFJlc2V0Wm9vbVJlcXVlc3QoKSk7XG4gIH1cblxuICBwcml2YXRlIF9kaXNwb3NlTGlzdGVuZXJzKCk6IHZvaWQge1xuICAgIHRoaXMuX3RyaWdnZXJzTGlzdGVuZXIuZm9yRWFjaCgobGlzdGVuZXIpID0+IGxpc3RlbmVyKCkpO1xuICAgIHRoaXMuX3RyaWdnZXJzTGlzdGVuZXIgPSBbXTtcbiAgfVxuXG4gIHB1YmxpYyBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLl9kaXNwb3NlTGlzdGVuZXJzKCk7XG4gICAgdGhpcy5fZk1lZGlhdG9yLmV4ZWN1dGUobmV3IFJlbW92ZVpvb21Gcm9tU3RvcmVSZXF1ZXN0KCkpO1xuICB9XG59XG4iXX0=
161
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZi16b29tLmRpcmVjdGl2ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL2YtZmxvdy9zcmMvZi16b29tL2Ytem9vbS5kaXJlY3RpdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFFTCxnQkFBZ0IsRUFDaEIsU0FBUyxFQUNULE1BQU0sRUFDTixNQUFNLEVBQ04sUUFBUSxFQUNSLEtBQUssRUFDTCxLQUFLLEVBQ0wsZUFBZSxFQUdmLFNBQVMsR0FDVixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNsRCxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDN0MsT0FBTyxFQUNMLHFCQUFxQixFQUNyQixtQkFBbUIsRUFDbkIsVUFBVSxFQUVWLGdCQUFnQixFQUNoQix5QkFBeUIsRUFDekIsbUJBQW1CLEVBQ25CLDBCQUEwQixFQUMxQixnQkFBZ0IsRUFDaEIsY0FBYyxHQUNmLE1BQU0sV0FBVyxDQUFDO0FBRW5CLE9BQU8sRUFBaUIsZUFBZSxFQUFFLGNBQWMsRUFBRSxNQUFNLFlBQVksQ0FBQztBQUM1RSxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQ25DLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUN2RCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0saUJBQWlCLENBQUM7O0FBV2xELE1BQU0sT0FBTyxjQUFlLFNBQVEsU0FBUztJQUMxQixTQUFTLEdBQUcsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQzlCLFNBQVMsR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUM7SUFFdEMsaUJBQWlCLEdBQUcsZUFBZSxDQUFDLGFBQWEsRUFBRSxDQUFDO0lBRTVDLFNBQVMsR0FBRyxLQUFLLENBQUMsS0FBSyxFQUFFLEVBQUUsS0FBSyxFQUFF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SVUsT0FBTztzQkFEdEIsS0FBSzt1QkFBQyxFQUFFLEtBQUssRUFBRSxjQUFjLEVBQUUsU0FBUyxFQUFFLGVBQWUsRUFBRTtnQkFJNUMsT0FBTztzQkFEdEIsS0FBSzt1QkFBQyxFQUFFLEtBQUssRUFBRSxjQUFjLEVBQUUsU0FBUyxFQUFFLGVBQWUsRUFBRTtnQkFJNUMsSUFBSTtzQkFEbkIsS0FBSzt1QkFBQyxFQUFFLEtBQUssRUFBRSxXQUFXLEVBQUUsU0FBUyxFQUFFLGVBQWUsRUFBRTtnQkFJekMsWUFBWTtzQkFEM0IsS0FBSzt1QkFBQyxFQUFFLEtBQUssRUFBRSxtQkFBbUIsRUFBRSxTQUFTLEVBQUUsZUFBZSxFQUFFO2dCQWlJMUQsUUFBUSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIEFmdGVyVmlld0luaXQsXG4gIGJvb2xlYW5BdHRyaWJ1dGUsXG4gIERpcmVjdGl2ZSxcbiAgZWZmZWN0LFxuICBpbmplY3QsXG4gIEluamVjdG9yLFxuICBpbnB1dCxcbiAgSW5wdXQsXG4gIG51bWJlckF0dHJpYnV0ZSxcbiAgT25EZXN0cm95LFxuICBPbkluaXQsXG4gIHVudHJhY2tlZCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBGX1pPT00sIEZab29tQmFzZSB9IGZyb20gJy4vZi16b29tLWJhc2UnO1xuaW1wb3J0IHsgRk1lZGlhdG9yIH0gZnJvbSAnQGZvYmxleC9tZWRpYXRvcic7XG5pbXBvcnQge1xuICBBZGRab29tVG9TdG9yZVJlcXVlc3QsXG4gIGRlZmF1bHRFdmVudFRyaWdnZXIsXG4gIERlcHJlY2F0ZWQsXG4gIEZFdmVudFRyaWdnZXIsXG4gIEdldENhbnZhc1JlcXVlc3QsXG4gIEdldEZsb3dIb3N0RWxlbWVudFJlcXVlc3QsXG4gIGlzVmFsaWRFdmVudFRyaWdnZXIsXG4gIFJlbW92ZVpvb21Gcm9tU3RvcmVSZXF1ZXN0LFxuICBSZXNldFpvb21SZXF1ZXN0LFxuICBTZXRab29tUmVxdWVzdCxcbn0gZnJvbSAnLi4vZG9tYWluJztcbmltcG9ydCB7IEZDYW52YXNCYXNlIH0gZnJvbSAnLi4vZi1jYW52YXMnO1xuaW1wb3J0IHsgSVBvaW50LCBJUmVjdCwgUG9pbnRFeHRlbnNpb25zLCBSZWN0RXh0ZW5zaW9ucyB9IGZyb20gJ0Bmb2JsZXgvMmQnO1xuaW1wb3J0IHsgaXNOb2RlIH0gZnJvbSAnLi4vZi1ub2RlJztcbmltcG9ydCB7IEVGWm9vbURpcmVjdGlvbiB9IGZyb20gJy4vZS1mLXpvb20tZGlyZWN0aW9uJztcbmltcG9ydCB7IEV2ZW50RXh0ZW5zaW9ucyB9IGZyb20gJy4uL2RyYWctdG9vbGtpdCc7XG5cbkBEaXJlY3RpdmUoe1xuICBzZWxlY3RvcjogJ2YtY2FudmFzW2Zab29tXScsXG4gIGV4cG9ydEFzOiAnZkNvbXBvbmVudCcsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGhvc3Q6IHtcbiAgICAnY2xhc3MnOiAnZi16b29tIGYtY29tcG9uZW50JyxcbiAgfSxcbiAgcHJvdmlkZXJzOiBbeyBwcm92aWRlOiBGX1pPT00sIHVzZUV4aXN0aW5nOiBGWm9vbURpcmVjdGl2ZSB9XSxcbn0pXG5leHBvcnQgY2xhc3MgRlpvb21EaXJlY3RpdmUgZXh0ZW5kcyBGWm9vbUJhc2UgaW1wbGVtZW50cyBPbkluaXQsIEFmdGVyVmlld0luaXQsIE9uRGVzdHJveSB7XG4gIHByaXZhdGUgcmVhZG9ubHkgX21lZGlhdG9yID0gaW5qZWN0KEZNZWRpYXRvcik7XG4gIHByaXZhdGUgcmVhZG9ubHkgX2luamVjdG9yID0gaW5qZWN0KEluamVjdG9yKTtcblxuICBwcml2YXRlIF90cmlnZ2Vyc0xpc3RlbmVyID0gRXZlbnRFeHRlbnNpb25zLmVtcHR5TGlzdGVuZXIoKTtcblxuICBwdWJsaWMgcmVhZG9ubHkgaXNFbmFibGVkID0gaW5wdXQoZmFsc2UsIHsgYWxpYXM6ICdmWm9vbScsIHRyYW5zZm9ybTogYm9vbGVhbkF0dHJpYnV0ZSB9KTtcblxuICBASW5wdXQoKVxuICBwdWJsaWMgZldoZWVsVHJpZ2dlcjogRkV2ZW50VHJpZ2dlciA9IGRlZmF1bHRFdmVudFRyaWdnZXI7XG5cbiAgQElucHV0KClcbiAgcHVibGljIGZEYmxDbGlja1RyaWdnZXI6IEZFdmVudFRyaWdnZXIgPSBkZWZhdWx0RXZlbnRUcmlnZ2VyO1xuXG4gIEBJbnB1dCh7IGFsaWFzOiAnZlpvb21NaW5pbXVtJywgdHJhbnNmb3JtOiBudW1iZXJBdHRyaWJ1dGUgfSlcbiAgcHVibGljIG92ZXJyaWRlIG1pbmltdW06IG51bWJlciA9IDAuMTtcblxuICBASW5wdXQoeyBhbGlhczogJ2Zab29tTWF4aW11bScsIHRyYW5zZm9ybTogbnVtYmVyQXR0cmlidXRlIH0pXG4gIHB1YmxpYyBvdmVycmlkZSBtYXhpbXVtOiBudW1iZXIgPSA0O1xuXG4gIEBJbnB1dCh7IGFsaWFzOiAnZlpvb21TdGVwJywgdHJhbnNmb3JtOiBudW1iZXJBdHRyaWJ1dGUgfSlcbiAgcHVibGljIG92ZXJyaWRlIHN0ZXA6IG51bWJlciA9IDAuMTtcblxuICBASW5wdXQoeyBhbGlhczogJ2Zab29tRGJsQ2xpY2tTdGVwJywgdHJhbnNmb3JtOiBudW1iZXJBdHRyaWJ1dGUgfSlcbiAgcHVibGljIG92ZXJyaWRlIGRibENsaWNrU3RlcDogbnVtYmVyID0gMC41O1xuXG4gIHByaXZhdGUgZ2V0IF9ob3N0RWxlbWVudCgpOiBIVE1MRWxlbWVudCB7XG4gICAgcmV0dXJuIHRoaXMuX21lZGlhdG9yLmV4ZWN1dGUobmV3IEdldEZsb3dIb3N0RWxlbWVudFJlcXVlc3QoKSk7XG4gIH1cblxuICBwcml2YXRlIGdldCBfY2FudmFzKCk6IEZDYW52YXNCYXNlIHtcbiAgICByZXR1cm4gdGhpcy5fbWVkaWF0b3IuZXhlY3V0ZShuZXcgR2V0Q2FudmFzUmVxdWVzdCgpKTtcbiAgfVxuXG4gIHB1YmxpYyBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLl9tZWRpYXRvci5leGVjdXRlKG5ldyBBZGRab29tVG9TdG9yZVJlcXVlc3QodGhpcykpO1xuICB9XG5cbiAgcHVibGljIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLl9saXN0ZW5ab29tRW5hYmxlZENoYW5nZXMoKTtcbiAgfVxuXG4gIHByaXZhdGUgX2xpc3Rlblpvb21FbmFibGVkQ2hhbmdlcygpOiB2b2lkIHtcbiAgICBlZmZlY3QoXG4gICAgICAoKSA9PiB7XG4gICAgICAgIHRoaXMuaXNFbmFibGVkKCk7XG4gICAgICAgIHVudHJhY2tlZCgoKSA9PiB0aGlzLl9saXN0ZW5UcmlnZ2VycygpKTtcbiAgICAgIH0sXG4gICAgICB7IGluamVjdG9yOiB0aGlzLl9pbmplY3RvciB9LFxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIF9saXN0ZW5UcmlnZ2VycygpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuX2hvc3RFbGVtZW50KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5fZGlzcG9zZUxpc3RlbmVycygpO1xuICAgIGlmICghdGhpcy5pc0VuYWJsZWQoKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLl9saXN0ZW4oJ3doZWVsJywgdGhpcy5fb25XaGVlbCwgRXZlbnRFeHRlbnNpb25zLmFjdGl2ZUxpc3RlbmVyKCkpO1xuICAgIHRoaXMuX2xpc3RlbignZGJsY2xpY2snLCB0aGlzLl9vbkRvdWJsZUNsaWNrKTtcblxuICAgIHRoaXMuX3RyaWdnZXJzTGlzdGVuZXIgPSAoKSA9PiB7XG4gICAgICB0aGlzLl91bmxpc3Rlbignd2hlZWwnLCB0aGlzLl9vbldoZWVsLCBFdmVudEV4dGVuc2lvbnMuYWN0aXZlTGlzdGVuZXIoKSk7XG4gICAgICB0aGlzLl91bmxpc3RlbignZGJsY2xpY2snLCB0aGlzLl9vbkRvdWJsZUNsaWNrKTtcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBfb25XaGVlbCA9IChldmVudDogV2hlZWxFdmVudCkgPT4ge1xuICAgIGlmICghaXNWYWxpZEV2ZW50VHJpZ2dlcihldmVudCwgdGhpcy5mV2hlZWxUcmlnZ2VyKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIGNvbnN0IHRhcmdldEVsZW1lbnQgPSBldmVudC50YXJnZXQgYXMgSFRNTEVsZW1lbnQ7XG5cbiAgICBpZiAodGFyZ2V0RWxlbWVudD8uY2xvc2VzdCgnW2ZMb2NrZWRDb250ZXh0XScpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qgc3RlcCA9IHRoaXMuX25vcm1hbGl6ZVdoZWVsU3RlcChldmVudC5kZWx0YVkpO1xuICAgIHRoaXMuc2V0Wm9vbShcbiAgICAgIFBvaW50RXh0ZW5zaW9ucy5pbml0aWFsaXplKGV2ZW50LmNsaWVudFgsIGV2ZW50LmNsaWVudFkpLFxuICAgICAgc3RlcCxcbiAgICAgIHRoaXMuX2NhbGN1bGF0ZURpcmVjdGlvbihldmVudC5kZWx0YVkpLFxuICAgICAgZmFsc2UsXG4gICAgKTtcbiAgfTtcblxuICBwcml2YXRlIF9ub3JtYWxpemVXaGVlbFN0ZXAoZGVsdGFZOiBudW1iZXIpOiBudW1iZXIge1xuICAgIGNvbnN0IGludGVuc2l0eSA9IE1hdGguYWJzKGRlbHRhWSkgLyAxMDA7XG4gICAgY29uc3Qgbm9ybWFsaXplZCA9IE1hdGgubWF4KDAuMSwgTWF0aC5taW4oaW50ZW5zaXR5LCAxKSk7XG5cbiAgICByZXR1cm4gdGhpcy5zdGVwICogbm9ybWFsaXplZDtcbiAgfVxuXG4gIHByaXZhdGUgX2NhbGN1bGF0ZURpcmVjdGlvbihkZWx0YVk6IG51bWJlcik6IG51bWJlciB7XG4gICAgcmV0dXJuIGRlbHRhWSA+IDAgPyBFRlpvb21EaXJlY3Rpb24uWk9PTV9PVVQgOiBFRlpvb21EaXJlY3Rpb24uWk9PTV9JTjtcbiAgfVxuXG4gIHByaXZhdGUgX29uRG91YmxlQ2xpY2sgPSAoZXZlbnQ6IE1vdXNlRXZlbnQpID0+IHtcbiAgICBpZiAoIWlzVmFsaWRFdmVudFRyaWdnZXIoZXZlbnQsIHRoaXMuZkRibENsaWNrVHJpZ2dlcikpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICBjb25zdCB0YXJnZXRFbGVtZW50ID0gZXZlbnQudGFyZ2V0IGFzIEhUTUxFbGVtZW50O1xuXG4gICAgaWYgKGlzTm9kZSh0YXJnZXRFbGVtZW50KSB8fCB0YXJnZXRFbGVtZW50Py5jbG9zZXN0KCdbZkxvY2tlZENvbnRleHRdJykpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLnNldFpvb20oXG4gICAgICBQb2ludEV4dGVuc2lvbnMuaW5pdGlhbGl6ZShldmVudC5jbGllbnRYLCBldmVudC5jbGllbnRZKSxcbiAgICAgIHRoaXMuZGJsQ2xpY2tTdGVwLFxuICAgICAgRUZab29tRGlyZWN0aW9uLlpPT01fSU4sXG4gICAgICB0cnVlLFxuICAgICk7XG4gIH07XG5cbiAgcHJpdmF0ZSBfZ2V0VG9DZW50ZXJQb3NpdGlvbihwb3NpdGlvbjogSVBvaW50IHwgdW5kZWZpbmVkLCByZWN0OiBJUmVjdCk6IElQb2ludCB7XG4gICAgcmV0dXJuIFBvaW50RXh0ZW5zaW9ucy5pbml0aWFsaXplKFxuICAgICAgcG9zaXRpb24/LnggfHwgcmVjdC5ncmF2aXR5Q2VudGVyLngsXG4gICAgICBwb3NpdGlvbj8ueSB8fCByZWN0LmdyYXZpdHlDZW50ZXIueSxcbiAgICApO1xuICB9XG5cbiAgcHVibGljIHpvb21Jbihwb3NpdGlvbj86IElQb2ludCk6IHZvaWQge1xuICAgIHRoaXMuX29uWm9vbVRvQ2VudGVyKEVGWm9vbURpcmVjdGlvbi5aT09NX0lOLCBwb3NpdGlvbik7XG4gIH1cblxuICBwdWJsaWMgem9vbU91dChwb3NpdGlvbj86IElQb2ludCk6IHZvaWQge1xuICAgIHRoaXMuX29uWm9vbVRvQ2VudGVyKEVGWm9vbURpcmVjdGlvbi5aT09NX09VVCwgcG9zaXRpb24pO1xuICB9XG5cbiAgcHJpdmF0ZSBfb25ab29tVG9DZW50ZXIoZGlyZWN0aW9uOiBFRlpvb21EaXJlY3Rpb24sIHBvc2l0aW9uPzogSVBvaW50KTogdm9pZCB7XG4gICAgdGhpcy5zZXRab29tKFxuICAgICAgdGhpcy5fZ2V0VG9DZW50ZXJQb3NpdGlvbihwb3NpdGlvbiwgUmVjdEV4dGVuc2lvbnMuZnJvbUVsZW1lbnQodGhpcy5faG9zdEVsZW1lbnQpKSxcbiAgICAgIHRoaXMuc3RlcCxcbiAgICAgIGRpcmVjdGlvbixcbiAgICAgIGZhbHNlLFxuICAgICk7XG4gIH1cblxuICBwdWJsaWMgc2V0Wm9vbShwb3NpdGlvbjogSVBvaW50LCBzdGVwOiBudW1iZXIsIGRpcmVjdGlvbjogRUZab29tRGlyZWN0aW9uLCBhbmltYXRlZDogYm9vbGVhbikge1xuICAgIHRoaXMuX21lZGlhdG9yLmV4ZWN1dGUobmV3IFNldFpvb21SZXF1ZXN0KHBvc2l0aW9uLCBzdGVwLCBkaXJlY3Rpb24sIGFuaW1hdGVkKSk7XG4gIH1cblxuICAvKipcbiAgICogIEBkZXByZWNhdGVkIE1ldGhvZCBcImdldFNjYWxlXCIgaXMgZGVwcmVjYXRlZC4gVXNlIFwiZ2V0Wm9vbVZhbHVlXCIgaW5zdGVhZC4gVGhpcyBtZXRob2Qgd2lsbCBiZSByZW1vdmVkIGluIHZlcnNpb24gMTguMC4wLmAsXG4gICAqL1xuICBARGVwcmVjYXRlZCgnZ2V0Wm9vbVZhbHVlJylcbiAgcHVibGljIGdldFNjYWxlKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0Wm9vbVZhbHVlKCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0Wm9vbVZhbHVlKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuX2NhbnZhcy50cmFuc2Zvcm0uc2NhbGUgfHwgMTtcbiAgfVxuXG4gIHB1YmxpYyByZXNldCgpOiB2b2lkIHtcbiAgICB0aGlzLl9tZWRpYXRvci5leGVjdXRlKG5ldyBSZXNldFpvb21SZXF1ZXN0KCkpO1xuICB9XG5cbiAgcHJpdmF0ZSBfZGlzcG9zZUxpc3RlbmVycygpOiB2b2lkIHtcbiAgICB0aGlzLl90cmlnZ2Vyc0xpc3RlbmVyKCk7XG4gICAgdGhpcy5fdHJpZ2dlcnNMaXN0ZW5lciA9IEV2ZW50RXh0ZW5zaW9ucy5lbXB0eUxpc3RlbmVyKCk7XG4gIH1cblxuICBwdWJsaWMgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5fZGlzcG9zZUxpc3RlbmVycygpO1xuICAgIHRoaXMuX21lZGlhdG9yLmV4ZWN1dGUobmV3IFJlbW92ZVpvb21Gcm9tU3RvcmVSZXF1ZXN0KCkpO1xuICB9XG5cbiAgcHJpdmF0ZSBfbGlzdGVuPEsgZXh0ZW5kcyBrZXlvZiBIVE1MRWxlbWVudEV2ZW50TWFwPihcbiAgICB0eXBlOiBLLFxuICAgIGxpc3RlbmVyOiAodGhpczogSFRNTEVsZW1lbnQsIGV2OiBIVE1MRWxlbWVudEV2ZW50TWFwW0tdKSA9PiB1bmtub3duLFxuICAgIG9wdGlvbnM/OiBib29sZWFuIHwgQWRkRXZlbnRMaXN0ZW5lck9wdGlvbnMsXG4gICk6IHZvaWQge1xuICAgIHRoaXMuX2hvc3RFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIodHlwZSwgbGlzdGVuZXIsIG9wdGlvbnMpO1xuICB9XG5cbiAgcHJpdmF0ZSBfdW5saXN0ZW48SyBleHRlbmRzIGtleW9mIEhUTUxFbGVtZW50RXZlbnRNYXA+KFxuICAgIHR5cGU6IEssXG4gICAgbGlzdGVuZXI6ICh0aGlzOiBIVE1MRWxlbWVudCwgZXY6IEhUTUxFbGVtZW50RXZlbnRNYXBbS10pID0+IHVua25vd24sXG4gICAgb3B0aW9ucz86IGJvb2xlYW4gfCBBZGRFdmVudExpc3RlbmVyT3B0aW9ucyxcbiAgKTogdm9pZCB7XG4gICAgdGhpcy5faG9zdEVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcih0eXBlLCBsaXN0ZW5lciwgb3B0aW9ucyk7XG4gIH1cbn1cbiJdfQ==
@@ -87,5 +87,5 @@ export declare class FCanvasComponent extends FCanvasBase implements OnInit, OnD
87
87
  resetScale(): void;
88
88
  ngOnDestroy(): void;
89
89
  static ɵfac: i0.ɵɵFactoryDeclaration<FCanvasComponent, never>;
90
- static ɵcmp: i0.ɵɵComponentDeclaration<FCanvasComponent, "f-canvas", never, { "position": { "alias": "position"; "required": false; "isSignal": true; }; "scale": { "alias": "scale"; "required": false; "isSignal": true; }; "debounceTime": { "alias": "debounceTime"; "required": false; "isSignal": true; }; }, { "fCanvasChange": "fCanvasChange"; }, never, ["[fGroup]", "f-snap-connection", "f-connection", "f-connection-for-create", "[fNode]"], true, never>;
90
+ static ɵcmp: i0.ɵɵComponentDeclaration<FCanvasComponent, "f-canvas", never, { "position": { "alias": "position"; "required": false; "isSignal": true; }; "scale": { "alias": "scale"; "required": false; "isSignal": true; }; "debounceTime": { "alias": "debounceTime"; "required": false; "isSignal": true; }; }, { "fCanvasChange": "fCanvasChange"; }, never, ["[fGroup], [fGroups]", "f-snap-connection", "f-connection, [fConnections]", "f-connection-for-create", "[fNode], [fNodes]"], true, never>;
91
91
  }
@@ -45,7 +45,7 @@ export declare abstract class FConnectionBase extends MIXIN_BASE implements IHas
45
45
  readonly fDragHandleStart: Signal<FConnectionDragHandleStartComponent | undefined>;
46
46
  readonly fDragHandleEnd: Signal<FConnectionDragHandleEndComponent>;
47
47
  readonly fSelection: Signal<FConnectionSelectionComponent>;
48
- readonly fTextComponent: Signal<IConnectionText>;
48
+ readonly fTextComponent: Signal<IConnectionText | undefined>;
49
49
  abstract fText: string;
50
50
  abstract fTextStartOffset: string;
51
51
  readonly fConnectionCenter: Signal<ElementRef<HTMLDivElement> | undefined>;
@@ -1,25 +1,25 @@
1
- import { AfterViewInit, OnChanges, OnDestroy, OnInit, SimpleChanges } from "@angular/core";
1
+ import { AfterViewInit, OnDestroy, OnInit } from '@angular/core';
2
2
  import { FZoomBase } from './f-zoom-base';
3
3
  import { FEventTrigger } from '../domain';
4
4
  import { IPoint } from '@foblex/2d';
5
5
  import { EFZoomDirection } from './e-f-zoom-direction';
6
6
  import * as i0 from "@angular/core";
7
- export declare class FZoomDirective extends FZoomBase implements OnInit, AfterViewInit, OnChanges, OnDestroy {
8
- private _fMediator;
9
- private _rendered;
7
+ export declare class FZoomDirective extends FZoomBase implements OnInit, AfterViewInit, OnDestroy {
8
+ private readonly _mediator;
9
+ private readonly _injector;
10
10
  private _triggersListener;
11
- isEnabled: boolean;
11
+ readonly isEnabled: import("@angular/core").InputSignalWithTransform<boolean, unknown>;
12
12
  fWheelTrigger: FEventTrigger;
13
13
  fDblClickTrigger: FEventTrigger;
14
14
  minimum: number;
15
15
  maximum: number;
16
16
  step: number;
17
17
  dblClickStep: number;
18
- private get _fHost();
19
- private get _fCanvas();
18
+ private get _hostElement();
19
+ private get _canvas();
20
20
  ngOnInit(): void;
21
21
  ngAfterViewInit(): void;
22
- ngOnChanges(changes: SimpleChanges): void;
22
+ private _listenZoomEnabledChanges;
23
23
  private _listenTriggers;
24
24
  private _onWheel;
25
25
  private _normalizeWheelStep;
@@ -38,9 +38,10 @@ export declare class FZoomDirective extends FZoomBase implements OnInit, AfterVi
38
38
  reset(): void;
39
39
  private _disposeListeners;
40
40
  ngOnDestroy(): void;
41
+ private _listen;
42
+ private _unlisten;
41
43
  static ɵfac: i0.ɵɵFactoryDeclaration<FZoomDirective, never>;
42
- static ɵdir: i0.ɵɵDirectiveDeclaration<FZoomDirective, "f-canvas[fZoom]", ["fComponent"], { "isEnabled": { "alias": "fZoom"; "required": false; }; "fWheelTrigger": { "alias": "fWheelTrigger"; "required": false; }; "fDblClickTrigger": { "alias": "fDblClickTrigger"; "required": false; }; "minimum": { "alias": "fZoomMinimum"; "required": false; }; "maximum": { "alias": "fZoomMaximum"; "required": false; }; "step": { "alias": "fZoomStep"; "required": false; }; "dblClickStep": { "alias": "fZoomDblClickStep"; "required": false; }; }, {}, never, never, true, never>;
43
- static ngAcceptInputType_isEnabled: unknown;
44
+ static ɵdir: i0.ɵɵDirectiveDeclaration<FZoomDirective, "f-canvas[fZoom]", ["fComponent"], { "isEnabled": { "alias": "fZoom"; "required": false; "isSignal": true; }; "fWheelTrigger": { "alias": "fWheelTrigger"; "required": false; }; "fDblClickTrigger": { "alias": "fDblClickTrigger"; "required": false; }; "minimum": { "alias": "fZoomMinimum"; "required": false; }; "maximum": { "alias": "fZoomMaximum"; "required": false; }; "step": { "alias": "fZoomStep"; "required": false; }; "dblClickStep": { "alias": "fZoomDblClickStep"; "required": false; }; }, {}, never, never, true, never>;
44
45
  static ngAcceptInputType_minimum: unknown;
45
46
  static ngAcceptInputType_maximum: unknown;
46
47
  static ngAcceptInputType_step: unknown;
@@ -3120,7 +3120,7 @@ class FConnectionBase extends MIXIN_BASE {
3120
3120
  fDragHandleStart = viewChild(FConnectionDragHandleStartComponent);
3121
3121
  fDragHandleEnd = viewChild.required(FConnectionDragHandleEndComponent);
3122
3122
  fSelection = viewChild.required(FConnectionSelectionComponent);
3123
- fTextComponent = viewChild.required(CONNECTION_TEXT);
3123
+ fTextComponent = viewChild(CONNECTION_TEXT);
3124
3124
  fConnectionCenter = viewChild('fConnectionCenter');
3125
3125
  fConnectionCenters = contentChildren(FConnectionCenterDirective, {
3126
3126
  descendants: true,
@@ -3187,7 +3187,7 @@ class FConnectionBase extends MIXIN_BASE {
3187
3187
  this.fGradient().redraw(this.line);
3188
3188
  this.fDragHandleEnd().redraw(this._penultimatePoint, this.line.point2);
3189
3189
  this.fDragHandleStart()?.redraw(this._secondPoint, this.line.point1);
3190
- this.fTextComponent().redraw(this.line);
3190
+ this.fTextComponent()?.redraw(this.line);
3191
3191
  }
3192
3192
  /**
3193
3193
  * Applies the resolved sides to the connection. Don't call this method directly; it's used internally.
@@ -3326,7 +3326,7 @@ class FConnectionComponent extends FConnectionBase {
3326
3326
  this._mediator.execute(new RemoveConnectionFromStoreRequest(this));
3327
3327
  }
3328
3328
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: FConnectionComponent, deps: null, target: i0.ɵɵFactoryTarget.Component });
3329
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.13", type: FConnectionComponent, selector: "f-connection", inputs: { fId: { classPropertyName: "fId", publicName: "fConnectionId", isSignal: true, isRequired: false, transformFunction: null }, fText: { classPropertyName: "fText", publicName: "fText", isSignal: false, isRequired: false, transformFunction: null }, fTextStartOffset: { classPropertyName: "fTextStartOffset", publicName: "fTextStartOffset", isSignal: false, isRequired: false, transformFunction: null }, fOutputId: { classPropertyName: "fOutputId", publicName: "fOutputId", isSignal: true, isRequired: false, transformFunction: null }, fInputId: { classPropertyName: "fInputId", publicName: "fInputId", isSignal: true, isRequired: false, transformFunction: null }, fRadius: { classPropertyName: "fRadius", publicName: "fRadius", isSignal: false, isRequired: false, transformFunction: numberAttribute }, fOffset: { classPropertyName: "fOffset", publicName: "fOffset", isSignal: false, isRequired: false, transformFunction: numberAttribute }, fBehavior: { classPropertyName: "fBehavior", publicName: "fBehavior", isSignal: false, isRequired: false, transformFunction: (value) => castToEnum(value, 'fBehavior', EFConnectionBehavior) }, fType: { classPropertyName: "fType", publicName: "fType", isSignal: false, isRequired: false, transformFunction: null }, fSelectionDisabled: { classPropertyName: "fSelectionDisabled", publicName: "fSelectionDisabled", isSignal: true, isRequired: false, transformFunction: null }, fReassignableStart: { classPropertyName: "fReassignableStart", publicName: "fReassignableStart", isSignal: true, isRequired: false, transformFunction: null }, fDraggingDisabled: { classPropertyName: "fDraggingDisabled", publicName: "fReassignDisabled", isSignal: true, isRequired: false, transformFunction: null }, fInputSide: { classPropertyName: "fInputSide", publicName: "fInputSide", isSignal: true, isRequired: false, transformFunction: null }, fOutputSide: { classPropertyName: "fOutputSide", publicName: "fOutputSide", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "attr.id": "fId()", "class.f-connection-selection-disabled": "fSelectionDisabled()", "class.f-connection-reassign-disabled": "fDraggingDisabled()" }, classAttribute: "f-component f-connection" }, providers: [{ provide: F_CONNECTION, useExisting: FConnectionComponent }], exportAs: ["fComponent"], usesInheritance: true, usesOnChanges: true, ngImport: i0, template: "<svg\n xmlns=\"http://www.w3.org/2000/svg\"\n style=\"display: block; vertical-align: middle;\"\n>\n <defs #defs></defs>\n <ng-content></ng-content>\n <g class=\"f-connection-group\">\n <linearGradient fConnectionGradient></linearGradient>\n <path fConnectionSelection [attr.d]=\"path\"></path>\n <g>\n <path f-connection-path [attr.d]=\"path\"></path>\n @if (fReassignableStart()) {\n <circle f-connection-drag-handle-start r=\"8\"></circle>\n }\n <circle f-connection-drag-handle-end r=\"8\"></circle>\n </g>\n <text f-connection-text></text>\n </g>\n</svg>\n@if (fConnectionCenters().length) {\n <div #fConnectionCenter class=\"f-connection-center\">\n <ng-content select=\"[fConnectionCenter]\"></ng-content>\n </div>\n}\n\n@if (fConnectionContents().length) {\n <ng-content select=\"[fConnectionContent]\"></ng-content>\n}\n", styles: [":host{pointer-events:none}:host svg{overflow:visible!important;position:absolute}:host svg .f-connection-group{pointer-events:all}:host .f-connection-center,:host .f-connection-content{pointer-events:all}\n"], dependencies: [{ kind: "component", type: FConnectionTextComponent, selector: "text[f-connection-text]" }, { kind: "component", type: FConnectionDragHandleStartComponent, selector: "circle[f-connection-drag-handle-start]" }, { kind: "component", type: FConnectionDragHandleEndComponent, selector: "circle[f-connection-drag-handle-end]" }, { kind: "component", type: FConnectionGradientComponent, selector: "linearGradient[fConnectionGradient]" }, { kind: "component", type: FConnectionPathComponent, selector: "path[f-connection-path]" }, { kind: "component", type: FConnectionSelectionComponent, selector: "path[fConnectionSelection]" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
3329
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.13", type: FConnectionComponent, selector: "f-connection", inputs: { fId: { classPropertyName: "fId", publicName: "fConnectionId", isSignal: true, isRequired: false, transformFunction: null }, fText: { classPropertyName: "fText", publicName: "fText", isSignal: false, isRequired: false, transformFunction: null }, fTextStartOffset: { classPropertyName: "fTextStartOffset", publicName: "fTextStartOffset", isSignal: false, isRequired: false, transformFunction: null }, fOutputId: { classPropertyName: "fOutputId", publicName: "fOutputId", isSignal: true, isRequired: false, transformFunction: null }, fInputId: { classPropertyName: "fInputId", publicName: "fInputId", isSignal: true, isRequired: false, transformFunction: null }, fRadius: { classPropertyName: "fRadius", publicName: "fRadius", isSignal: false, isRequired: false, transformFunction: numberAttribute }, fOffset: { classPropertyName: "fOffset", publicName: "fOffset", isSignal: false, isRequired: false, transformFunction: numberAttribute }, fBehavior: { classPropertyName: "fBehavior", publicName: "fBehavior", isSignal: false, isRequired: false, transformFunction: (value) => castToEnum(value, 'fBehavior', EFConnectionBehavior) }, fType: { classPropertyName: "fType", publicName: "fType", isSignal: false, isRequired: false, transformFunction: null }, fSelectionDisabled: { classPropertyName: "fSelectionDisabled", publicName: "fSelectionDisabled", isSignal: true, isRequired: false, transformFunction: null }, fReassignableStart: { classPropertyName: "fReassignableStart", publicName: "fReassignableStart", isSignal: true, isRequired: false, transformFunction: null }, fDraggingDisabled: { classPropertyName: "fDraggingDisabled", publicName: "fReassignDisabled", isSignal: true, isRequired: false, transformFunction: null }, fInputSide: { classPropertyName: "fInputSide", publicName: "fInputSide", isSignal: true, isRequired: false, transformFunction: null }, fOutputSide: { classPropertyName: "fOutputSide", publicName: "fOutputSide", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "attr.id": "fId()", "class.f-connection-selection-disabled": "fSelectionDisabled()", "class.f-connection-reassign-disabled": "fDraggingDisabled()" }, classAttribute: "f-component f-connection" }, providers: [{ provide: F_CONNECTION, useExisting: FConnectionComponent }], exportAs: ["fComponent"], usesInheritance: true, usesOnChanges: true, ngImport: i0, template: "<svg xmlns=\"http://www.w3.org/2000/svg\" style=\"display: block; vertical-align: middle;\">\n <defs #defs></defs>\n <ng-content />\n <g class=\"f-connection-group\">\n <linearGradient fConnectionGradient></linearGradient>\n <path fConnectionSelection [attr.d]=\"path\"></path>\n <g>\n <path f-connection-path [attr.d]=\"path\"></path>\n @if (fReassignableStart()) {\n <circle f-connection-drag-handle-start r=\"8\"></circle>\n }\n <circle f-connection-drag-handle-end r=\"8\"></circle>\n </g>\n @if (fText) {\n <text f-connection-text></text>\n }\n </g>\n</svg>\n@if (fConnectionCenters().length) {\n <div #fConnectionCenter class=\"f-connection-center\">\n <ng-content select=\"[fConnectionCenter]\" />\n </div>\n}\n\n@if (fConnectionContents().length) {\n <ng-content select=\"[fConnectionContent]\" />\n}\n", styles: [":host{pointer-events:none}:host svg{overflow:visible!important;position:absolute}:host svg .f-connection-group{pointer-events:all}:host .f-connection-center,:host .f-connection-content{pointer-events:all}\n"], dependencies: [{ kind: "component", type: FConnectionTextComponent, selector: "text[f-connection-text]" }, { kind: "component", type: FConnectionDragHandleStartComponent, selector: "circle[f-connection-drag-handle-start]" }, { kind: "component", type: FConnectionDragHandleEndComponent, selector: "circle[f-connection-drag-handle-end]" }, { kind: "component", type: FConnectionGradientComponent, selector: "linearGradient[fConnectionGradient]" }, { kind: "component", type: FConnectionPathComponent, selector: "path[f-connection-path]" }, { kind: "component", type: FConnectionSelectionComponent, selector: "path[fConnectionSelection]" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
3330
3330
  }
3331
3331
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: FConnectionComponent, decorators: [{
3332
3332
  type: Component,
@@ -3335,7 +3335,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
3335
3335
  class: 'f-component f-connection',
3336
3336
  '[class.f-connection-selection-disabled]': 'fSelectionDisabled()',
3337
3337
  '[class.f-connection-reassign-disabled]': 'fDraggingDisabled()',
3338
- }, providers: [{ provide: F_CONNECTION, useExisting: FConnectionComponent }], template: "<svg\n xmlns=\"http://www.w3.org/2000/svg\"\n style=\"display: block; vertical-align: middle;\"\n>\n <defs #defs></defs>\n <ng-content></ng-content>\n <g class=\"f-connection-group\">\n <linearGradient fConnectionGradient></linearGradient>\n <path fConnectionSelection [attr.d]=\"path\"></path>\n <g>\n <path f-connection-path [attr.d]=\"path\"></path>\n @if (fReassignableStart()) {\n <circle f-connection-drag-handle-start r=\"8\"></circle>\n }\n <circle f-connection-drag-handle-end r=\"8\"></circle>\n </g>\n <text f-connection-text></text>\n </g>\n</svg>\n@if (fConnectionCenters().length) {\n <div #fConnectionCenter class=\"f-connection-center\">\n <ng-content select=\"[fConnectionCenter]\"></ng-content>\n </div>\n}\n\n@if (fConnectionContents().length) {\n <ng-content select=\"[fConnectionContent]\"></ng-content>\n}\n", styles: [":host{pointer-events:none}:host svg{overflow:visible!important;position:absolute}:host svg .f-connection-group{pointer-events:all}:host .f-connection-center,:host .f-connection-content{pointer-events:all}\n"] }]
3338
+ }, providers: [{ provide: F_CONNECTION, useExisting: FConnectionComponent }], template: "<svg xmlns=\"http://www.w3.org/2000/svg\" style=\"display: block; vertical-align: middle;\">\n <defs #defs></defs>\n <ng-content />\n <g class=\"f-connection-group\">\n <linearGradient fConnectionGradient></linearGradient>\n <path fConnectionSelection [attr.d]=\"path\"></path>\n <g>\n <path f-connection-path [attr.d]=\"path\"></path>\n @if (fReassignableStart()) {\n <circle f-connection-drag-handle-start r=\"8\"></circle>\n }\n <circle f-connection-drag-handle-end r=\"8\"></circle>\n </g>\n @if (fText) {\n <text f-connection-text></text>\n }\n </g>\n</svg>\n@if (fConnectionCenters().length) {\n <div #fConnectionCenter class=\"f-connection-center\">\n <ng-content select=\"[fConnectionCenter]\" />\n </div>\n}\n\n@if (fConnectionContents().length) {\n <ng-content select=\"[fConnectionContent]\" />\n}\n", styles: [":host{pointer-events:none}:host svg{overflow:visible!important;position:absolute}:host svg .f-connection-group{pointer-events:all}:host .f-connection-center,:host .f-connection-content{pointer-events:all}\n"] }]
3339
3339
  }], propDecorators: { fText: [{
3340
3340
  type: Input
3341
3341
  }], fTextStartOffset: [{
@@ -8862,7 +8862,7 @@ class EventExtensions {
8862
8862
  window.addEventListener('test', EventExtensions.emptyListener, { passive: true });
8863
8863
  EventExtensions._isSupported = true;
8864
8864
  }
8865
- catch (e) {
8865
+ catch {
8866
8866
  EventExtensions._isSupported = false;
8867
8867
  }
8868
8868
  }
@@ -12529,7 +12529,7 @@ class FCanvasComponent extends FCanvasBase {
12529
12529
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: FCanvasComponent, deps: null, target: i0.ɵɵFactoryTarget.Component });
12530
12530
  static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.2.0", version: "18.2.13", type: FCanvasComponent, isStandalone: true, selector: "f-canvas", inputs: { position: { classPropertyName: "position", publicName: "position", isSignal: true, isRequired: false, transformFunction: null }, scale: { classPropertyName: "scale", publicName: "scale", isSignal: true, isRequired: false, transformFunction: null }, debounceTime: { classPropertyName: "debounceTime", publicName: "debounceTime", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { fCanvasChange: "fCanvasChange" }, host: { classAttribute: "f-component f-canvas" }, providers: [
12531
12531
  { provide: F_CANVAS, useExisting: FCanvasComponent },
12532
- ], viewQueries: [{ propertyName: "fGroupsContainer", first: true, predicate: ["fGroupsContainer"], descendants: true, isSignal: true }, { propertyName: "fNodesContainer", first: true, predicate: ["fNodesContainer"], descendants: true, isSignal: true }, { propertyName: "fConnectionsContainer", first: true, predicate: ["fConnectionsContainer"], descendants: true, isSignal: true }], usesInheritance: true, ngImport: i0, template: "<ng-container>\n <div #fGroupsContainer>\n <ng-content select=\"[fGroup]\"></ng-content>\n </div>\n <div #fConnectionsContainer>\n <ng-content select=\"f-snap-connection\"></ng-content>\n <ng-content select=\"f-connection\"></ng-content>\n <ng-content select=\"f-connection-for-create\"></ng-content>\n </div>\n\n <div #fNodesContainer>\n <ng-content select=\"[fNode]\"></ng-content>\n </div>\n</ng-container>\n", styles: [":host{position:absolute;overflow:visible;width:100%;height:100%;left:0;top:0;transform-origin:0 0;pointer-events:none}:host.canvas-dragging{will-change:transform;transform:translateZ(0)}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush });
12532
+ ], viewQueries: [{ propertyName: "fGroupsContainer", first: true, predicate: ["fGroupsContainer"], descendants: true, isSignal: true }, { propertyName: "fNodesContainer", first: true, predicate: ["fNodesContainer"], descendants: true, isSignal: true }, { propertyName: "fConnectionsContainer", first: true, predicate: ["fConnectionsContainer"], descendants: true, isSignal: true }], usesInheritance: true, ngImport: i0, template: "<ng-container>\n <div #fGroupsContainer>\n <ng-content select=\"[fGroup], [fGroups]\" />\n </div>\n <div #fConnectionsContainer class=\"f-connections-container\">\n <ng-content select=\"f-snap-connection\" />\n <ng-content select=\"f-connection, [fConnections]\" />\n <ng-content select=\"f-connection-for-create\" />\n </div>\n\n <div #fNodesContainer>\n <ng-content select=\"[fNode], [fNodes]\" />\n </div>\n</ng-container>\n", styles: [":host{position:absolute;overflow:visible;width:100%;height:100%;left:0;top:0;transform-origin:0 0;pointer-events:none}:host.canvas-dragging{will-change:transform;transform:translateZ(0)}.f-connections-container{position:absolute;z-index:2}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush });
12533
12533
  }
12534
12534
  __decorate([
12535
12535
  Deprecated('setScale')
@@ -12543,7 +12543,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
12543
12543
  'class': 'f-component f-canvas',
12544
12544
  }, providers: [
12545
12545
  { provide: F_CANVAS, useExisting: FCanvasComponent },
12546
- ], changeDetection: ChangeDetectionStrategy.OnPush, template: "<ng-container>\n <div #fGroupsContainer>\n <ng-content select=\"[fGroup]\"></ng-content>\n </div>\n <div #fConnectionsContainer>\n <ng-content select=\"f-snap-connection\"></ng-content>\n <ng-content select=\"f-connection\"></ng-content>\n <ng-content select=\"f-connection-for-create\"></ng-content>\n </div>\n\n <div #fNodesContainer>\n <ng-content select=\"[fNode]\"></ng-content>\n </div>\n</ng-container>\n", styles: [":host{position:absolute;overflow:visible;width:100%;height:100%;left:0;top:0;transform-origin:0 0;pointer-events:none}:host.canvas-dragging{will-change:transform;transform:translateZ(0)}\n"] }]
12546
+ ], changeDetection: ChangeDetectionStrategy.OnPush, template: "<ng-container>\n <div #fGroupsContainer>\n <ng-content select=\"[fGroup], [fGroups]\" />\n </div>\n <div #fConnectionsContainer class=\"f-connections-container\">\n <ng-content select=\"f-snap-connection\" />\n <ng-content select=\"f-connection, [fConnections]\" />\n <ng-content select=\"f-connection-for-create\" />\n </div>\n\n <div #fNodesContainer>\n <ng-content select=\"[fNode], [fNodes]\" />\n </div>\n</ng-container>\n", styles: [":host{position:absolute;overflow:visible;width:100%;height:100%;left:0;top:0;transform-origin:0 0;pointer-events:none}:host.canvas-dragging{will-change:transform;transform:translateZ(0)}.f-connections-container{position:absolute;z-index:2}\n"] }]
12547
12547
  }], propDecorators: { setZoom: [], resetZoom: [] } });
12548
12548
 
12549
12549
  const F_CANVAS_PROVIDERS = [
@@ -12780,7 +12780,7 @@ class FFlowComponent extends FFlowBase {
12780
12780
  ...COMMON_PROVIDERS,
12781
12781
  ...F_DRAGGABLE_PROVIDERS,
12782
12782
  { provide: F_FLOW, useExisting: FFlowComponent },
12783
- ], usesInheritance: true, ngImport: i0, template: "<ng-container>\n <ng-content select=\"[fDefinitions]\"></ng-content>\n\n <ng-content select=\"f-background\"></ng-content>\n\n <ng-content select=\"f-line-alignment\"></ng-content>\n\n <ng-content select=\"f-canvas\"></ng-content>\n\n <ng-content select=\"f-selection-area\"></ng-content>\n\n <ng-content></ng-content>\n</ng-container>\n", styles: [":host{display:block;position:relative;width:100%;height:100%;overflow:hidden;pointer-events:all;-webkit-user-select:none;user-select:none;touch-action:none}::ng-deep .f-connection-content{position:absolute;left:0;top:0;pointer-events:all;transform-origin:50% 50%;will-change:transform;z-index:1}::ng-deep .f-node,::ng-deep .f-group{z-index:2;position:absolute!important;transform-origin:center;-webkit-user-select:none;user-select:none;pointer-events:all;left:0!important;top:0!important}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush });
12783
+ ], usesInheritance: true, ngImport: i0, template: "<ng-container>\n <ng-content select=\"[fDefinitions]\"></ng-content>\n\n <ng-content select=\"f-background\"></ng-content>\n\n <ng-content select=\"f-line-alignment\"></ng-content>\n\n <ng-content select=\"f-canvas\"></ng-content>\n\n <ng-content select=\"f-selection-area\"></ng-content>\n\n <ng-content></ng-content>\n</ng-container>\n", styles: [":host{display:block;position:relative;width:100%;height:100%;overflow:hidden;pointer-events:all;-webkit-user-select:none;user-select:none;touch-action:none}::ng-deep .f-connection-content{position:absolute;left:0;top:0;pointer-events:all;transform-origin:50% 50%}::ng-deep .f-node,::ng-deep .f-group{position:absolute!important;transform-origin:center;-webkit-user-select:none;user-select:none;pointer-events:all;left:0!important;top:0!important}::ng-deep .f-group{z-index:1}::ng-deep .f-connection-center,::ng-deep .f-connection-content{z-index:2}::ng-deep .f-node{z-index:3}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush });
12784
12784
  }
12785
12785
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: FFlowComponent, decorators: [{
12786
12786
  type: Component,
@@ -12795,7 +12795,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
12795
12795
  ...COMMON_PROVIDERS,
12796
12796
  ...F_DRAGGABLE_PROVIDERS,
12797
12797
  { provide: F_FLOW, useExisting: FFlowComponent },
12798
- ], changeDetection: ChangeDetectionStrategy.OnPush, template: "<ng-container>\n <ng-content select=\"[fDefinitions]\"></ng-content>\n\n <ng-content select=\"f-background\"></ng-content>\n\n <ng-content select=\"f-line-alignment\"></ng-content>\n\n <ng-content select=\"f-canvas\"></ng-content>\n\n <ng-content select=\"f-selection-area\"></ng-content>\n\n <ng-content></ng-content>\n</ng-container>\n", styles: [":host{display:block;position:relative;width:100%;height:100%;overflow:hidden;pointer-events:all;-webkit-user-select:none;user-select:none;touch-action:none}::ng-deep .f-connection-content{position:absolute;left:0;top:0;pointer-events:all;transform-origin:50% 50%;will-change:transform;z-index:1}::ng-deep .f-node,::ng-deep .f-group{z-index:2;position:absolute!important;transform-origin:center;-webkit-user-select:none;user-select:none;pointer-events:all;left:0!important;top:0!important}\n"] }]
12798
+ ], changeDetection: ChangeDetectionStrategy.OnPush, template: "<ng-container>\n <ng-content select=\"[fDefinitions]\"></ng-content>\n\n <ng-content select=\"f-background\"></ng-content>\n\n <ng-content select=\"f-line-alignment\"></ng-content>\n\n <ng-content select=\"f-canvas\"></ng-content>\n\n <ng-content select=\"f-selection-area\"></ng-content>\n\n <ng-content></ng-content>\n</ng-container>\n", styles: [":host{display:block;position:relative;width:100%;height:100%;overflow:hidden;pointer-events:all;-webkit-user-select:none;user-select:none;touch-action:none}::ng-deep .f-connection-content{position:absolute;left:0;top:0;pointer-events:all;transform-origin:50% 50%}::ng-deep .f-node,::ng-deep .f-group{position:absolute!important;transform-origin:center;-webkit-user-select:none;user-select:none;pointer-events:all;left:0!important;top:0!important}::ng-deep .f-group{z-index:1}::ng-deep .f-connection-center,::ng-deep .f-connection-content{z-index:2}::ng-deep .f-node{z-index:3}\n"] }]
12799
12799
  }] });
12800
12800
 
12801
12801
  const F_FLOW_PROVIDERS = [
@@ -12813,43 +12813,48 @@ class FZoomBase {
12813
12813
  }
12814
12814
 
12815
12815
  class FZoomDirective extends FZoomBase {
12816
- _fMediator = inject(FMediator);
12817
- _rendered = inject(Renderer2);
12818
- _triggersListener = [];
12819
- isEnabled = false;
12816
+ _mediator = inject(FMediator);
12817
+ _injector = inject(Injector);
12818
+ _triggersListener = EventExtensions.emptyListener();
12819
+ isEnabled = input(false, { alias: 'fZoom', transform: booleanAttribute });
12820
12820
  fWheelTrigger = defaultEventTrigger;
12821
12821
  fDblClickTrigger = defaultEventTrigger;
12822
12822
  minimum = 0.1;
12823
12823
  maximum = 4;
12824
12824
  step = 0.1;
12825
12825
  dblClickStep = 0.5;
12826
- get _fHost() {
12827
- return this._fMediator.execute(new GetFlowHostElementRequest());
12826
+ get _hostElement() {
12827
+ return this._mediator.execute(new GetFlowHostElementRequest());
12828
12828
  }
12829
- get _fCanvas() {
12830
- return this._fMediator.execute(new GetCanvasRequest());
12829
+ get _canvas() {
12830
+ return this._mediator.execute(new GetCanvasRequest());
12831
12831
  }
12832
12832
  ngOnInit() {
12833
- this._fMediator.execute(new AddZoomToStoreRequest(this));
12833
+ this._mediator.execute(new AddZoomToStoreRequest(this));
12834
12834
  }
12835
12835
  ngAfterViewInit() {
12836
- this._listenTriggers();
12836
+ this._listenZoomEnabledChanges();
12837
12837
  }
12838
- ngOnChanges(changes) {
12839
- if (changes['isEnabled']) {
12840
- this._listenTriggers();
12841
- }
12838
+ _listenZoomEnabledChanges() {
12839
+ effect(() => {
12840
+ this.isEnabled();
12841
+ untracked(() => this._listenTriggers());
12842
+ }, { injector: this._injector });
12842
12843
  }
12843
12844
  _listenTriggers() {
12844
- if (!this._fHost) {
12845
+ if (!this._hostElement) {
12845
12846
  return;
12846
12847
  }
12847
12848
  this._disposeListeners();
12848
- if (!this.isEnabled) {
12849
+ if (!this.isEnabled()) {
12849
12850
  return;
12850
12851
  }
12851
- this._triggersListener.push(this._rendered.listen(this._fHost, 'wheel', this._onWheel));
12852
- this._triggersListener.push(this._rendered.listen(this._fHost, 'dblclick', this._onDoubleClick));
12852
+ this._listen('wheel', this._onWheel, EventExtensions.activeListener());
12853
+ this._listen('dblclick', this._onDoubleClick);
12854
+ this._triggersListener = () => {
12855
+ this._unlisten('wheel', this._onWheel, EventExtensions.activeListener());
12856
+ this._unlisten('dblclick', this._onDoubleClick);
12857
+ };
12853
12858
  }
12854
12859
  _onWheel = (event) => {
12855
12860
  if (!isValidEventTrigger(event, this.fWheelTrigger)) {
@@ -12892,10 +12897,10 @@ class FZoomDirective extends FZoomBase {
12892
12897
  this._onZoomToCenter(EFZoomDirection.ZOOM_OUT, position);
12893
12898
  }
12894
12899
  _onZoomToCenter(direction, position) {
12895
- this.setZoom(this._getToCenterPosition(position, RectExtensions.fromElement(this._fHost)), this.step, direction, false);
12900
+ this.setZoom(this._getToCenterPosition(position, RectExtensions.fromElement(this._hostElement)), this.step, direction, false);
12896
12901
  }
12897
12902
  setZoom(position, step, direction, animated) {
12898
- this._fMediator.execute(new SetZoomRequest(position, step, direction, animated));
12903
+ this._mediator.execute(new SetZoomRequest(position, step, direction, animated));
12899
12904
  }
12900
12905
  /**
12901
12906
  * @deprecated Method "getScale" is deprecated. Use "getZoomValue" instead. This method will be removed in version 18.0.0.`,
@@ -12904,21 +12909,27 @@ class FZoomDirective extends FZoomBase {
12904
12909
  return this.getZoomValue();
12905
12910
  }
12906
12911
  getZoomValue() {
12907
- return this._fCanvas.transform.scale || 1;
12912
+ return this._canvas.transform.scale || 1;
12908
12913
  }
12909
12914
  reset() {
12910
- this._fMediator.execute(new ResetZoomRequest());
12915
+ this._mediator.execute(new ResetZoomRequest());
12911
12916
  }
12912
12917
  _disposeListeners() {
12913
- this._triggersListener.forEach((listener) => listener());
12914
- this._triggersListener = [];
12918
+ this._triggersListener();
12919
+ this._triggersListener = EventExtensions.emptyListener();
12915
12920
  }
12916
12921
  ngOnDestroy() {
12917
12922
  this._disposeListeners();
12918
- this._fMediator.execute(new RemoveZoomFromStoreRequest());
12923
+ this._mediator.execute(new RemoveZoomFromStoreRequest());
12924
+ }
12925
+ _listen(type, listener, options) {
12926
+ this._hostElement.addEventListener(type, listener, options);
12927
+ }
12928
+ _unlisten(type, listener, options) {
12929
+ this._hostElement.removeEventListener(type, listener, options);
12919
12930
  }
12920
12931
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: FZoomDirective, deps: null, target: i0.ɵɵFactoryTarget.Directive });
12921
- static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "16.1.0", version: "18.2.13", type: FZoomDirective, isStandalone: true, selector: "f-canvas[fZoom]", inputs: { isEnabled: ["fZoom", "isEnabled", booleanAttribute], fWheelTrigger: "fWheelTrigger", fDblClickTrigger: "fDblClickTrigger", minimum: ["fZoomMinimum", "minimum", numberAttribute], maximum: ["fZoomMaximum", "maximum", numberAttribute], step: ["fZoomStep", "step", numberAttribute], dblClickStep: ["fZoomDblClickStep", "dblClickStep", numberAttribute] }, host: { classAttribute: "f-zoom f-component" }, providers: [{ provide: F_ZOOM, useExisting: FZoomDirective }], exportAs: ["fComponent"], usesInheritance: true, usesOnChanges: true, ngImport: i0 });
12932
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "18.2.13", type: FZoomDirective, isStandalone: true, selector: "f-canvas[fZoom]", inputs: { isEnabled: { classPropertyName: "isEnabled", publicName: "fZoom", isSignal: true, isRequired: false, transformFunction: null }, fWheelTrigger: { classPropertyName: "fWheelTrigger", publicName: "fWheelTrigger", isSignal: false, isRequired: false, transformFunction: null }, fDblClickTrigger: { classPropertyName: "fDblClickTrigger", publicName: "fDblClickTrigger", isSignal: false, isRequired: false, transformFunction: null }, minimum: { classPropertyName: "minimum", publicName: "fZoomMinimum", isSignal: false, isRequired: false, transformFunction: numberAttribute }, maximum: { classPropertyName: "maximum", publicName: "fZoomMaximum", isSignal: false, isRequired: false, transformFunction: numberAttribute }, step: { classPropertyName: "step", publicName: "fZoomStep", isSignal: false, isRequired: false, transformFunction: numberAttribute }, dblClickStep: { classPropertyName: "dblClickStep", publicName: "fZoomDblClickStep", isSignal: false, isRequired: false, transformFunction: numberAttribute } }, host: { classAttribute: "f-zoom f-component" }, providers: [{ provide: F_ZOOM, useExisting: FZoomDirective }], exportAs: ["fComponent"], usesInheritance: true, ngImport: i0 });
12922
12933
  }
12923
12934
  __decorate([
12924
12935
  Deprecated('getZoomValue')
@@ -12926,7 +12937,7 @@ __decorate([
12926
12937
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: FZoomDirective, decorators: [{
12927
12938
  type: Directive,
12928
12939
  args: [{
12929
- selector: "f-canvas[fZoom]",
12940
+ selector: 'f-canvas[fZoom]',
12930
12941
  exportAs: 'fComponent',
12931
12942
  standalone: true,
12932
12943
  host: {
@@ -12934,10 +12945,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
12934
12945
  },
12935
12946
  providers: [{ provide: F_ZOOM, useExisting: FZoomDirective }],
12936
12947
  }]
12937
- }], propDecorators: { isEnabled: [{
12938
- type: Input,
12939
- args: [{ alias: 'fZoom', transform: booleanAttribute }]
12940
- }], fWheelTrigger: [{
12948
+ }], propDecorators: { fWheelTrigger: [{
12941
12949
  type: Input
12942
12950
  }], fDblClickTrigger: [{
12943
12951
  type: Input