@scion/components 18.0.1 → 18.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -9,7 +9,7 @@ The SCION Components is a collection of Angular components and directives primar
9
9
  Provides a viewport component with scrollbars that sit on top of the viewport client.
10
10
 
11
11
  - [**Dimension**][link-tool-dimension]\
12
- Provides a directive for observing changes in the size of the host element.
12
+ Provides a set of tools for observing the size and position of an element.
13
13
 
14
14
  - [**Sashbox**][link-tool-sashbox]\
15
15
  Provides a sashbox component for splitting content into multiple parts, which the user can resize by moving the splitter between the parts.
@@ -37,4 +37,4 @@ License: EPL-2.0
37
37
  [link-tool-dimension]: https://github.com/SchweizerischeBundesbahnen/scion-toolkit/blob/master/docs/site/tools/dimension.md
38
38
  [link-tool-sashbox]: https://github.com/SchweizerischeBundesbahnen/scion-toolkit/blob/master/docs/site/tools/sashbox.md
39
39
  [link-tool-splitter]: https://github.com/SchweizerischeBundesbahnen/scion-toolkit/blob/master/docs/site/tools/splitter.md
40
- [link-tool-throbber]: https://github.com/SchweizerischeBundesbahnen/scion-toolkit/blob/master/docs/site/tools/throbber.md
40
+ [link-tool-throbber]: https://github.com/SchweizerischeBundesbahnen/scion-toolkit/blob/master/docs/site/tools/throbber.md
@@ -0,0 +1,23 @@
1
+ import { ElementRef, Injector, Signal } from '@angular/core';
2
+ /**
3
+ * Creates a signal observing the bounding box of an element.
4
+ *
5
+ * The bounding box includes the element's position relative to the top-left of the viewport and its size.
6
+ * Refer to https://developer.mozilla.org/en-US/docs/Web/API/Element/getBoundingClientRect for more details.
7
+ *
8
+ * The element can be passed as a signal, enabling observation of view children in the component constructor.
9
+ *
10
+ * There is no native browser API to observe the position of an element. The signal uses {@link IntersectionObserver} and
11
+ * {@link ResizeObserver} to detect position changes. For tracking only size changes, use the {@link dimension} signal instead.
12
+ *
13
+ * Usage:
14
+ * - Must be called within an injection context or an injector provided. Destroying the injector will unsubscribe the signal.
15
+ * - Must not be called within a reactive context to avoid repeated subscriptions.
16
+ * - The element and the document root (`<html>`) must be positioned `relative` or `absolute`. If not, a warning is logged, and positioning changed to `relative`.
17
+ */
18
+ export declare function boundingClientRect(elementLike: HTMLElement | ElementRef<HTMLElement> | Signal<HTMLElement | ElementRef<HTMLElement>>, options?: {
19
+ injector?: Injector;
20
+ }): Signal<DOMRect>;
21
+ export declare function boundingClientRect(elementLike: HTMLElement | ElementRef<HTMLElement> | Signal<HTMLElement | ElementRef<HTMLElement> | undefined>, options?: {
22
+ injector?: Injector;
23
+ }): Signal<DOMRect | undefined>;
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Represents the dimension of an element.
3
+ */
4
+ export interface SciDimension {
5
+ offsetWidth: number;
6
+ offsetHeight: number;
7
+ clientWidth: number;
8
+ clientHeight: number;
9
+ element: HTMLElement;
10
+ }
@@ -1,8 +1,7 @@
1
+ import { SciDimension } from './dimension';
1
2
  import * as i0 from "@angular/core";
2
3
  /**
3
- * Observes changes to the size of the host element.
4
- *
5
- * Upon subscription, emits the current size, and then continuously when the size changes. The Observable never completes.
4
+ * Observes the size of the host element.
6
5
  *
7
6
  * ---
8
7
  * Usage:
@@ -13,24 +12,14 @@ import * as i0 from "@angular/core";
13
12
  */
14
13
  export declare class SciDimensionDirective {
15
14
  /**
16
- * Controls if to emit outside the Angular zone. Defaults to `false`.
15
+ * Controls if to output outside the Angular zone. Defaults to `false`.
17
16
  */
18
17
  emitOutsideAngular: import("@angular/core").InputSignal<boolean>;
19
18
  /**
20
- * Upon subscription, emits the current size, and then continuously when the size changes. The Observable never completes.
19
+ * Outputs the size of the element.
21
20
  */
22
21
  dimensionChange: import("@angular/core").OutputEmitterRef<SciDimension>;
23
22
  constructor();
24
23
  static ɵfac: i0.ɵɵFactoryDeclaration<SciDimensionDirective, never>;
25
24
  static ɵdir: i0.ɵɵDirectiveDeclaration<SciDimensionDirective, "[sciDimension]", never, { "emitOutsideAngular": { "alias": "emitOutsideAngular"; "required": false; "isSignal": true; }; }, { "dimensionChange": "sciDimensionChange"; }, never, never, true, never>;
26
25
  }
27
- /**
28
- * Represents the dimension of an element.
29
- */
30
- export interface SciDimension {
31
- offsetWidth: number;
32
- offsetHeight: number;
33
- clientWidth: number;
34
- clientHeight: number;
35
- element: HTMLElement;
36
- }
@@ -0,0 +1,19 @@
1
+ import { ElementRef, Injector, Signal } from '@angular/core';
2
+ import { SciDimension } from './dimension';
3
+ /**
4
+ * Creates a signal observing the size of an element.
5
+ *
6
+ * The element can be passed as a signal, enabling observation of view children in the component constructor.
7
+ *
8
+ * The signal subscribes to the native {@link ResizeObserver} to monitor element size changes. Destroying the injection context will unsubscribe the observer.
9
+ *
10
+ * Usage:
11
+ * - Must be called within an injection context or an injector provided. Destroying the injector will unsubscribe the signal.
12
+ * - Must not be called within a reactive context to avoid repeated subscriptions.
13
+ */
14
+ export declare function dimension(elementLike: HTMLElement | ElementRef<HTMLElement> | Signal<HTMLElement | ElementRef<HTMLElement>>, options?: {
15
+ injector?: Injector;
16
+ }): Signal<SciDimension>;
17
+ export declare function dimension(elementLike: HTMLElement | ElementRef<HTMLElement> | Signal<HTMLElement | ElementRef<HTMLElement> | undefined>, options?: {
18
+ injector?: Injector;
19
+ }): Signal<SciDimension | undefined>;
@@ -1,2 +1,5 @@
1
1
  export { SciDimensionModule } from './dimension.module';
2
- export { SciDimensionDirective, SciDimension } from './dimension.directive';
2
+ export { SciDimensionDirective } from './dimension.directive';
3
+ export { dimension } from './dimension.signal';
4
+ export { boundingClientRect } from './bounding-client-rect.signal';
5
+ export { SciDimension } from './dimension';
@@ -0,0 +1,54 @@
1
+ /*
2
+ * Copyright (c) 2018-2024 Swiss Federal Railways
3
+ *
4
+ * This program and the accompanying materials are made
5
+ * available under the terms of the Eclipse Public License 2.0
6
+ * which is available at https://www.eclipse.org/legal/epl-2.0/
7
+ *
8
+ * SPDX-License-Identifier: EPL-2.0
9
+ */
10
+ import { assertInInjectionContext, assertNotInReactiveContext, computed, effect, inject, Injector, isSignal, NgZone, signal, untracked } from '@angular/core';
11
+ import { coerceElement } from '@angular/cdk/coercion';
12
+ import { fromBoundingClientRect$ } from '@scion/toolkit/observable';
13
+ import { subscribeIn } from '@scion/toolkit/operators';
14
+ export function boundingClientRect(elementLike, options) {
15
+ assertNotInReactiveContext(boundingClientRect, 'Invoking `boundingClientRect` causes new subscriptions every time. Move `boundingClientRect` outside of the reactive context and read the signal value where needed.');
16
+ if (!options?.injector) {
17
+ assertInInjectionContext(boundingClientRect);
18
+ }
19
+ const injector = options?.injector ?? inject(Injector);
20
+ const zone = injector.get(NgZone);
21
+ const element = computed(() => coerceElement(isSignal(elementLike) ? elementLike() : elementLike));
22
+ const onBoundingBoxChange = signal(undefined, { equal: () => false });
23
+ // Subscribe to element bounding box changes.
24
+ effect(onCleanup => {
25
+ const el = element();
26
+ if (!el) {
27
+ return;
28
+ }
29
+ untracked(() => {
30
+ const subscription = fromBoundingClientRect$(el)
31
+ // Avoid triggering change detection cycle.
32
+ .pipe(subscribeIn(fn => zone.runOutsideAngular(fn)))
33
+ .subscribe(() => {
34
+ NgZone.assertNotInAngularZone();
35
+ onBoundingBoxChange.set();
36
+ });
37
+ onCleanup(() => subscription.unsubscribe());
38
+ });
39
+ }, { injector });
40
+ // Create signal that recomputes each time the bounding box changes.
41
+ return computed(() => {
42
+ const el = element();
43
+ if (!el) {
44
+ return undefined;
45
+ }
46
+ // Track bounding box.
47
+ onBoundingBoxChange();
48
+ return el.getBoundingClientRect();
49
+ }, { equal: isEqualDomRect });
50
+ }
51
+ function isEqualDomRect(a, b) {
52
+ return a?.top === b?.top && a?.right === b?.right && a?.bottom === b?.bottom && a?.left === b?.left;
53
+ }
54
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYm91bmRpbmctY2xpZW50LXJlY3Quc2lnbmFsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc2Npb24vY29tcG9uZW50cy9kaW1lbnNpb24vc3JjL2JvdW5kaW5nLWNsaWVudC1yZWN0LnNpZ25hbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7R0FRRztBQUVILE9BQU8sRUFBQyx3QkFBd0IsRUFBRSwwQkFBMEIsRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFjLE1BQU0sRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQVUsU0FBUyxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBQ2hMLE9BQU8sRUFBQyxhQUFhLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQUNwRCxPQUFPLEVBQUMsdUJBQXVCLEVBQUMsTUFBTSwyQkFBMkIsQ0FBQztBQUNsRSxPQUFPLEVBQUMsV0FBVyxFQUFDLE1BQU0sMEJBQTBCLENBQUM7QUFvQnJELE1BQU0sVUFBVSxrQkFBa0IsQ0FBQyxXQUE4RyxFQUFFLE9BQStCO0lBQ2hMLDBCQUEwQixDQUFDLGtCQUFrQixFQUFFLHNLQUFzSyxDQUFDLENBQUM7SUFDdk4sSUFBSSxDQUFDLE9BQU8sRUFBRSxRQUFRLEVBQUUsQ0FBQztRQUN2Qix3QkFBd0IsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO0lBQy9DLENBQUM7SUFFRCxNQUFNLFFBQVEsR0FBRyxPQUFPLEVBQUUsUUFBUSxJQUFJLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUN2RCxNQUFNLElBQUksR0FBRyxRQUFRLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ2xDLE1BQU0sT0FBTyxHQUFHLFFBQVEsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQztJQUNuRyxNQUFNLG1CQUFtQixHQUFHLE1BQU0sQ0FBTyxTQUFTLEVBQUUsRUFBQyxLQUFLLEVBQUUsR0FBRyxFQUFFLENBQUMsS0FBSyxFQUFDLENBQUMsQ0FBQztJQUUxRSw2Q0FBNkM7SUFDN0MsTUFBTSxDQUFDLFNBQVMsQ0FBQyxFQUFFO1FBQ2pCLE1BQU0sRUFBRSxHQUFHLE9BQU8sRUFBRSxDQUFDO1FBQ3JCLElBQUksQ0FBQyxFQUFFLEVBQUUsQ0FBQztZQUNSLE9BQU87UUFDVCxDQUFDO1FBRUQsU0FBUyxDQUFDLEdBQUcsRUFBRTtZQUNiLE1BQU0sWUFBWSxHQUFHLHVCQUF1QixDQUFDLEVBQUUsQ0FBQztnQkFDOUMsMkNBQTJDO2lCQUMxQyxJQUFJLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7aUJBQ25ELFNBQVMsQ0FBQyxHQUFHLEVBQUU7Z0JBQ2QsTUFBTSxDQUFDLHNCQUFzQixFQUFFLENBQUM7Z0JBQ2hDLG1CQUFtQixDQUFDLEdBQUcsRUFBRSxDQUFDO1lBQzVCLENBQUMsQ0FBQyxDQUFDO1lBQ0wsU0FBUyxDQUFDLEdBQUcsRUFBRSxDQUFDLFlBQVksQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDO1FBQzlDLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxFQUFFLEVBQUMsUUFBUSxFQUFDLENBQUMsQ0FBQztJQUVmLG9FQUFvRTtJQUNwRSxPQUFPLFFBQVEsQ0FBQyxHQUFHLEVBQUU7UUFDbkIsTUFBTSxFQUFFLEdBQUcsT0FBTyxFQUFFLENBQUM7UUFDckIsSUFBSSxDQUFDLEVBQUUsRUFBRSxDQUFDO1lBQ1IsT0FBTyxTQUFTLENBQUM7UUFDbkIsQ0FBQztRQUVELHNCQUFzQjtRQUN0QixtQkFBbUIsRUFBRSxDQUFDO1FBRXRCLE9BQU8sRUFBRSxDQUFDLHFCQUFxQixFQUFFLENBQUM7SUFDcEMsQ0FBQyxFQUFFLEVBQUMsS0FBSyxFQUFFLGNBQWMsRUFBQyxDQUFDLENBQUM7QUFDOUIsQ0FBQztBQUVELFNBQVMsY0FBYyxDQUFDLENBQXNCLEVBQUUsQ0FBc0I7SUFDcEUsT0FBTyxDQUFDLEVBQUUsR0FBRyxLQUFLLENBQUMsRUFBRSxHQUFHLElBQUksQ0FBQyxFQUFFLEtBQUssS0FBSyxDQUFDLEVBQUUsS0FBSyxJQUFJLENBQUMsRUFBRSxNQUFNLEtBQUssQ0FBQyxFQUFFLE1BQU0sSUFBSSxDQUFDLEVBQUUsSUFBSSxLQUFLLENBQUMsRUFBRSxJQUFJLENBQUM7QUFDdEcsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTgtMjAyNCBTd2lzcyBGZWRlcmFsIFJhaWx3YXlzXG4gKlxuICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZVxuICogYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSAyLjBcbiAqIHdoaWNoIGlzIGF2YWlsYWJsZSBhdCBodHRwczovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wL1xuICpcbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wXG4gKi9cblxuaW1wb3J0IHthc3NlcnRJbkluamVjdGlvbkNvbnRleHQsIGFzc2VydE5vdEluUmVhY3RpdmVDb250ZXh0LCBjb21wdXRlZCwgZWZmZWN0LCBFbGVtZW50UmVmLCBpbmplY3QsIEluamVjdG9yLCBpc1NpZ25hbCwgTmdab25lLCBzaWduYWwsIFNpZ25hbCwgdW50cmFja2VkfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7Y29lcmNlRWxlbWVudH0gZnJvbSAnQGFuZ3VsYXIvY2RrL2NvZXJjaW9uJztcbmltcG9ydCB7ZnJvbUJvdW5kaW5nQ2xpZW50UmVjdCR9IGZyb20gJ0BzY2lvbi90b29sa2l0L29ic2VydmFibGUnO1xuaW1wb3J0IHtzdWJzY3JpYmVJbn0gZnJvbSAnQHNjaW9uL3Rvb2xraXQvb3BlcmF0b3JzJztcblxuLyoqXG4gKiBDcmVhdGVzIGEgc2lnbmFsIG9ic2VydmluZyB0aGUgYm91bmRpbmcgYm94IG9mIGFuIGVsZW1lbnQuXG4gKlxuICogVGhlIGJvdW5kaW5nIGJveCBpbmNsdWRlcyB0aGUgZWxlbWVudCdzIHBvc2l0aW9uIHJlbGF0aXZlIHRvIHRoZSB0b3AtbGVmdCBvZiB0aGUgdmlld3BvcnQgYW5kIGl0cyBzaXplLlxuICogUmVmZXIgdG8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL0VsZW1lbnQvZ2V0Qm91bmRpbmdDbGllbnRSZWN0IGZvciBtb3JlIGRldGFpbHMuXG4gKlxuICogVGhlIGVsZW1lbnQgY2FuIGJlIHBhc3NlZCBhcyBhIHNpZ25hbCwgZW5hYmxpbmcgb2JzZXJ2YXRpb24gb2YgdmlldyBjaGlsZHJlbiBpbiB0aGUgY29tcG9uZW50IGNvbnN0cnVjdG9yLlxuICpcbiAqIFRoZXJlIGlzIG5vIG5hdGl2ZSBicm93c2VyIEFQSSB0byBvYnNlcnZlIHRoZSBwb3NpdGlvbiBvZiBhbiBlbGVtZW50LiBUaGUgc2lnbmFsIHVzZXMge0BsaW5rIEludGVyc2VjdGlvbk9ic2VydmVyfSBhbmRcbiAqIHtAbGluayBSZXNpemVPYnNlcnZlcn0gdG8gZGV0ZWN0IHBvc2l0aW9uIGNoYW5nZXMuIEZvciB0cmFja2luZyBvbmx5IHNpemUgY2hhbmdlcywgdXNlIHRoZSB7QGxpbmsgZGltZW5zaW9ufSBzaWduYWwgaW5zdGVhZC5cbiAqXG4gKiBVc2FnZTpcbiAqIC0gTXVzdCBiZSBjYWxsZWQgd2l0aGluIGFuIGluamVjdGlvbiBjb250ZXh0IG9yIGFuIGluamVjdG9yIHByb3ZpZGVkLiBEZXN0cm95aW5nIHRoZSBpbmplY3RvciB3aWxsIHVuc3Vic2NyaWJlIHRoZSBzaWduYWwuXG4gKiAtIE11c3Qgbm90IGJlIGNhbGxlZCB3aXRoaW4gYSByZWFjdGl2ZSBjb250ZXh0IHRvIGF2b2lkIHJlcGVhdGVkIHN1YnNjcmlwdGlvbnMuXG4gKiAtIFRoZSBlbGVtZW50IGFuZCB0aGUgZG9jdW1lbnQgcm9vdCAoYDxodG1sPmApIG11c3QgYmUgcG9zaXRpb25lZCBgcmVsYXRpdmVgIG9yIGBhYnNvbHV0ZWAuIElmIG5vdCwgYSB3YXJuaW5nIGlzIGxvZ2dlZCwgYW5kIHBvc2l0aW9uaW5nIGNoYW5nZWQgdG8gYHJlbGF0aXZlYC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJvdW5kaW5nQ2xpZW50UmVjdChlbGVtZW50TGlrZTogSFRNTEVsZW1lbnQgfCBFbGVtZW50UmVmPEhUTUxFbGVtZW50PiB8IFNpZ25hbDxIVE1MRWxlbWVudCB8IEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+Piwgb3B0aW9ucz86IHtpbmplY3Rvcj86IEluamVjdG9yfSk6IFNpZ25hbDxET01SZWN0PjtcbmV4cG9ydCBmdW5jdGlvbiBib3VuZGluZ0NsaWVudFJlY3QoZWxlbWVudExpa2U6IEhUTUxFbGVtZW50IHwgRWxlbWVudFJlZjxIVE1MRWxlbWVudD4gfCBTaWduYWw8SFRNTEVsZW1lbnQgfCBFbGVtZW50UmVmPEhUTUxFbGVtZW50PiB8IHVuZGVmaW5lZD4sIG9wdGlvbnM/OiB7aW5qZWN0b3I/OiBJbmplY3Rvcn0pOiBTaWduYWw8RE9NUmVjdCB8IHVuZGVmaW5lZD47XG5leHBvcnQgZnVuY3Rpb24gYm91bmRpbmdDbGllbnRSZWN0KGVsZW1lbnRMaWtlOiBIVE1MRWxlbWVudCB8IEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+IHwgU2lnbmFsPEhUTUxFbGVtZW50IHwgRWxlbWVudFJlZjxIVE1MRWxlbWVudD4gfCB1bmRlZmluZWQ+LCBvcHRpb25zPzoge2luamVjdG9yPzogSW5qZWN0b3J9KTogU2lnbmFsPERPTVJlY3QgfCB1bmRlZmluZWQ+IHtcbiAgYXNzZXJ0Tm90SW5SZWFjdGl2ZUNvbnRleHQoYm91bmRpbmdDbGllbnRSZWN0LCAnSW52b2tpbmcgYGJvdW5kaW5nQ2xpZW50UmVjdGAgY2F1c2VzIG5ldyBzdWJzY3JpcHRpb25zIGV2ZXJ5IHRpbWUuIE1vdmUgYGJvdW5kaW5nQ2xpZW50UmVjdGAgb3V0c2lkZSBvZiB0aGUgcmVhY3RpdmUgY29udGV4dCBhbmQgcmVhZCB0aGUgc2lnbmFsIHZhbHVlIHdoZXJlIG5lZWRlZC4nKTtcbiAgaWYgKCFvcHRpb25zPy5pbmplY3Rvcikge1xuICAgIGFzc2VydEluSW5qZWN0aW9uQ29udGV4dChib3VuZGluZ0NsaWVudFJlY3QpO1xuICB9XG5cbiAgY29uc3QgaW5qZWN0b3IgPSBvcHRpb25zPy5pbmplY3RvciA/PyBpbmplY3QoSW5qZWN0b3IpO1xuICBjb25zdCB6b25lID0gaW5qZWN0b3IuZ2V0KE5nWm9uZSk7XG4gIGNvbnN0IGVsZW1lbnQgPSBjb21wdXRlZCgoKSA9PiBjb2VyY2VFbGVtZW50KGlzU2lnbmFsKGVsZW1lbnRMaWtlKSA/IGVsZW1lbnRMaWtlKCkgOiBlbGVtZW50TGlrZSkpO1xuICBjb25zdCBvbkJvdW5kaW5nQm94Q2hhbmdlID0gc2lnbmFsPHZvaWQ+KHVuZGVmaW5lZCwge2VxdWFsOiAoKSA9PiBmYWxzZX0pO1xuXG4gIC8vIFN1YnNjcmliZSB0byBlbGVtZW50IGJvdW5kaW5nIGJveCBjaGFuZ2VzLlxuICBlZmZlY3Qob25DbGVhbnVwID0+IHtcbiAgICBjb25zdCBlbCA9IGVsZW1lbnQoKTtcbiAgICBpZiAoIWVsKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdW50cmFja2VkKCgpID0+IHtcbiAgICAgIGNvbnN0IHN1YnNjcmlwdGlvbiA9IGZyb21Cb3VuZGluZ0NsaWVudFJlY3QkKGVsKVxuICAgICAgICAvLyBBdm9pZCB0cmlnZ2VyaW5nIGNoYW5nZSBkZXRlY3Rpb24gY3ljbGUuXG4gICAgICAgIC5waXBlKHN1YnNjcmliZUluKGZuID0+IHpvbmUucnVuT3V0c2lkZUFuZ3VsYXIoZm4pKSlcbiAgICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgTmdab25lLmFzc2VydE5vdEluQW5ndWxhclpvbmUoKTtcbiAgICAgICAgICBvbkJvdW5kaW5nQm94Q2hhbmdlLnNldCgpO1xuICAgICAgICB9KTtcbiAgICAgIG9uQ2xlYW51cCgoKSA9PiBzdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKSk7XG4gICAgfSk7XG4gIH0sIHtpbmplY3Rvcn0pO1xuXG4gIC8vIENyZWF0ZSBzaWduYWwgdGhhdCByZWNvbXB1dGVzIGVhY2ggdGltZSB0aGUgYm91bmRpbmcgYm94IGNoYW5nZXMuXG4gIHJldHVybiBjb21wdXRlZCgoKSA9PiB7XG4gICAgY29uc3QgZWwgPSBlbGVtZW50KCk7XG4gICAgaWYgKCFlbCkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICAvLyBUcmFjayBib3VuZGluZyBib3guXG4gICAgb25Cb3VuZGluZ0JveENoYW5nZSgpO1xuXG4gICAgcmV0dXJuIGVsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICB9LCB7ZXF1YWw6IGlzRXF1YWxEb21SZWN0fSk7XG59XG5cbmZ1bmN0aW9uIGlzRXF1YWxEb21SZWN0KGE6IERPTVJlY3QgfCB1bmRlZmluZWQsIGI6IERPTVJlY3QgfCB1bmRlZmluZWQpOiBib29sZWFuIHtcbiAgcmV0dXJuIGE/LnRvcCA9PT0gYj8udG9wICYmIGE/LnJpZ2h0ID09PSBiPy5yaWdodCAmJiBhPy5ib3R0b20gPT09IGI/LmJvdHRvbSAmJiBhPy5sZWZ0ID09PSBiPy5sZWZ0O1xufVxuIl19
@@ -10,13 +10,10 @@
10
10
  import { Directive, ElementRef, inject, input, NgZone, output } from '@angular/core';
11
11
  import { fromResize$ } from '@scion/toolkit/observable';
12
12
  import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
13
- import { observeInside, subscribeInside } from '@scion/toolkit/operators';
14
- import { animationFrameScheduler, observeOn, subscribeOn } from 'rxjs';
13
+ import { observeIn, subscribeIn } from '@scion/toolkit/operators';
15
14
  import * as i0 from "@angular/core";
16
15
  /**
17
- * Observes changes to the size of the host element.
18
- *
19
- * Upon subscription, emits the current size, and then continuously when the size changes. The Observable never completes.
16
+ * Observes the size of the host element.
20
17
  *
21
18
  * ---
22
19
  * Usage:
@@ -28,20 +25,26 @@ import * as i0 from "@angular/core";
28
25
  export class SciDimensionDirective {
29
26
  constructor() {
30
27
  /**
31
- * Controls if to emit outside the Angular zone. Defaults to `false`.
28
+ * Controls if to output outside the Angular zone. Defaults to `false`.
32
29
  */
33
30
  this.emitOutsideAngular = input(false);
34
31
  /**
35
- * Upon subscription, emits the current size, and then continuously when the size changes. The Observable never completes.
32
+ * Outputs the size of the element.
36
33
  */
37
34
  this.dimensionChange = output({ alias: 'sciDimensionChange' });
38
35
  const host = inject((ElementRef)).nativeElement;
39
36
  const zone = inject(NgZone);
40
37
  fromResize$(host)
41
- .pipe(subscribeInside(continueFn => zone.runOutsideAngular(continueFn)), observeInside(continueFn => this.emitOutsideAngular() ? continueFn() : zone.run(continueFn)), subscribeOn(animationFrameScheduler), // to not block resize callback (ResizeObserver loop completed with undelivered notifications)
42
- observeOn(animationFrameScheduler), // to not block resize callback (ResizeObserver loop completed with undelivered notifications)
43
- takeUntilDestroyed())
38
+ .pipe(
39
+ // Avoid triggering change detection cycle.
40
+ subscribeIn(fn => zone.runOutsideAngular(fn)),
41
+ // Run in animation frame to prevent 'ResizeObserver loop completed with undelivered notifications' error.
42
+ // Do not use `animationFrameScheduler` because the scheduler does not necessarily execute in the current execution context, such as inside or outside Angular.
43
+ // The scheduler always executes tasks in the context (e.g. zone) where the scheduler was first used in the application.
44
+ observeIn(fn => requestAnimationFrame(fn)), observeIn(fn => this.emitOutsideAngular() ? fn() : zone.run(fn)), takeUntilDestroyed())
44
45
  .subscribe(() => {
46
+ // Assert Angular zone.
47
+ this.emitOutsideAngular() ? NgZone.assertNotInAngularZone() : NgZone.assertInAngularZone();
45
48
  this.dimensionChange.emit({
46
49
  clientWidth: host.clientWidth,
47
50
  offsetWidth: host.offsetWidth,
@@ -61,4 +64,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.1", ngImpor
61
64
  standalone: true,
62
65
  }]
63
66
  }], ctorParameters: () => [] });
64
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGltZW5zaW9uLmRpcmVjdGl2ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3NjaW9uL2NvbXBvbmVudHMvZGltZW5zaW9uL3NyYy9kaW1lbnNpb24uZGlyZWN0aXZlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7OztHQVFHO0FBRUgsT0FBTyxFQUFDLFNBQVMsRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBQ25GLE9BQU8sRUFBQyxXQUFXLEVBQUMsTUFBTSwyQkFBMkIsQ0FBQztBQUN0RCxPQUFPLEVBQUMsa0JBQWtCLEVBQUMsTUFBTSw0QkFBNEIsQ0FBQztBQUM5RCxPQUFPLEVBQUMsYUFBYSxFQUFFLGVBQWUsRUFBQyxNQUFNLDBCQUEwQixDQUFDO0FBQ3hFLE9BQU8sRUFBQyx1QkFBdUIsRUFBRSxTQUFTLEVBQUUsV0FBVyxFQUFDLE1BQU0sTUFBTSxDQUFDOztBQUVyRTs7Ozs7Ozs7Ozs7R0FXRztBQUtILE1BQU0sT0FBTyxxQkFBcUI7SUFZaEM7UUFWQTs7V0FFRztRQUNJLHVCQUFrQixHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUV6Qzs7V0FFRztRQUNJLG9CQUFlLEdBQUcsTUFBTSxDQUFlLEVBQUMsS0FBSyxFQUFFLG9CQUFvQixFQUFDLENBQUMsQ0FBQztRQUczRSxNQUFNLElBQUksR0FBRyxNQUFNLENBQUMsQ0FBQSxVQUF1QixDQUFBLENBQUMsQ0FBQyxhQUFhLENBQUM7UUFDM0QsTUFBTSxJQUFJLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBRTVCLFdBQVcsQ0FBQyxJQUFJLENBQUM7YUFDZCxJQUFJLENBQ0gsZUFBZSxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLFVBQVUsQ0FBQyxDQUFDLEVBQ2pFLGFBQWEsQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDLENBQUMsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsQ0FBQyxFQUM1RixXQUFXLENBQUMsdUJBQXVCLENBQUMsRUFBRSw4RkFBOEY7UUFDcEksU0FBUyxDQUFDLHVCQUF1QixDQUFDLEVBQUUsOEZBQThGO1FBQ2xJLGtCQUFrQixFQUFFLENBQ3JCO2FBQ0EsU0FBUyxDQUFDLEdBQUcsRUFBRTtZQUNkLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDO2dCQUN4QixXQUFXLEVBQUUsSUFBSSxDQUFDLFdBQVc7Z0JBQzdCLFdBQVcsRUFBRSxJQUFJLENBQUMsV0FBVztnQkFDN0IsWUFBWSxFQUFFLElBQUksQ0FBQyxZQUFZO2dCQUMvQixZQUFZLEVBQUUsSUFBSSxDQUFDLFlBQVk7Z0JBQy9CLE9BQU8sRUFBRSxJQUFJO2FBQ2QsQ0FBQyxDQUFDO1FBQ0wsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDOzhHQWpDVSxxQkFBcUI7a0dBQXJCLHFCQUFxQjs7MkZBQXJCLHFCQUFxQjtrQkFKakMsU0FBUzttQkFBQztvQkFDVCxRQUFRLEVBQUUsZ0JBQWdCO29CQUMxQixVQUFVLEVBQUUsSUFBSTtpQkFDakIiLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuICogQ29weXJpZ2h0IChjKSAyMDE4LTIwMjQgU3dpc3MgRmVkZXJhbCBSYWlsd2F5c1xuICpcbiAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGVcbiAqIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgMi4wXG4gKiB3aGljaCBpcyBhdmFpbGFibGUgYXQgaHR0cHM6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC9cbiAqXG4gKiAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjBcbiAqL1xuXG5pbXBvcnQge0RpcmVjdGl2ZSwgRWxlbWVudFJlZiwgaW5qZWN0LCBpbnB1dCwgTmdab25lLCBvdXRwdXR9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtmcm9tUmVzaXplJH0gZnJvbSAnQHNjaW9uL3Rvb2xraXQvb2JzZXJ2YWJsZSc7XG5pbXBvcnQge3Rha2VVbnRpbERlc3Ryb3llZH0gZnJvbSAnQGFuZ3VsYXIvY29yZS9yeGpzLWludGVyb3AnO1xuaW1wb3J0IHtvYnNlcnZlSW5zaWRlLCBzdWJzY3JpYmVJbnNpZGV9IGZyb20gJ0BzY2lvbi90b29sa2l0L29wZXJhdG9ycyc7XG5pbXBvcnQge2FuaW1hdGlvbkZyYW1lU2NoZWR1bGVyLCBvYnNlcnZlT24sIHN1YnNjcmliZU9ufSBmcm9tICdyeGpzJztcblxuLyoqXG4gKiBPYnNlcnZlcyBjaGFuZ2VzIHRvIHRoZSBzaXplIG9mIHRoZSBob3N0IGVsZW1lbnQuXG4gKlxuICogVXBvbiBzdWJzY3JpcHRpb24sIGVtaXRzIHRoZSBjdXJyZW50IHNpemUsIGFuZCB0aGVuIGNvbnRpbnVvdXNseSB3aGVuIHRoZSBzaXplIGNoYW5nZXMuIFRoZSBPYnNlcnZhYmxlIG5ldmVyIGNvbXBsZXRlcy5cbiAqXG4gKiAtLS1cbiAqIFVzYWdlOlxuICpcbiAqIGBgYGh0bWxcbiAqIDxkaXYgc2NpRGltZW5zaW9uIChzY2lEaW1lbnNpb25DaGFuZ2UpPVwib25EaW1lbnNpb25DaGFuZ2UoJGV2ZW50KVwiPjwvZGl2PlxuICogYGBgXG4gKi9cbkBEaXJlY3RpdmUoe1xuICBzZWxlY3RvcjogJ1tzY2lEaW1lbnNpb25dJyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbn0pXG5leHBvcnQgY2xhc3MgU2NpRGltZW5zaW9uRGlyZWN0aXZlIHtcblxuICAvKipcbiAgICogQ29udHJvbHMgaWYgdG8gZW1pdCBvdXRzaWRlIHRoZSBBbmd1bGFyIHpvbmUuIERlZmF1bHRzIHRvIGBmYWxzZWAuXG4gICAqL1xuICBwdWJsaWMgZW1pdE91dHNpZGVBbmd1bGFyID0gaW5wdXQoZmFsc2UpO1xuXG4gIC8qKlxuICAgKiBVcG9uIHN1YnNjcmlwdGlvbiwgZW1pdHMgdGhlIGN1cnJlbnQgc2l6ZSwgYW5kIHRoZW4gY29udGludW91c2x5IHdoZW4gdGhlIHNpemUgY2hhbmdlcy4gVGhlIE9ic2VydmFibGUgbmV2ZXIgY29tcGxldGVzLlxuICAgKi9cbiAgcHVibGljIGRpbWVuc2lvbkNoYW5nZSA9IG91dHB1dDxTY2lEaW1lbnNpb24+KHthbGlhczogJ3NjaURpbWVuc2lvbkNoYW5nZSd9KTtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBjb25zdCBob3N0ID0gaW5qZWN0KEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+KS5uYXRpdmVFbGVtZW50O1xuICAgIGNvbnN0IHpvbmUgPSBpbmplY3QoTmdab25lKTtcblxuICAgIGZyb21SZXNpemUkKGhvc3QpXG4gICAgICAucGlwZShcbiAgICAgICAgc3Vic2NyaWJlSW5zaWRlKGNvbnRpbnVlRm4gPT4gem9uZS5ydW5PdXRzaWRlQW5ndWxhcihjb250aW51ZUZuKSksXG4gICAgICAgIG9ic2VydmVJbnNpZGUoY29udGludWVGbiA9PiB0aGlzLmVtaXRPdXRzaWRlQW5ndWxhcigpID8gY29udGludWVGbigpIDogem9uZS5ydW4oY29udGludWVGbikpLFxuICAgICAgICBzdWJzY3JpYmVPbihhbmltYXRpb25GcmFtZVNjaGVkdWxlciksIC8vIHRvIG5vdCBibG9jayByZXNpemUgY2FsbGJhY2sgKFJlc2l6ZU9ic2VydmVyIGxvb3AgY29tcGxldGVkIHdpdGggdW5kZWxpdmVyZWQgbm90aWZpY2F0aW9ucylcbiAgICAgICAgb2JzZXJ2ZU9uKGFuaW1hdGlvbkZyYW1lU2NoZWR1bGVyKSwgLy8gdG8gbm90IGJsb2NrIHJlc2l6ZSBjYWxsYmFjayAoUmVzaXplT2JzZXJ2ZXIgbG9vcCBjb21wbGV0ZWQgd2l0aCB1bmRlbGl2ZXJlZCBub3RpZmljYXRpb25zKVxuICAgICAgICB0YWtlVW50aWxEZXN0cm95ZWQoKSxcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICB0aGlzLmRpbWVuc2lvbkNoYW5nZS5lbWl0KHtcbiAgICAgICAgICBjbGllbnRXaWR0aDogaG9zdC5jbGllbnRXaWR0aCxcbiAgICAgICAgICBvZmZzZXRXaWR0aDogaG9zdC5vZmZzZXRXaWR0aCxcbiAgICAgICAgICBjbGllbnRIZWlnaHQ6IGhvc3QuY2xpZW50SGVpZ2h0LFxuICAgICAgICAgIG9mZnNldEhlaWdodDogaG9zdC5vZmZzZXRIZWlnaHQsXG4gICAgICAgICAgZWxlbWVudDogaG9zdCxcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgfVxufVxuXG4vKipcbiAqIFJlcHJlc2VudHMgdGhlIGRpbWVuc2lvbiBvZiBhbiBlbGVtZW50LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNjaURpbWVuc2lvbiB7XG4gIG9mZnNldFdpZHRoOiBudW1iZXI7XG4gIG9mZnNldEhlaWdodDogbnVtYmVyO1xuICBjbGllbnRXaWR0aDogbnVtYmVyO1xuICBjbGllbnRIZWlnaHQ6IG51bWJlcjtcbiAgZWxlbWVudDogSFRNTEVsZW1lbnQ7XG59XG4iXX0=
67
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGltZW5zaW9uLmRpcmVjdGl2ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3NjaW9uL2NvbXBvbmVudHMvZGltZW5zaW9uL3NyYy9kaW1lbnNpb24uZGlyZWN0aXZlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7OztHQVFHO0FBRUgsT0FBTyxFQUFDLFNBQVMsRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBQ25GLE9BQU8sRUFBQyxXQUFXLEVBQUMsTUFBTSwyQkFBMkIsQ0FBQztBQUN0RCxPQUFPLEVBQUMsa0JBQWtCLEVBQUMsTUFBTSw0QkFBNEIsQ0FBQztBQUM5RCxPQUFPLEVBQUMsU0FBUyxFQUFFLFdBQVcsRUFBQyxNQUFNLDBCQUEwQixDQUFDOztBQUdoRTs7Ozs7Ozs7O0dBU0c7QUFLSCxNQUFNLE9BQU8scUJBQXFCO0lBWWhDO1FBVkE7O1dBRUc7UUFDSSx1QkFBa0IsR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7UUFFekM7O1dBRUc7UUFDSSxvQkFBZSxHQUFHLE1BQU0sQ0FBZSxFQUFDLEtBQUssRUFBRSxvQkFBb0IsRUFBQyxDQUFDLENBQUM7UUFHM0UsTUFBTSxJQUFJLEdBQUcsTUFBTSxDQUFDLENBQUEsVUFBdUIsQ0FBQSxDQUFDLENBQUMsYUFBYSxDQUFDO1FBQzNELE1BQU0sSUFBSSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUU1QixXQUFXLENBQUMsSUFBSSxDQUFDO2FBQ2QsSUFBSTtRQUNILDJDQUEyQztRQUMzQyxXQUFXLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDN0MsMEdBQTBHO1FBQzFHLCtKQUErSjtRQUMvSix3SEFBd0g7UUFDeEgsU0FBUyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMscUJBQXFCLENBQUMsRUFBRSxDQUFDLENBQUMsRUFDMUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQ2hFLGtCQUFrQixFQUFFLENBQ3JCO2FBQ0EsU0FBUyxDQUFDLEdBQUcsRUFBRTtZQUNkLHVCQUF1QjtZQUN2QixJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLHNCQUFzQixFQUFFLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO1lBRTNGLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDO2dCQUN4QixXQUFXLEVBQUUsSUFBSSxDQUFDLFdBQVc7Z0JBQzdCLFdBQVcsRUFBRSxJQUFJLENBQUMsV0FBVztnQkFDN0IsWUFBWSxFQUFFLElBQUksQ0FBQyxZQUFZO2dCQUMvQixZQUFZLEVBQUUsSUFBSSxDQUFDLFlBQVk7Z0JBQy9CLE9BQU8sRUFBRSxJQUFJO2FBQ2QsQ0FBQyxDQUFDO1FBQ0wsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDOzhHQXZDVSxxQkFBcUI7a0dBQXJCLHFCQUFxQjs7MkZBQXJCLHFCQUFxQjtrQkFKakMsU0FBUzttQkFBQztvQkFDVCxRQUFRLEVBQUUsZ0JBQWdCO29CQUMxQixVQUFVLEVBQUUsSUFBSTtpQkFDakIiLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuICogQ29weXJpZ2h0IChjKSAyMDE4LTIwMjQgU3dpc3MgRmVkZXJhbCBSYWlsd2F5c1xuICpcbiAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGVcbiAqIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgMi4wXG4gKiB3aGljaCBpcyBhdmFpbGFibGUgYXQgaHR0cHM6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC9cbiAqXG4gKiAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjBcbiAqL1xuXG5pbXBvcnQge0RpcmVjdGl2ZSwgRWxlbWVudFJlZiwgaW5qZWN0LCBpbnB1dCwgTmdab25lLCBvdXRwdXR9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtmcm9tUmVzaXplJH0gZnJvbSAnQHNjaW9uL3Rvb2xraXQvb2JzZXJ2YWJsZSc7XG5pbXBvcnQge3Rha2VVbnRpbERlc3Ryb3llZH0gZnJvbSAnQGFuZ3VsYXIvY29yZS9yeGpzLWludGVyb3AnO1xuaW1wb3J0IHtvYnNlcnZlSW4sIHN1YnNjcmliZUlufSBmcm9tICdAc2Npb24vdG9vbGtpdC9vcGVyYXRvcnMnO1xuaW1wb3J0IHtTY2lEaW1lbnNpb259IGZyb20gJy4vZGltZW5zaW9uJztcblxuLyoqXG4gKiBPYnNlcnZlcyB0aGUgc2l6ZSBvZiB0aGUgaG9zdCBlbGVtZW50LlxuICpcbiAqIC0tLVxuICogVXNhZ2U6XG4gKlxuICogYGBgaHRtbFxuICogPGRpdiBzY2lEaW1lbnNpb24gKHNjaURpbWVuc2lvbkNoYW5nZSk9XCJvbkRpbWVuc2lvbkNoYW5nZSgkZXZlbnQpXCI+PC9kaXY+XG4gKiBgYGBcbiAqL1xuQERpcmVjdGl2ZSh7XG4gIHNlbGVjdG9yOiAnW3NjaURpbWVuc2lvbl0nLFxuICBzdGFuZGFsb25lOiB0cnVlLFxufSlcbmV4cG9ydCBjbGFzcyBTY2lEaW1lbnNpb25EaXJlY3RpdmUge1xuXG4gIC8qKlxuICAgKiBDb250cm9scyBpZiB0byBvdXRwdXQgb3V0c2lkZSB0aGUgQW5ndWxhciB6b25lLiBEZWZhdWx0cyB0byBgZmFsc2VgLlxuICAgKi9cbiAgcHVibGljIGVtaXRPdXRzaWRlQW5ndWxhciA9IGlucHV0KGZhbHNlKTtcblxuICAvKipcbiAgICogT3V0cHV0cyB0aGUgc2l6ZSBvZiB0aGUgZWxlbWVudC5cbiAgICovXG4gIHB1YmxpYyBkaW1lbnNpb25DaGFuZ2UgPSBvdXRwdXQ8U2NpRGltZW5zaW9uPih7YWxpYXM6ICdzY2lEaW1lbnNpb25DaGFuZ2UnfSk7XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgY29uc3QgaG9zdCA9IGluamVjdChFbGVtZW50UmVmPEhUTUxFbGVtZW50PikubmF0aXZlRWxlbWVudDtcbiAgICBjb25zdCB6b25lID0gaW5qZWN0KE5nWm9uZSk7XG5cbiAgICBmcm9tUmVzaXplJChob3N0KVxuICAgICAgLnBpcGUoXG4gICAgICAgIC8vIEF2b2lkIHRyaWdnZXJpbmcgY2hhbmdlIGRldGVjdGlvbiBjeWNsZS5cbiAgICAgICAgc3Vic2NyaWJlSW4oZm4gPT4gem9uZS5ydW5PdXRzaWRlQW5ndWxhcihmbikpLFxuICAgICAgICAvLyBSdW4gaW4gYW5pbWF0aW9uIGZyYW1lIHRvIHByZXZlbnQgJ1Jlc2l6ZU9ic2VydmVyIGxvb3AgY29tcGxldGVkIHdpdGggdW5kZWxpdmVyZWQgbm90aWZpY2F0aW9ucycgZXJyb3IuXG4gICAgICAgIC8vIERvIG5vdCB1c2UgYGFuaW1hdGlvbkZyYW1lU2NoZWR1bGVyYCBiZWNhdXNlIHRoZSBzY2hlZHVsZXIgZG9lcyBub3QgbmVjZXNzYXJpbHkgZXhlY3V0ZSBpbiB0aGUgY3VycmVudCBleGVjdXRpb24gY29udGV4dCwgc3VjaCBhcyBpbnNpZGUgb3Igb3V0c2lkZSBBbmd1bGFyLlxuICAgICAgICAvLyBUaGUgc2NoZWR1bGVyIGFsd2F5cyBleGVjdXRlcyB0YXNrcyBpbiB0aGUgY29udGV4dCAoZS5nLiB6b25lKSB3aGVyZSB0aGUgc2NoZWR1bGVyIHdhcyBmaXJzdCB1c2VkIGluIHRoZSBhcHBsaWNhdGlvbi5cbiAgICAgICAgb2JzZXJ2ZUluKGZuID0+IHJlcXVlc3RBbmltYXRpb25GcmFtZShmbikpLFxuICAgICAgICBvYnNlcnZlSW4oZm4gPT4gdGhpcy5lbWl0T3V0c2lkZUFuZ3VsYXIoKSA/IGZuKCkgOiB6b25lLnJ1bihmbikpLFxuICAgICAgICB0YWtlVW50aWxEZXN0cm95ZWQoKSxcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAvLyBBc3NlcnQgQW5ndWxhciB6b25lLlxuICAgICAgICB0aGlzLmVtaXRPdXRzaWRlQW5ndWxhcigpID8gTmdab25lLmFzc2VydE5vdEluQW5ndWxhclpvbmUoKSA6IE5nWm9uZS5hc3NlcnRJbkFuZ3VsYXJab25lKCk7XG5cbiAgICAgICAgdGhpcy5kaW1lbnNpb25DaGFuZ2UuZW1pdCh7XG4gICAgICAgICAgY2xpZW50V2lkdGg6IGhvc3QuY2xpZW50V2lkdGgsXG4gICAgICAgICAgb2Zmc2V0V2lkdGg6IGhvc3Qub2Zmc2V0V2lkdGgsXG4gICAgICAgICAgY2xpZW50SGVpZ2h0OiBob3N0LmNsaWVudEhlaWdodCxcbiAgICAgICAgICBvZmZzZXRIZWlnaHQ6IGhvc3Qub2Zmc2V0SGVpZ2h0LFxuICAgICAgICAgIGVsZW1lbnQ6IGhvc3QsXG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gIH1cbn1cbiJdfQ==
@@ -0,0 +1,11 @@
1
+ /*
2
+ * Copyright (c) 2018-2024 Swiss Federal Railways
3
+ *
4
+ * This program and the accompanying materials are made
5
+ * available under the terms of the Eclipse Public License 2.0
6
+ * which is available at https://www.eclipse.org/legal/epl-2.0/
7
+ *
8
+ * SPDX-License-Identifier: EPL-2.0
9
+ */
10
+ export {};
11
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGltZW5zaW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc2Npb24vY29tcG9uZW50cy9kaW1lbnNpb24vc3JjL2RpbWVuc2lvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7R0FRRyIsInNvdXJjZXNDb250ZW50IjpbIi8qXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTgtMjAyNCBTd2lzcyBGZWRlcmFsIFJhaWx3YXlzXG4gKlxuICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZVxuICogYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSAyLjBcbiAqIHdoaWNoIGlzIGF2YWlsYWJsZSBhdCBodHRwczovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wL1xuICpcbiAqICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMFxuICovXG5cbi8qKlxuICogUmVwcmVzZW50cyB0aGUgZGltZW5zaW9uIG9mIGFuIGVsZW1lbnQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2NpRGltZW5zaW9uIHtcbiAgb2Zmc2V0V2lkdGg6IG51bWJlcjtcbiAgb2Zmc2V0SGVpZ2h0OiBudW1iZXI7XG4gIGNsaWVudFdpZHRoOiBudW1iZXI7XG4gIGNsaWVudEhlaWdodDogbnVtYmVyO1xuICBlbGVtZW50OiBIVE1MRWxlbWVudDtcbn1cbiJdfQ==
@@ -0,0 +1,63 @@
1
+ /*
2
+ * Copyright (c) 2018-2024 Swiss Federal Railways
3
+ *
4
+ * This program and the accompanying materials are made
5
+ * available under the terms of the Eclipse Public License 2.0
6
+ * which is available at https://www.eclipse.org/legal/epl-2.0/
7
+ *
8
+ * SPDX-License-Identifier: EPL-2.0
9
+ */
10
+ import { assertInInjectionContext, assertNotInReactiveContext, computed, effect, inject, Injector, isSignal, NgZone, signal, untracked } from '@angular/core';
11
+ import { coerceElement } from '@angular/cdk/coercion';
12
+ import { Objects } from '@scion/toolkit/util';
13
+ import { fromResize$ } from '@scion/toolkit/observable';
14
+ import { observeIn, subscribeIn } from '@scion/toolkit/operators';
15
+ export function dimension(elementLike, options) {
16
+ assertNotInReactiveContext(dimension, 'Invoking `dimension` causes new subscriptions every time. Move `dimension` outside of the reactive context and read the signal value where needed.');
17
+ if (!options?.injector) {
18
+ assertInInjectionContext(dimension);
19
+ }
20
+ const injector = options?.injector ?? inject(Injector);
21
+ const zone = injector.get(NgZone);
22
+ const element = computed(() => coerceElement(isSignal(elementLike) ? elementLike() : elementLike));
23
+ const onResize = signal(undefined, { equal: () => false });
24
+ // Subscribe to element size changes.
25
+ effect(onCleanup => {
26
+ const el = element();
27
+ if (!el) {
28
+ return;
29
+ }
30
+ untracked(() => {
31
+ const subscription = fromResize$(el)
32
+ .pipe(
33
+ // Avoid triggering change detection cycle.
34
+ subscribeIn(fn => zone.runOutsideAngular(fn)),
35
+ // Run in animation frame to prevent 'ResizeObserver loop completed with undelivered notifications' error.
36
+ // Do not use `animationFrameScheduler` because the scheduler does not necessarily execute in the current execution context, such as inside or outside Angular.
37
+ // The scheduler always executes tasks in the context (e.g. zone) where the scheduler was first used in the application.
38
+ observeIn(fn => requestAnimationFrame(fn)))
39
+ .subscribe(() => {
40
+ NgZone.assertNotInAngularZone();
41
+ onResize.set();
42
+ });
43
+ onCleanup(() => subscription.unsubscribe());
44
+ });
45
+ }, { injector });
46
+ // Create signal that recomputes each time the size changes.
47
+ return computed(() => {
48
+ const el = element();
49
+ if (!el) {
50
+ return undefined;
51
+ }
52
+ // Track element size.
53
+ onResize();
54
+ return {
55
+ clientWidth: el.clientWidth,
56
+ offsetWidth: el.offsetWidth,
57
+ clientHeight: el.clientHeight,
58
+ offsetHeight: el.offsetHeight,
59
+ element: el,
60
+ };
61
+ }, { equal: Objects.isEqual });
62
+ }
63
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGltZW5zaW9uLnNpZ25hbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3NjaW9uL2NvbXBvbmVudHMvZGltZW5zaW9uL3NyYy9kaW1lbnNpb24uc2lnbmFsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7OztHQVFHO0FBRUgsT0FBTyxFQUFDLHdCQUF3QixFQUFFLDBCQUEwQixFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQWMsTUFBTSxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBVSxTQUFTLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFFaEwsT0FBTyxFQUFDLGFBQWEsRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBQ3BELE9BQU8sRUFBQyxPQUFPLEVBQUMsTUFBTSxxQkFBcUIsQ0FBQztBQUM1QyxPQUFPLEVBQUMsV0FBVyxFQUFDLE1BQU0sMkJBQTJCLENBQUM7QUFDdEQsT0FBTyxFQUFDLFNBQVMsRUFBRSxXQUFXLEVBQUMsTUFBTSwwQkFBMEIsQ0FBQztBQWVoRSxNQUFNLFVBQVUsU0FBUyxDQUFDLFdBQThHLEVBQUUsT0FBK0I7SUFDdkssMEJBQTBCLENBQUMsU0FBUyxFQUFFLG9KQUFvSixDQUFDLENBQUM7SUFDNUwsSUFBSSxDQUFDLE9BQU8sRUFBRSxRQUFRLEVBQUUsQ0FBQztRQUN2Qix3QkFBd0IsQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUN0QyxDQUFDO0lBRUQsTUFBTSxRQUFRLEdBQUcsT0FBTyxFQUFFLFFBQVEsSUFBSSxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDdkQsTUFBTSxJQUFJLEdBQUcsUUFBUSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUNsQyxNQUFNLE9BQU8sR0FBRyxRQUFRLENBQUMsR0FBRyxFQUFFLENBQUMsYUFBYSxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUM7SUFDbkcsTUFBTSxRQUFRLEdBQUcsTUFBTSxDQUFPLFNBQVMsRUFBRSxFQUFDLEtBQUssRUFBRSxHQUFHLEVBQUUsQ0FBQyxLQUFLLEVBQUMsQ0FBQyxDQUFDO0lBRS9ELHFDQUFxQztJQUNyQyxNQUFNLENBQUMsU0FBUyxDQUFDLEVBQUU7UUFDakIsTUFBTSxFQUFFLEdBQUcsT0FBTyxFQUFFLENBQUM7UUFDckIsSUFBSSxDQUFDLEVBQUUsRUFBRSxDQUFDO1lBQ1IsT0FBTztRQUNULENBQUM7UUFFRCxTQUFTLENBQUMsR0FBRyxFQUFFO1lBQ2IsTUFBTSxZQUFZLEdBQUcsV0FBVyxDQUFDLEVBQUUsQ0FBQztpQkFDakMsSUFBSTtZQUNILDJDQUEyQztZQUMzQyxXQUFXLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDN0MsMEdBQTBHO1lBQzFHLCtKQUErSjtZQUMvSix3SEFBd0g7WUFDeEgsU0FBUyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMscUJBQXFCLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FDM0M7aUJBQ0EsU0FBUyxDQUFDLEdBQUcsRUFBRTtnQkFDZCxNQUFNLENBQUMsc0JBQXNCLEVBQUUsQ0FBQztnQkFDaEMsUUFBUSxDQUFDLEdBQUcsRUFBRSxDQUFDO1lBQ2pCLENBQUMsQ0FBQyxDQUFDO1lBQ0wsU0FBUyxDQUFDLEdBQUcsRUFBRSxDQUFDLFlBQVksQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDO1FBQzlDLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxFQUFFLEVBQUMsUUFBUSxFQUFDLENBQUMsQ0FBQztJQUVmLDREQUE0RDtJQUM1RCxPQUFPLFFBQVEsQ0FBQyxHQUFHLEVBQUU7UUFDbkIsTUFBTSxFQUFFLEdBQUcsT0FBTyxFQUFFLENBQUM7UUFDckIsSUFBSSxDQUFDLEVBQUUsRUFBRSxDQUFDO1lBQ1IsT0FBTyxTQUFTLENBQUM7UUFDbkIsQ0FBQztRQUVELHNCQUFzQjtRQUN0QixRQUFRLEVBQUUsQ0FBQztRQUVYLE9BQU87WUFDTCxXQUFXLEVBQUUsRUFBRSxDQUFDLFdBQVc7WUFDM0IsV0FBVyxFQUFFLEVBQUUsQ0FBQyxXQUFXO1lBQzNCLFlBQVksRUFBRSxFQUFFLENBQUMsWUFBWTtZQUM3QixZQUFZLEVBQUUsRUFBRSxDQUFDLFlBQVk7WUFDN0IsT0FBTyxFQUFFLEVBQUU7U0FDWixDQUFDO0lBQ0osQ0FBQyxFQUFFLEVBQUMsS0FBSyxFQUFFLE9BQU8sQ0FBQyxPQUFPLEVBQUMsQ0FBQyxDQUFDO0FBQy9CLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuICogQ29weXJpZ2h0IChjKSAyMDE4LTIwMjQgU3dpc3MgRmVkZXJhbCBSYWlsd2F5c1xuICpcbiAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGVcbiAqIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgMi4wXG4gKiB3aGljaCBpcyBhdmFpbGFibGUgYXQgaHR0cHM6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC9cbiAqXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMFxuICovXG5cbmltcG9ydCB7YXNzZXJ0SW5JbmplY3Rpb25Db250ZXh0LCBhc3NlcnROb3RJblJlYWN0aXZlQ29udGV4dCwgY29tcHV0ZWQsIGVmZmVjdCwgRWxlbWVudFJlZiwgaW5qZWN0LCBJbmplY3RvciwgaXNTaWduYWwsIE5nWm9uZSwgc2lnbmFsLCBTaWduYWwsIHVudHJhY2tlZH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1NjaURpbWVuc2lvbn0gZnJvbSAnLi9kaW1lbnNpb24nO1xuaW1wb3J0IHtjb2VyY2VFbGVtZW50fSBmcm9tICdAYW5ndWxhci9jZGsvY29lcmNpb24nO1xuaW1wb3J0IHtPYmplY3RzfSBmcm9tICdAc2Npb24vdG9vbGtpdC91dGlsJztcbmltcG9ydCB7ZnJvbVJlc2l6ZSR9IGZyb20gJ0BzY2lvbi90b29sa2l0L29ic2VydmFibGUnO1xuaW1wb3J0IHtvYnNlcnZlSW4sIHN1YnNjcmliZUlufSBmcm9tICdAc2Npb24vdG9vbGtpdC9vcGVyYXRvcnMnO1xuXG4vKipcbiAqIENyZWF0ZXMgYSBzaWduYWwgb2JzZXJ2aW5nIHRoZSBzaXplIG9mIGFuIGVsZW1lbnQuXG4gKlxuICogVGhlIGVsZW1lbnQgY2FuIGJlIHBhc3NlZCBhcyBhIHNpZ25hbCwgZW5hYmxpbmcgb2JzZXJ2YXRpb24gb2YgdmlldyBjaGlsZHJlbiBpbiB0aGUgY29tcG9uZW50IGNvbnN0cnVjdG9yLlxuICpcbiAqIFRoZSBzaWduYWwgc3Vic2NyaWJlcyB0byB0aGUgbmF0aXZlIHtAbGluayBSZXNpemVPYnNlcnZlcn0gdG8gbW9uaXRvciBlbGVtZW50IHNpemUgY2hhbmdlcy4gRGVzdHJveWluZyB0aGUgaW5qZWN0aW9uIGNvbnRleHQgd2lsbCB1bnN1YnNjcmliZSB0aGUgb2JzZXJ2ZXIuXG4gKlxuICogVXNhZ2U6XG4gKiAtIE11c3QgYmUgY2FsbGVkIHdpdGhpbiBhbiBpbmplY3Rpb24gY29udGV4dCBvciBhbiBpbmplY3RvciBwcm92aWRlZC4gRGVzdHJveWluZyB0aGUgaW5qZWN0b3Igd2lsbCB1bnN1YnNjcmliZSB0aGUgc2lnbmFsLlxuICogLSBNdXN0IG5vdCBiZSBjYWxsZWQgd2l0aGluIGEgcmVhY3RpdmUgY29udGV4dCB0byBhdm9pZCByZXBlYXRlZCBzdWJzY3JpcHRpb25zLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZGltZW5zaW9uKGVsZW1lbnRMaWtlOiBIVE1MRWxlbWVudCB8IEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+IHwgU2lnbmFsPEhUTUxFbGVtZW50IHwgRWxlbWVudFJlZjxIVE1MRWxlbWVudD4+LCBvcHRpb25zPzoge2luamVjdG9yPzogSW5qZWN0b3J9KTogU2lnbmFsPFNjaURpbWVuc2lvbj47XG5leHBvcnQgZnVuY3Rpb24gZGltZW5zaW9uKGVsZW1lbnRMaWtlOiBIVE1MRWxlbWVudCB8IEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+IHwgU2lnbmFsPEhUTUxFbGVtZW50IHwgRWxlbWVudFJlZjxIVE1MRWxlbWVudD4gfCB1bmRlZmluZWQ+LCBvcHRpb25zPzoge2luamVjdG9yPzogSW5qZWN0b3J9KTogU2lnbmFsPFNjaURpbWVuc2lvbiB8IHVuZGVmaW5lZD47XG5leHBvcnQgZnVuY3Rpb24gZGltZW5zaW9uKGVsZW1lbnRMaWtlOiBIVE1MRWxlbWVudCB8IEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+IHwgU2lnbmFsPEhUTUxFbGVtZW50IHwgRWxlbWVudFJlZjxIVE1MRWxlbWVudD4gfCB1bmRlZmluZWQ+LCBvcHRpb25zPzoge2luamVjdG9yPzogSW5qZWN0b3J9KTogU2lnbmFsPFNjaURpbWVuc2lvbiB8IHVuZGVmaW5lZD4ge1xuICBhc3NlcnROb3RJblJlYWN0aXZlQ29udGV4dChkaW1lbnNpb24sICdJbnZva2luZyBgZGltZW5zaW9uYCBjYXVzZXMgbmV3IHN1YnNjcmlwdGlvbnMgZXZlcnkgdGltZS4gTW92ZSBgZGltZW5zaW9uYCBvdXRzaWRlIG9mIHRoZSByZWFjdGl2ZSBjb250ZXh0IGFuZCByZWFkIHRoZSBzaWduYWwgdmFsdWUgd2hlcmUgbmVlZGVkLicpO1xuICBpZiAoIW9wdGlvbnM/LmluamVjdG9yKSB7XG4gICAgYXNzZXJ0SW5JbmplY3Rpb25Db250ZXh0KGRpbWVuc2lvbik7XG4gIH1cblxuICBjb25zdCBpbmplY3RvciA9IG9wdGlvbnM/LmluamVjdG9yID8/IGluamVjdChJbmplY3Rvcik7XG4gIGNvbnN0IHpvbmUgPSBpbmplY3Rvci5nZXQoTmdab25lKTtcbiAgY29uc3QgZWxlbWVudCA9IGNvbXB1dGVkKCgpID0+IGNvZXJjZUVsZW1lbnQoaXNTaWduYWwoZWxlbWVudExpa2UpID8gZWxlbWVudExpa2UoKSA6IGVsZW1lbnRMaWtlKSk7XG4gIGNvbnN0IG9uUmVzaXplID0gc2lnbmFsPHZvaWQ+KHVuZGVmaW5lZCwge2VxdWFsOiAoKSA9PiBmYWxzZX0pO1xuXG4gIC8vIFN1YnNjcmliZSB0byBlbGVtZW50IHNpemUgY2hhbmdlcy5cbiAgZWZmZWN0KG9uQ2xlYW51cCA9PiB7XG4gICAgY29uc3QgZWwgPSBlbGVtZW50KCk7XG4gICAgaWYgKCFlbCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHVudHJhY2tlZCgoKSA9PiB7XG4gICAgICBjb25zdCBzdWJzY3JpcHRpb24gPSBmcm9tUmVzaXplJChlbClcbiAgICAgICAgLnBpcGUoXG4gICAgICAgICAgLy8gQXZvaWQgdHJpZ2dlcmluZyBjaGFuZ2UgZGV0ZWN0aW9uIGN5Y2xlLlxuICAgICAgICAgIHN1YnNjcmliZUluKGZuID0+IHpvbmUucnVuT3V0c2lkZUFuZ3VsYXIoZm4pKSxcbiAgICAgICAgICAvLyBSdW4gaW4gYW5pbWF0aW9uIGZyYW1lIHRvIHByZXZlbnQgJ1Jlc2l6ZU9ic2VydmVyIGxvb3AgY29tcGxldGVkIHdpdGggdW5kZWxpdmVyZWQgbm90aWZpY2F0aW9ucycgZXJyb3IuXG4gICAgICAgICAgLy8gRG8gbm90IHVzZSBgYW5pbWF0aW9uRnJhbWVTY2hlZHVsZXJgIGJlY2F1c2UgdGhlIHNjaGVkdWxlciBkb2VzIG5vdCBuZWNlc3NhcmlseSBleGVjdXRlIGluIHRoZSBjdXJyZW50IGV4ZWN1dGlvbiBjb250ZXh0LCBzdWNoIGFzIGluc2lkZSBvciBvdXRzaWRlIEFuZ3VsYXIuXG4gICAgICAgICAgLy8gVGhlIHNjaGVkdWxlciBhbHdheXMgZXhlY3V0ZXMgdGFza3MgaW4gdGhlIGNvbnRleHQgKGUuZy4gem9uZSkgd2hlcmUgdGhlIHNjaGVkdWxlciB3YXMgZmlyc3QgdXNlZCBpbiB0aGUgYXBwbGljYXRpb24uXG4gICAgICAgICAgb2JzZXJ2ZUluKGZuID0+IHJlcXVlc3RBbmltYXRpb25GcmFtZShmbikpLFxuICAgICAgICApXG4gICAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgIE5nWm9uZS5hc3NlcnROb3RJbkFuZ3VsYXJab25lKCk7XG4gICAgICAgICAgb25SZXNpemUuc2V0KCk7XG4gICAgICAgIH0pO1xuICAgICAgb25DbGVhbnVwKCgpID0+IHN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpKTtcbiAgICB9KTtcbiAgfSwge2luamVjdG9yfSk7XG5cbiAgLy8gQ3JlYXRlIHNpZ25hbCB0aGF0IHJlY29tcHV0ZXMgZWFjaCB0aW1lIHRoZSBzaXplIGNoYW5nZXMuXG4gIHJldHVybiBjb21wdXRlZCgoKSA9PiB7XG4gICAgY29uc3QgZWwgPSBlbGVtZW50KCk7XG4gICAgaWYgKCFlbCkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICAvLyBUcmFjayBlbGVtZW50IHNpemUuXG4gICAgb25SZXNpemUoKTtcblxuICAgIHJldHVybiB7XG4gICAgICBjbGllbnRXaWR0aDogZWwuY2xpZW50V2lkdGgsXG4gICAgICBvZmZzZXRXaWR0aDogZWwub2Zmc2V0V2lkdGgsXG4gICAgICBjbGllbnRIZWlnaHQ6IGVsLmNsaWVudEhlaWdodCxcbiAgICAgIG9mZnNldEhlaWdodDogZWwub2Zmc2V0SGVpZ2h0LFxuICAgICAgZWxlbWVudDogZWwsXG4gICAgfTtcbiAgfSwge2VxdWFsOiBPYmplY3RzLmlzRXF1YWx9KTtcbn1cbiJdfQ==
@@ -14,4 +14,6 @@
14
14
  */
15
15
  export { SciDimensionModule } from './dimension.module';
16
16
  export { SciDimensionDirective } from './dimension.directive';
17
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHVibGljX2FwaS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3NjaW9uL2NvbXBvbmVudHMvZGltZW5zaW9uL3NyYy9wdWJsaWNfYXBpLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7OztHQVFHO0FBRUg7Ozs7R0FJRztBQUNILE9BQU8sRUFBQyxrQkFBa0IsRUFBQyxNQUFNLG9CQUFvQixDQUFDO0FBQ3RELE9BQU8sRUFBQyxxQkFBcUIsRUFBZSxNQUFNLHVCQUF1QixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLypcbiAqIENvcHlyaWdodCAoYykgMjAxOC0yMDE5IFN3aXNzIEZlZGVyYWwgUmFpbHdheXNcbiAqXG4gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlXG4gKiBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIDIuMFxuICogd2hpY2ggaXMgYXZhaWxhYmxlIGF0IGh0dHBzOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAvXG4gKlxuICogIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wXG4gKi9cblxuLypcbiAqIFNlY29uZGFyeSBlbnRyeXBvaW50OiAnQHNjaW9uL2NvbXBvbmVudHMvZGltZW5zaW9uJ1xuICpcbiAqIEBzZWUgaHR0cHM6Ly9naXRodWIuY29tL25nLXBhY2thZ3IvbmctcGFja2Fnci9ibG9iL21hc3Rlci9kb2NzL3NlY29uZGFyeS1lbnRyeXBvaW50cy5tZFxuICovXG5leHBvcnQge1NjaURpbWVuc2lvbk1vZHVsZX0gZnJvbSAnLi9kaW1lbnNpb24ubW9kdWxlJztcbmV4cG9ydCB7U2NpRGltZW5zaW9uRGlyZWN0aXZlLCBTY2lEaW1lbnNpb259IGZyb20gJy4vZGltZW5zaW9uLmRpcmVjdGl2ZSc7XG4iXX0=
17
+ export { dimension } from './dimension.signal';
18
+ export { boundingClientRect } from './bounding-client-rect.signal';
19
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHVibGljX2FwaS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3NjaW9uL2NvbXBvbmVudHMvZGltZW5zaW9uL3NyYy9wdWJsaWNfYXBpLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7OztHQVFHO0FBRUg7Ozs7R0FJRztBQUNILE9BQU8sRUFBQyxrQkFBa0IsRUFBQyxNQUFNLG9CQUFvQixDQUFDO0FBQ3RELE9BQU8sRUFBQyxxQkFBcUIsRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBQzVELE9BQU8sRUFBQyxTQUFTLEVBQUMsTUFBTSxvQkFBb0IsQ0FBQztBQUM3QyxPQUFPLEVBQUMsa0JBQWtCLEVBQUMsTUFBTSwrQkFBK0IsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTgtMjAxOSBTd2lzcyBGZWRlcmFsIFJhaWx3YXlzXG4gKlxuICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZVxuICogYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSAyLjBcbiAqIHdoaWNoIGlzIGF2YWlsYWJsZSBhdCBodHRwczovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wL1xuICpcbiAqICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMFxuICovXG5cbi8qXG4gKiBTZWNvbmRhcnkgZW50cnlwb2ludDogJ0BzY2lvbi9jb21wb25lbnRzL2RpbWVuc2lvbidcbiAqXG4gKiBAc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9uZy1wYWNrYWdyL25nLXBhY2thZ3IvYmxvYi9tYXN0ZXIvZG9jcy9zZWNvbmRhcnktZW50cnlwb2ludHMubWRcbiAqL1xuZXhwb3J0IHtTY2lEaW1lbnNpb25Nb2R1bGV9IGZyb20gJy4vZGltZW5zaW9uLm1vZHVsZSc7XG5leHBvcnQge1NjaURpbWVuc2lvbkRpcmVjdGl2ZX0gZnJvbSAnLi9kaW1lbnNpb24uZGlyZWN0aXZlJztcbmV4cG9ydCB7ZGltZW5zaW9ufSBmcm9tICcuL2RpbWVuc2lvbi5zaWduYWwnO1xuZXhwb3J0IHtib3VuZGluZ0NsaWVudFJlY3R9IGZyb20gJy4vYm91bmRpbmctY2xpZW50LXJlY3Quc2lnbmFsJztcbmV4cG9ydCB7U2NpRGltZW5zaW9ufSBmcm9tICcuL2RpbWVuc2lvbic7XG4iXX0=
@@ -1,5 +1,5 @@
1
1
  /*
2
- * Copyright (c) 2018-2019 Swiss Federal Railways
2
+ * Copyright (c) 2018-2024 Swiss Federal Railways
3
3
  *
4
4
  * This program and the accompanying materials are made
5
5
  * available under the terms of the Eclipse Public License 2.0
@@ -7,35 +7,21 @@
7
7
  *
8
8
  * SPDX-License-Identifier: EPL-2.0
9
9
  */
10
- import { Inject, Injectable } from '@angular/core';
10
+ import { inject, Injectable, NgZone } from '@angular/core';
11
11
  import { DOCUMENT } from '@angular/common';
12
- import { BehaviorSubject, fromEvent, Subject } from 'rxjs';
13
- import { debounceTime, distinctUntilChanged, map, startWith, takeUntil } from 'rxjs/operators';
12
+ import { fromEvent } from 'rxjs';
13
+ import { debounceTime, distinctUntilChanged, map, startWith } from 'rxjs/operators';
14
+ import { toSignal } from '@angular/core/rxjs-interop';
15
+ import { subscribeIn } from '@scion/toolkit/operators';
14
16
  import * as i0 from "@angular/core";
15
17
  /**
16
18
  * Provides the native scrollbar tracksize.
17
19
  */
18
20
  export class SciNativeScrollbarTrackSizeProvider {
19
- constructor(_document, _zone) {
20
- this._document = _document;
21
- this._zone = _zone;
22
- this._trackSize$ = new BehaviorSubject(null);
23
- this._destroy$ = new Subject();
24
- this.installNativeScrollbarTrackSizeListener();
25
- }
26
- /**
27
- * Returns an {Observable} which emits the native scrollbar track size, if any, or else `null`.
28
- *
29
- * Upon subscription, it emits the track size immediately, and then continuously emits when the track size changes.
30
- */
31
- get trackSize$() {
32
- return this._trackSize$;
33
- }
34
- /**
35
- * Returns the native scrollbar track size, if any, or else `null`.
36
- */
37
- get trackSize() {
38
- return this._trackSize$.getValue();
21
+ constructor() {
22
+ this._document = inject(DOCUMENT);
23
+ this._zone = inject(NgZone);
24
+ this.trackSize = this.createNativeScrollbarTrackSizeSignal();
39
25
  }
40
26
  /**
41
27
  * Computes the native scrollbar track size.
@@ -43,7 +29,7 @@ export class SciNativeScrollbarTrackSizeProvider {
43
29
  * @returns native track size, or `null` if the native scrollbars sit on top of the content.
44
30
  */
45
31
  computeTrackSize() {
46
- // create temporary viewport and viewport client with native scrollbars to compute scrolltrack width
32
+ // Create temporary viewport and viewport client with native scrollbars to compute the scrolltrack width.
47
33
  const viewportDiv = this._document.createElement('div');
48
34
  setStyle(viewportDiv, {
49
35
  position: 'absolute',
@@ -68,39 +54,29 @@ export class SciNativeScrollbarTrackSizeProvider {
68
54
  hScrollbarTrackHeight: viewportBounds.height - viewportClientBounds.height,
69
55
  vScrollbarTrackWidth: viewportBounds.width - viewportClientBounds.width,
70
56
  };
71
- // destroy temporary viewport
57
+ // Destroy temporary viewport.
72
58
  this._document.body.removeChild(viewportDiv);
73
59
  if (trackSize.hScrollbarTrackHeight === 0 && trackSize.vScrollbarTrackWidth === 0) {
74
60
  return null;
75
61
  }
76
62
  return trackSize;
77
63
  }
78
- installNativeScrollbarTrackSizeListener() {
64
+ createNativeScrollbarTrackSizeSignal() {
79
65
  // We compute the size of the native scrollbar track when the browser fires the onresize window event.
80
66
  // This event is also fired on page zoom or when displaying a hidden document. Hidden documents do not have
81
67
  // a scrollbar track size until being displayed, e.g., after showing hidden iframes.
82
- this._zone.runOutsideAngular(() => {
83
- fromEvent(window, 'resize')
84
- .pipe(debounceTime(5), startWith(null), // trigger the initial computation
85
- map(() => this.computeTrackSize()), distinctUntilChanged((t1, t2) => JSON.stringify(t1) === JSON.stringify(t2)), takeUntil(this._destroy$))
86
- .subscribe(trackSize => {
87
- this._zone.run(() => this._trackSize$.next(trackSize));
88
- });
89
- });
90
- }
91
- ngOnDestroy() {
92
- this._destroy$.next();
68
+ const trackSize$ = fromEvent(window, 'resize')
69
+ .pipe(subscribeIn(fn => this._zone.runOutsideAngular(fn)), debounceTime(5), startWith(null), // trigger the initial computation
70
+ map(() => this.computeTrackSize()), distinctUntilChanged((t1, t2) => t1?.hScrollbarTrackHeight === t2?.hScrollbarTrackHeight && t1?.vScrollbarTrackWidth === t2?.vScrollbarTrackWidth));
71
+ return toSignal(trackSize$, { initialValue: null });
93
72
  }
94
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.1", ngImport: i0, type: SciNativeScrollbarTrackSizeProvider, deps: [{ token: DOCUMENT }, { token: i0.NgZone }], target: i0.ɵɵFactoryTarget.Injectable }); }
73
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.1", ngImport: i0, type: SciNativeScrollbarTrackSizeProvider, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
95
74
  static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.0.1", ngImport: i0, type: SciNativeScrollbarTrackSizeProvider, providedIn: 'root' }); }
96
75
  }
97
76
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.1", ngImport: i0, type: SciNativeScrollbarTrackSizeProvider, decorators: [{
98
77
  type: Injectable,
99
78
  args: [{ providedIn: 'root' }]
100
- }], ctorParameters: () => [{ type: Document, decorators: [{
101
- type: Inject,
102
- args: [DOCUMENT]
103
- }] }, { type: i0.NgZone }] });
79
+ }], ctorParameters: () => [] });
104
80
  /**
105
81
  * Applies the given style(s) to the given element.
106
82
  *
@@ -112,4 +88,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.1", ngImpor
112
88
  function setStyle(element, style) {
113
89
  Object.keys(style).forEach(key => element.style.setProperty(key, style[key]));
114
90
  }
115
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmF0aXZlLXNjcm9sbGJhci10cmFjay1zaXplLXByb3ZpZGVyLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zY2lvbi9jb21wb25lbnRzL3ZpZXdwb3J0L3NyYy9uYXRpdmUtc2Nyb2xsYmFyLXRyYWNrLXNpemUtcHJvdmlkZXIuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7R0FRRztBQUVILE9BQU8sRUFBQyxNQUFNLEVBQUUsVUFBVSxFQUFvQixNQUFNLGVBQWUsQ0FBQztBQUNwRSxPQUFPLEVBQUMsUUFBUSxFQUFDLE1BQU0saUJBQWlCLENBQUM7QUFDekMsT0FBTyxFQUFDLGVBQWUsRUFBRSxTQUFTLEVBQWMsT0FBTyxFQUFDLE1BQU0sTUFBTSxDQUFDO0FBQ3JFLE9BQU8sRUFBQyxZQUFZLEVBQUUsb0JBQW9CLEVBQUUsR0FBRyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQzs7QUFFN0Y7O0dBRUc7QUFFSCxNQUFNLE9BQU8sbUNBQW1DO0lBSzlDLFlBQXNDLFNBQW1CLEVBQVUsS0FBYTtRQUExQyxjQUFTLEdBQVQsU0FBUyxDQUFVO1FBQVUsVUFBSyxHQUFMLEtBQUssQ0FBUTtRQUgvRCxnQkFBVyxHQUFHLElBQUksZUFBZSxDQUFrQyxJQUFJLENBQUMsQ0FBQztRQUN6RSxjQUFTLEdBQUcsSUFBSSxPQUFPLEVBQVEsQ0FBQztRQUcvQyxJQUFJLENBQUMsdUNBQXVDLEVBQUUsQ0FBQztJQUNqRCxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILElBQVcsVUFBVTtRQUNuQixPQUFPLElBQUksQ0FBQyxXQUFXLENBQUM7SUFDMUIsQ0FBQztJQUVEOztPQUVHO0lBQ0gsSUFBVyxTQUFTO1FBQ2xCLE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQyxRQUFRLEVBQUUsQ0FBQztJQUNyQyxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNLLGdCQUFnQjtRQUN0QixvR0FBb0c7UUFDcEcsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDeEQsUUFBUSxDQUFDLFdBQVcsRUFBRTtZQUNwQixRQUFRLEVBQUUsVUFBVTtZQUNwQixRQUFRLEVBQUUsUUFBUTtZQUNsQixNQUFNLEVBQUUsT0FBTztZQUNmLEtBQUssRUFBRSxPQUFPO1lBQ2QsTUFBTSxFQUFFLENBQUM7WUFDVCxVQUFVLEVBQUUsUUFBUTtTQUNyQixDQUFDLENBQUM7UUFFSCxNQUFNLGlCQUFpQixHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzlELFFBQVEsQ0FBQyxpQkFBaUIsRUFBRTtZQUMxQixNQUFNLEVBQUUsTUFBTTtZQUNkLEtBQUssRUFBRSxNQUFNO1lBQ2IsTUFBTSxFQUFFLENBQUM7U0FDVixDQUFDLENBQUM7UUFFSCxXQUFXLENBQUMsV0FBVyxDQUFDLGlCQUFpQixDQUFDLENBQUM7UUFDM0MsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBRTdDLDhKQUE4SjtRQUM5SixNQUFNLGNBQWMsR0FBRyxXQUFXLENBQUMscUJBQXFCLEVBQUUsQ0FBQztRQUMzRCxNQUFNLG9CQUFvQixHQUFHLGlCQUFpQixDQUFDLHFCQUFxQixFQUFFLENBQUM7UUFDdkUsTUFBTSxTQUFTLEdBQTZCO1lBQzFDLHFCQUFxQixFQUFFLGNBQWMsQ0FBQyxNQUFNLEdBQUcsb0JBQW9CLENBQUMsTUFBTTtZQUMxRSxvQkFBb0IsRUFBRSxjQUFjLENBQUMsS0FBSyxHQUFHLG9CQUFvQixDQUFDLEtBQUs7U0FDeEUsQ0FBQztRQUVGLDZCQUE2QjtRQUM3QixJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDN0MsSUFBSSxTQUFTLENBQUMscUJBQXFCLEtBQUssQ0FBQyxJQUFJLFNBQVMsQ0FBQyxvQkFBb0IsS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUNsRixPQUFPLElBQUksQ0FBQztRQUNkLENBQUM7UUFFRCxPQUFPLFNBQVMsQ0FBQztJQUNuQixDQUFDO0lBRU8sdUNBQXVDO1FBQzdDLHNHQUFzRztRQUN0RywyR0FBMkc7UUFDM0csb0ZBQW9GO1FBQ3BGLElBQUksQ0FBQyxLQUFLLENBQUMsaUJBQWlCLENBQUMsR0FBRyxFQUFFO1lBQ2hDLFNBQVMsQ0FBQyxNQUFNLEVBQUUsUUFBUSxDQUFDO2lCQUN4QixJQUFJLENBQ0gsWUFBWSxDQUFDLENBQUMsQ0FBQyxFQUNmLFNBQVMsQ0FBQyxJQUFJLENBQUMsRUFBRSxrQ0FBa0M7WUFDbkQsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDLEVBQ2xDLG9CQUFvQixDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsS0FBSyxJQUFJLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQzNFLFNBQVMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQzFCO2lCQUNBLFNBQVMsQ0FBQyxTQUFTLENBQUMsRUFBRTtnQkFDckIsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQztZQUN6RCxDQUFDLENBQUMsQ0FBQztRQUNQLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVNLFdBQVc7UUFDaEIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUN4QixDQUFDOzhHQTFGVSxtQ0FBbUMsa0JBSzFCLFFBQVE7a0hBTGpCLG1DQUFtQyxjQUR2QixNQUFNOzsyRkFDbEIsbUNBQW1DO2tCQUQvQyxVQUFVO21CQUFDLEVBQUMsVUFBVSxFQUFFLE1BQU0sRUFBQzs7MEJBTWpCLE1BQU07MkJBQUMsUUFBUTs7QUF3RjlCOzs7Ozs7O0dBT0c7QUFDSCxTQUFTLFFBQVEsQ0FBQyxPQUFvQixFQUFFLEtBQW9DO0lBQzFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEYsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTgtMjAxOSBTd2lzcyBGZWRlcmFsIFJhaWx3YXlzXG4gKlxuICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZVxuICogYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSAyLjBcbiAqIHdoaWNoIGlzIGF2YWlsYWJsZSBhdCBodHRwczovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wL1xuICpcbiAqICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMFxuICovXG5cbmltcG9ydCB7SW5qZWN0LCBJbmplY3RhYmxlLCBOZ1pvbmUsIE9uRGVzdHJveX0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge0RPQ1VNRU5UfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHtCZWhhdmlvclN1YmplY3QsIGZyb21FdmVudCwgT2JzZXJ2YWJsZSwgU3ViamVjdH0gZnJvbSAncnhqcyc7XG5pbXBvcnQge2RlYm91bmNlVGltZSwgZGlzdGluY3RVbnRpbENoYW5nZWQsIG1hcCwgc3RhcnRXaXRoLCB0YWtlVW50aWx9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcblxuLyoqXG4gKiBQcm92aWRlcyB0aGUgbmF0aXZlIHNjcm9sbGJhciB0cmFja3NpemUuXG4gKi9cbkBJbmplY3RhYmxlKHtwcm92aWRlZEluOiAncm9vdCd9KVxuZXhwb3J0IGNsYXNzIFNjaU5hdGl2ZVNjcm9sbGJhclRyYWNrU2l6ZVByb3ZpZGVyIGltcGxlbWVudHMgT25EZXN0cm95IHtcblxuICBwcml2YXRlIHJlYWRvbmx5IF90cmFja1NpemUkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxOYXRpdmVTY3JvbGxiYXJUcmFja1NpemUgfCBudWxsPihudWxsKTtcbiAgcHJpdmF0ZSByZWFkb25seSBfZGVzdHJveSQgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuXG4gIGNvbnN0cnVjdG9yKEBJbmplY3QoRE9DVU1FTlQpIHByaXZhdGUgX2RvY3VtZW50OiBEb2N1bWVudCwgcHJpdmF0ZSBfem9uZTogTmdab25lKSB7XG4gICAgdGhpcy5pbnN0YWxsTmF0aXZlU2Nyb2xsYmFyVHJhY2tTaXplTGlzdGVuZXIoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGFuIHtPYnNlcnZhYmxlfSB3aGljaCBlbWl0cyB0aGUgbmF0aXZlIHNjcm9sbGJhciB0cmFjayBzaXplLCBpZiBhbnksIG9yIGVsc2UgYG51bGxgLlxuICAgKlxuICAgKiBVcG9uIHN1YnNjcmlwdGlvbiwgaXQgZW1pdHMgdGhlIHRyYWNrIHNpemUgaW1tZWRpYXRlbHksIGFuZCB0aGVuIGNvbnRpbnVvdXNseSBlbWl0cyB3aGVuIHRoZSB0cmFjayBzaXplIGNoYW5nZXMuXG4gICAqL1xuICBwdWJsaWMgZ2V0IHRyYWNrU2l6ZSQoKTogT2JzZXJ2YWJsZTxOYXRpdmVTY3JvbGxiYXJUcmFja1NpemUgfCBudWxsPiB7XG4gICAgcmV0dXJuIHRoaXMuX3RyYWNrU2l6ZSQ7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgbmF0aXZlIHNjcm9sbGJhciB0cmFjayBzaXplLCBpZiBhbnksIG9yIGVsc2UgYG51bGxgLlxuICAgKi9cbiAgcHVibGljIGdldCB0cmFja1NpemUoKTogTmF0aXZlU2Nyb2xsYmFyVHJhY2tTaXplIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMuX3RyYWNrU2l6ZSQuZ2V0VmFsdWUoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb21wdXRlcyB0aGUgbmF0aXZlIHNjcm9sbGJhciB0cmFjayBzaXplLlxuICAgKlxuICAgKiBAcmV0dXJucyBuYXRpdmUgdHJhY2sgc2l6ZSwgb3IgYG51bGxgIGlmIHRoZSBuYXRpdmUgc2Nyb2xsYmFycyBzaXQgb24gdG9wIG9mIHRoZSBjb250ZW50LlxuICAgKi9cbiAgcHJpdmF0ZSBjb21wdXRlVHJhY2tTaXplKCk6IE5hdGl2ZVNjcm9sbGJhclRyYWNrU2l6ZSB8IG51bGwge1xuICAgIC8vIGNyZWF0ZSB0ZW1wb3Jhcnkgdmlld3BvcnQgYW5kIHZpZXdwb3J0IGNsaWVudCB3aXRoIG5hdGl2ZSBzY3JvbGxiYXJzIHRvIGNvbXB1dGUgc2Nyb2xsdHJhY2sgd2lkdGhcbiAgICBjb25zdCB2aWV3cG9ydERpdiA9IHRoaXMuX2RvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgIHNldFN0eWxlKHZpZXdwb3J0RGl2LCB7XG4gICAgICBwb3NpdGlvbjogJ2Fic29sdXRlJyxcbiAgICAgIG92ZXJmbG93OiAnc2Nyb2xsJyxcbiAgICAgIGhlaWdodDogJzEwMHB4JyxcbiAgICAgIHdpZHRoOiAnMTAwcHgnLFxuICAgICAgYm9yZGVyOiAwLFxuICAgICAgdmlzaWJpbGl0eTogJ2hpZGRlbicsXG4gICAgfSk7XG5cbiAgICBjb25zdCB2aWV3cG9ydENsaWVudERpdiA9IHRoaXMuX2RvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgIHNldFN0eWxlKHZpZXdwb3J0Q2xpZW50RGl2LCB7XG4gICAgICBoZWlnaHQ6ICcxMDAlJyxcbiAgICAgIHdpZHRoOiAnMTAwJScsXG4gICAgICBib3JkZXI6IDAsXG4gICAgfSk7XG5cbiAgICB2aWV3cG9ydERpdi5hcHBlbmRDaGlsZCh2aWV3cG9ydENsaWVudERpdik7XG4gICAgdGhpcy5fZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZCh2aWV3cG9ydERpdik7XG5cbiAgICAvLyBEbyBub3QgdXNlIGNsaWVudCBhbmQgb2Zmc2V0IHdpZHRoL2hlaWdodCB0byBjYWxjdWxhdGUgdGhlIHNpemUgb2YgdGhlIHNjcm9sbGJhciwgYXMgdGhleSBhcmUgcm91bmRlZCwgcmVzdWx0aW5nIGluIHVud2FudGVkIHNwYWNpbmcgd2hlbiB6b29taW5nIHRoZSBwYWdlLlxuICAgIGNvbnN0IHZpZXdwb3J0Qm91bmRzID0gdmlld3BvcnREaXYuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgY29uc3Qgdmlld3BvcnRDbGllbnRCb3VuZHMgPSB2aWV3cG9ydENsaWVudERpdi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICBjb25zdCB0cmFja1NpemU6IE5hdGl2ZVNjcm9sbGJhclRyYWNrU2l6ZSA9IHtcbiAgICAgIGhTY3JvbGxiYXJUcmFja0hlaWdodDogdmlld3BvcnRCb3VuZHMuaGVpZ2h0IC0gdmlld3BvcnRDbGllbnRCb3VuZHMuaGVpZ2h0LFxuICAgICAgdlNjcm9sbGJhclRyYWNrV2lkdGg6IHZpZXdwb3J0Qm91bmRzLndpZHRoIC0gdmlld3BvcnRDbGllbnRCb3VuZHMud2lkdGgsXG4gICAgfTtcblxuICAgIC8vIGRlc3Ryb3kgdGVtcG9yYXJ5IHZpZXdwb3J0XG4gICAgdGhpcy5fZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZCh2aWV3cG9ydERpdik7XG4gICAgaWYgKHRyYWNrU2l6ZS5oU2Nyb2xsYmFyVHJhY2tIZWlnaHQgPT09IDAgJiYgdHJhY2tTaXplLnZTY3JvbGxiYXJUcmFja1dpZHRoID09PSAwKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICByZXR1cm4gdHJhY2tTaXplO1xuICB9XG5cbiAgcHJpdmF0ZSBpbnN0YWxsTmF0aXZlU2Nyb2xsYmFyVHJhY2tTaXplTGlzdGVuZXIoKTogdm9pZCB7XG4gICAgLy8gV2UgY29tcHV0ZSB0aGUgc2l6ZSBvZiB0aGUgbmF0aXZlIHNjcm9sbGJhciB0cmFjayB3aGVuIHRoZSBicm93c2VyIGZpcmVzIHRoZSBvbnJlc2l6ZSB3aW5kb3cgZXZlbnQuXG4gICAgLy8gVGhpcyBldmVudCBpcyBhbHNvIGZpcmVkIG9uIHBhZ2Ugem9vbSBvciB3aGVuIGRpc3BsYXlpbmcgYSBoaWRkZW4gZG9jdW1lbnQuIEhpZGRlbiBkb2N1bWVudHMgZG8gbm90IGhhdmVcbiAgICAvLyBhIHNjcm9sbGJhciB0cmFjayBzaXplIHVudGlsIGJlaW5nIGRpc3BsYXllZCwgZS5nLiwgYWZ0ZXIgc2hvd2luZyBoaWRkZW4gaWZyYW1lcy5cbiAgICB0aGlzLl96b25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcbiAgICAgIGZyb21FdmVudCh3aW5kb3csICdyZXNpemUnKVxuICAgICAgICAucGlwZShcbiAgICAgICAgICBkZWJvdW5jZVRpbWUoNSksXG4gICAgICAgICAgc3RhcnRXaXRoKG51bGwpLCAvLyB0cmlnZ2VyIHRoZSBpbml0aWFsIGNvbXB1dGF0aW9uXG4gICAgICAgICAgbWFwKCgpID0+IHRoaXMuY29tcHV0ZVRyYWNrU2l6ZSgpKSxcbiAgICAgICAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgodDEsIHQyKSA9PiBKU09OLnN0cmluZ2lmeSh0MSkgPT09IEpTT04uc3RyaW5naWZ5KHQyKSksXG4gICAgICAgICAgdGFrZVVudGlsKHRoaXMuX2Rlc3Ryb3kkKSxcbiAgICAgICAgKVxuICAgICAgICAuc3Vic2NyaWJlKHRyYWNrU2l6ZSA9PiB7XG4gICAgICAgICAgdGhpcy5fem9uZS5ydW4oKCkgPT4gdGhpcy5fdHJhY2tTaXplJC5uZXh0KHRyYWNrU2l6ZSkpO1xuICAgICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLl9kZXN0cm95JC5uZXh0KCk7XG4gIH1cbn1cblxuLyoqXG4gKiBBcHBsaWVzIHRoZSBnaXZlbiBzdHlsZShzKSB0byB0aGUgZ2l2ZW4gZWxlbWVudC5cbiAqXG4gKiBTcGVjaWZ5IHN0eWxlcyB0byBiZSBtb2RpZmllZCBieSBwYXNzaW5nIGEgZGljdGlvbmFyeSBjb250YWluaW5nIENTUyBwcm9wZXJ0eSBuYW1lcyAoaHlwaGVuIGNhc2UpLlxuICogVG8gcmVtb3ZlIGEgc3R5bGUsIHNldCBpdHMgdmFsdWUgdG8gYG51bGxgLlxuICpcbiAqIEBpZ25vcmVcbiAqL1xuZnVuY3Rpb24gc2V0U3R5bGUoZWxlbWVudDogSFRNTEVsZW1lbnQsIHN0eWxlOiB7W3N0eWxlOiBzdHJpbmddOiBhbnkgfCBudWxsfSk6IHZvaWQge1xuICBPYmplY3Qua2V5cyhzdHlsZSkuZm9yRWFjaChrZXkgPT4gZWxlbWVudC5zdHlsZS5zZXRQcm9wZXJ0eShrZXksIHN0eWxlW2tleV0pKTtcbn1cblxuLyoqXG4gKiBSZXByZXNlbnRzIHRoZSBuYXRpdmUgc2Nyb2xsYmFyIHRyYWNrIHNpemUuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTmF0aXZlU2Nyb2xsYmFyVHJhY2tTaXplIHtcbiAgaFNjcm9sbGJhclRyYWNrSGVpZ2h0OiBudW1iZXI7XG4gIHZTY3JvbGxiYXJUcmFja1dpZHRoOiBudW1iZXI7XG59XG4iXX0=
91
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmF0aXZlLXNjcm9sbGJhci10cmFjay1zaXplLXByb3ZpZGVyLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zY2lvbi9jb21wb25lbnRzL3ZpZXdwb3J0L3NyYy9uYXRpdmUtc2Nyb2xsYmFyLXRyYWNrLXNpemUtcHJvdmlkZXIuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7R0FRRztBQUVILE9BQU8sRUFBQyxNQUFNLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBUyxNQUFNLGVBQWUsQ0FBQztBQUNqRSxPQUFPLEVBQUMsUUFBUSxFQUFDLE1BQU0saUJBQWlCLENBQUM7QUFDekMsT0FBTyxFQUFDLFNBQVMsRUFBQyxNQUFNLE1BQU0sQ0FBQztBQUMvQixPQUFPLEVBQUMsWUFBWSxFQUFFLG9CQUFvQixFQUFFLEdBQUcsRUFBRSxTQUFTLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUNsRixPQUFPLEVBQUMsUUFBUSxFQUFDLE1BQU0sNEJBQTRCLENBQUM7QUFDcEQsT0FBTyxFQUFDLFdBQVcsRUFBQyxNQUFNLDBCQUEwQixDQUFDOztBQUVyRDs7R0FFRztBQUVILE1BQU0sT0FBTyxtQ0FBbUM7SUFVOUM7UUFSUSxjQUFTLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQzdCLFVBQUssR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7UUFRN0IsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsb0NBQW9DLEVBQUUsQ0FBQztJQUMvRCxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNLLGdCQUFnQjtRQUN0Qix5R0FBeUc7UUFDekcsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDeEQsUUFBUSxDQUFDLFdBQVcsRUFBRTtZQUNwQixRQUFRLEVBQUUsVUFBVTtZQUNwQixRQUFRLEVBQUUsUUFBUTtZQUNsQixNQUFNLEVBQUUsT0FBTztZQUNmLEtBQUssRUFBRSxPQUFPO1lBQ2QsTUFBTSxFQUFFLENBQUM7WUFDVCxVQUFVLEVBQUUsUUFBUTtTQUNyQixDQUFDLENBQUM7UUFFSCxNQUFNLGlCQUFpQixHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzlELFFBQVEsQ0FBQyxpQkFBaUIsRUFBRTtZQUMxQixNQUFNLEVBQUUsTUFBTTtZQUNkLEtBQUssRUFBRSxNQUFNO1lBQ2IsTUFBTSxFQUFFLENBQUM7U0FDVixDQUFDLENBQUM7UUFFSCxXQUFXLENBQUMsV0FBVyxDQUFDLGlCQUFpQixDQUFDLENBQUM7UUFDM0MsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBRTdDLDhKQUE4SjtRQUM5SixNQUFNLGNBQWMsR0FBRyxXQUFXLENBQUMscUJBQXFCLEVBQUUsQ0FBQztRQUMzRCxNQUFNLG9CQUFvQixHQUFHLGlCQUFpQixDQUFDLHFCQUFxQixFQUFFLENBQUM7UUFDdkUsTUFBTSxTQUFTLEdBQTZCO1lBQzFDLHFCQUFxQixFQUFFLGNBQWMsQ0FBQyxNQUFNLEdBQUcsb0JBQW9CLENBQUMsTUFBTTtZQUMxRSxvQkFBb0IsRUFBRSxjQUFjLENBQUMsS0FBSyxHQUFHLG9CQUFvQixDQUFDLEtBQUs7U0FDeEUsQ0FBQztRQUVGLDhCQUE4QjtRQUM5QixJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDN0MsSUFBSSxTQUFTLENBQUMscUJBQXFCLEtBQUssQ0FBQyxJQUFJLFNBQVMsQ0FBQyxvQkFBb0IsS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUNsRixPQUFPLElBQUksQ0FBQztRQUNkLENBQUM7UUFFRCxPQUFPLFNBQVMsQ0FBQztJQUNuQixDQUFDO0lBRU8sb0NBQW9DO1FBQzFDLHNHQUFzRztRQUN0RywyR0FBMkc7UUFDM0csb0ZBQW9GO1FBQ3BGLE1BQU0sVUFBVSxHQUFHLFNBQVMsQ0FBQyxNQUFNLEVBQUUsUUFBUSxDQUFDO2FBQzNDLElBQUksQ0FDSCxXQUFXLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLGlCQUFpQixDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQ25ELFlBQVksQ0FBQyxDQUFDLENBQUMsRUFDZixTQUFTLENBQUMsSUFBSSxDQUFDLEVBQUUsa0NBQWtDO1FBQ25ELEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQyxFQUNsQyxvQkFBb0IsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxxQkFBcUIsS0FBSyxFQUFFLEVBQUUscUJBQXFCLElBQUksRUFBRSxFQUFFLG9CQUFvQixLQUFLLEVBQUUsRUFBRSxvQkFBb0IsQ0FBQyxDQUNuSixDQUFDO1FBQ0osT0FBTyxRQUFRLENBQUMsVUFBVSxFQUFFLEVBQUMsWUFBWSxFQUFFLElBQUksRUFBQyxDQUFDLENBQUM7SUFDcEQsQ0FBQzs4R0F2RVUsbUNBQW1DO2tIQUFuQyxtQ0FBbUMsY0FEdkIsTUFBTTs7MkZBQ2xCLG1DQUFtQztrQkFEL0MsVUFBVTttQkFBQyxFQUFDLFVBQVUsRUFBRSxNQUFNLEVBQUM7O0FBMkVoQzs7Ozs7OztHQU9HO0FBQ0gsU0FBUyxRQUFRLENBQUMsT0FBb0IsRUFBRSxLQUFvQztJQUMxRSxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hGLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuICogQ29weXJpZ2h0IChjKSAyMDE4LTIwMjQgU3dpc3MgRmVkZXJhbCBSYWlsd2F5c1xuICpcbiAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGVcbiAqIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgMi4wXG4gKiB3aGljaCBpcyBhdmFpbGFibGUgYXQgaHR0cHM6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC9cbiAqXG4gKiAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjBcbiAqL1xuXG5pbXBvcnQge2luamVjdCwgSW5qZWN0YWJsZSwgTmdab25lLCBTaWduYWx9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtET0NVTUVOVH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7ZnJvbUV2ZW50fSBmcm9tICdyeGpzJztcbmltcG9ydCB7ZGVib3VuY2VUaW1lLCBkaXN0aW5jdFVudGlsQ2hhbmdlZCwgbWFwLCBzdGFydFdpdGh9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7dG9TaWduYWx9IGZyb20gJ0Bhbmd1bGFyL2NvcmUvcnhqcy1pbnRlcm9wJztcbmltcG9ydCB7c3Vic2NyaWJlSW59IGZyb20gJ0BzY2lvbi90b29sa2l0L29wZXJhdG9ycyc7XG5cbi8qKlxuICogUHJvdmlkZXMgdGhlIG5hdGl2ZSBzY3JvbGxiYXIgdHJhY2tzaXplLlxuICovXG5ASW5qZWN0YWJsZSh7cHJvdmlkZWRJbjogJ3Jvb3QnfSlcbmV4cG9ydCBjbGFzcyBTY2lOYXRpdmVTY3JvbGxiYXJUcmFja1NpemVQcm92aWRlciB7XG5cbiAgcHJpdmF0ZSBfZG9jdW1lbnQgPSBpbmplY3QoRE9DVU1FTlQpO1xuICBwcml2YXRlIF96b25lID0gaW5qZWN0KE5nWm9uZSk7XG5cbiAgLyoqXG4gICAqIFByb3ZpZGVzIHRoZSB0cmFjayBzaXplIG9mIHRoZSBuYXRpdmUgc2Nyb2xsYmFyLCBvciBgbnVsbGAgaWYgdGhlIG5hdGl2ZSBzY3JvbGxiYXJzIHNpdCBvbiB0b3Agb2YgdGhlIGNvbnRlbnQuXG4gICAqL1xuICBwdWJsaWMgdHJhY2tTaXplOiBTaWduYWw8TmF0aXZlU2Nyb2xsYmFyVHJhY2tTaXplIHwgbnVsbD47XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgdGhpcy50cmFja1NpemUgPSB0aGlzLmNyZWF0ZU5hdGl2ZVNjcm9sbGJhclRyYWNrU2l6ZVNpZ25hbCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbXB1dGVzIHRoZSBuYXRpdmUgc2Nyb2xsYmFyIHRyYWNrIHNpemUuXG4gICAqXG4gICAqIEByZXR1cm5zIG5hdGl2ZSB0cmFjayBzaXplLCBvciBgbnVsbGAgaWYgdGhlIG5hdGl2ZSBzY3JvbGxiYXJzIHNpdCBvbiB0b3Agb2YgdGhlIGNvbnRlbnQuXG4gICAqL1xuICBwcml2YXRlIGNvbXB1dGVUcmFja1NpemUoKTogTmF0aXZlU2Nyb2xsYmFyVHJhY2tTaXplIHwgbnVsbCB7XG4gICAgLy8gQ3JlYXRlIHRlbXBvcmFyeSB2aWV3cG9ydCBhbmQgdmlld3BvcnQgY2xpZW50IHdpdGggbmF0aXZlIHNjcm9sbGJhcnMgdG8gY29tcHV0ZSB0aGUgc2Nyb2xsdHJhY2sgd2lkdGguXG4gICAgY29uc3Qgdmlld3BvcnREaXYgPSB0aGlzLl9kb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICBzZXRTdHlsZSh2aWV3cG9ydERpdiwge1xuICAgICAgcG9zaXRpb246ICdhYnNvbHV0ZScsXG4gICAgICBvdmVyZmxvdzogJ3Njcm9sbCcsXG4gICAgICBoZWlnaHQ6ICcxMDBweCcsXG4gICAgICB3aWR0aDogJzEwMHB4JyxcbiAgICAgIGJvcmRlcjogMCxcbiAgICAgIHZpc2liaWxpdHk6ICdoaWRkZW4nLFxuICAgIH0pO1xuXG4gICAgY29uc3Qgdmlld3BvcnRDbGllbnREaXYgPSB0aGlzLl9kb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICBzZXRTdHlsZSh2aWV3cG9ydENsaWVudERpdiwge1xuICAgICAgaGVpZ2h0OiAnMTAwJScsXG4gICAgICB3aWR0aDogJzEwMCUnLFxuICAgICAgYm9yZGVyOiAwLFxuICAgIH0pO1xuXG4gICAgdmlld3BvcnREaXYuYXBwZW5kQ2hpbGQodmlld3BvcnRDbGllbnREaXYpO1xuICAgIHRoaXMuX2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQodmlld3BvcnREaXYpO1xuXG4gICAgLy8gRG8gbm90IHVzZSBjbGllbnQgYW5kIG9mZnNldCB3aWR0aC9oZWlnaHQgdG8gY2FsY3VsYXRlIHRoZSBzaXplIG9mIHRoZSBzY3JvbGxiYXIsIGFzIHRoZXkgYXJlIHJvdW5kZWQsIHJlc3VsdGluZyBpbiB1bndhbnRlZCBzcGFjaW5nIHdoZW4gem9vbWluZyB0aGUgcGFnZS5cbiAgICBjb25zdCB2aWV3cG9ydEJvdW5kcyA9IHZpZXdwb3J0RGl2LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIGNvbnN0IHZpZXdwb3J0Q2xpZW50Qm91bmRzID0gdmlld3BvcnRDbGllbnREaXYuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgY29uc3QgdHJhY2tTaXplOiBOYXRpdmVTY3JvbGxiYXJUcmFja1NpemUgPSB7XG4gICAgICBoU2Nyb2xsYmFyVHJhY2tIZWlnaHQ6IHZpZXdwb3J0Qm91bmRzLmhlaWdodCAtIHZpZXdwb3J0Q2xpZW50Qm91bmRzLmhlaWdodCxcbiAgICAgIHZTY3JvbGxiYXJUcmFja1dpZHRoOiB2aWV3cG9ydEJvdW5kcy53aWR0aCAtIHZpZXdwb3J0Q2xpZW50Qm91bmRzLndpZHRoLFxuICAgIH07XG5cbiAgICAvLyBEZXN0cm95IHRlbXBvcmFyeSB2aWV3cG9ydC5cbiAgICB0aGlzLl9kb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKHZpZXdwb3J0RGl2KTtcbiAgICBpZiAodHJhY2tTaXplLmhTY3JvbGxiYXJUcmFja0hlaWdodCA9PT0gMCAmJiB0cmFja1NpemUudlNjcm9sbGJhclRyYWNrV2lkdGggPT09IDApIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHJldHVybiB0cmFja1NpemU7XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZU5hdGl2ZVNjcm9sbGJhclRyYWNrU2l6ZVNpZ25hbCgpOiBTaWduYWw8TmF0aXZlU2Nyb2xsYmFyVHJhY2tTaXplIHwgbnVsbD4ge1xuICAgIC8vIFdlIGNvbXB1dGUgdGhlIHNpemUgb2YgdGhlIG5hdGl2ZSBzY3JvbGxiYXIgdHJhY2sgd2hlbiB0aGUgYnJvd3NlciBmaXJlcyB0aGUgb25yZXNpemUgd2luZG93IGV2ZW50LlxuICAgIC8vIFRoaXMgZXZlbnQgaXMgYWxzbyBmaXJlZCBvbiBwYWdlIHpvb20gb3Igd2hlbiBkaXNwbGF5aW5nIGEgaGlkZGVuIGRvY3VtZW50LiBIaWRkZW4gZG9jdW1lbnRzIGRvIG5vdCBoYXZlXG4gICAgLy8gYSBzY3JvbGxiYXIgdHJhY2sgc2l6ZSB1bnRpbCBiZWluZyBkaXNwbGF5ZWQsIGUuZy4sIGFmdGVyIHNob3dpbmcgaGlkZGVuIGlmcmFtZXMuXG4gICAgY29uc3QgdHJhY2tTaXplJCA9IGZyb21FdmVudCh3aW5kb3csICdyZXNpemUnKVxuICAgICAgLnBpcGUoXG4gICAgICAgIHN1YnNjcmliZUluKGZuID0+IHRoaXMuX3pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoZm4pKSxcbiAgICAgICAgZGVib3VuY2VUaW1lKDUpLFxuICAgICAgICBzdGFydFdpdGgobnVsbCksIC8vIHRyaWdnZXIgdGhlIGluaXRpYWwgY29tcHV0YXRpb25cbiAgICAgICAgbWFwKCgpID0+IHRoaXMuY29tcHV0ZVRyYWNrU2l6ZSgpKSxcbiAgICAgICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKHQxLCB0MikgPT4gdDE/LmhTY3JvbGxiYXJUcmFja0hlaWdodCA9PT0gdDI/LmhTY3JvbGxiYXJUcmFja0hlaWdodCAmJiB0MT8udlNjcm9sbGJhclRyYWNrV2lkdGggPT09IHQyPy52U2Nyb2xsYmFyVHJhY2tXaWR0aCksXG4gICAgICApO1xuICAgIHJldHVybiB0b1NpZ25hbCh0cmFja1NpemUkLCB7aW5pdGlhbFZhbHVlOiBudWxsfSk7XG4gIH1cbn1cblxuLyoqXG4gKiBBcHBsaWVzIHRoZSBnaXZlbiBzdHlsZShzKSB0byB0aGUgZ2l2ZW4gZWxlbWVudC5cbiAqXG4gKiBTcGVjaWZ5IHN0eWxlcyB0byBiZSBtb2RpZmllZCBieSBwYXNzaW5nIGEgZGljdGlvbmFyeSBjb250YWluaW5nIENTUyBwcm9wZXJ0eSBuYW1lcyAoaHlwaGVuIGNhc2UpLlxuICogVG8gcmVtb3ZlIGEgc3R5bGUsIHNldCBpdHMgdmFsdWUgdG8gYG51bGxgLlxuICpcbiAqIEBpZ25vcmVcbiAqL1xuZnVuY3Rpb24gc2V0U3R5bGUoZWxlbWVudDogSFRNTEVsZW1lbnQsIHN0eWxlOiB7W3N0eWxlOiBzdHJpbmddOiBhbnkgfCBudWxsfSk6IHZvaWQge1xuICBPYmplY3Qua2V5cyhzdHlsZSkuZm9yRWFjaChrZXkgPT4gZWxlbWVudC5zdHlsZS5zZXRQcm9wZXJ0eShrZXksIHN0eWxlW2tleV0pKTtcbn1cblxuLyoqXG4gKiBSZXByZXNlbnRzIHRoZSBuYXRpdmUgc2Nyb2xsYmFyIHRyYWNrIHNpemUuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTmF0aXZlU2Nyb2xsYmFyVHJhY2tTaXplIHtcbiAgaFNjcm9sbGJhclRyYWNrSGVpZ2h0OiBudW1iZXI7XG4gIHZTY3JvbGxiYXJUcmFja1dpZHRoOiBudW1iZXI7XG59XG4iXX0=