@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 +2 -2
- package/dimension/bounding-client-rect.signal.d.ts +23 -0
- package/dimension/dimension.d.ts +10 -0
- package/dimension/dimension.directive.d.ts +4 -15
- package/dimension/dimension.signal.d.ts +19 -0
- package/dimension/public_api.d.ts +4 -1
- package/esm2022/dimension/bounding-client-rect.signal.mjs +54 -0
- package/esm2022/dimension/dimension.directive.mjs +14 -11
- package/esm2022/dimension/dimension.mjs +11 -0
- package/esm2022/dimension/dimension.signal.mjs +63 -0
- package/esm2022/dimension/public_api.mjs +3 -1
- package/esm2022/viewport/native-scrollbar-track-size-provider.service.mjs +20 -44
- package/esm2022/viewport/scrollable.directive.mjs +29 -31
- package/esm2022/viewport/scrollbar/scrollbar.component.mjs +108 -126
- package/esm2022/viewport/viewport.component.mjs +36 -60
- package/fesm2022/scion-components-dimension.mjs +126 -13
- package/fesm2022/scion-components-dimension.mjs.map +1 -1
- package/fesm2022/scion-components-viewport.mjs +182 -249
- package/fesm2022/scion-components-viewport.mjs.map +1 -1
- package/package.json +2 -2
- package/viewport/native-scrollbar-track-size-provider.service.d.ts +6 -16
- package/viewport/scrollable.directive.d.ts +9 -10
- package/viewport/scrollbar/scrollbar.component.d.ts +17 -32
- package/viewport/viewport.component.d.ts +8 -11
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
|
|
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>;
|
|
@@ -1,8 +1,7 @@
|
|
|
1
|
+
import { SciDimension } from './dimension';
|
|
1
2
|
import * as i0 from "@angular/core";
|
|
2
3
|
/**
|
|
3
|
-
* Observes
|
|
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
|
|
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
|
-
*
|
|
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
|
|
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 {
|
|
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
|
|
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
|
|
28
|
+
* Controls if to output outside the Angular zone. Defaults to `false`.
|
|
32
29
|
*/
|
|
33
30
|
this.emitOutsideAngular = input(false);
|
|
34
31
|
/**
|
|
35
|
-
*
|
|
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(
|
|
42
|
-
|
|
43
|
-
|
|
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,
|
|
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
|
-
|
|
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-
|
|
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 {
|
|
10
|
+
import { inject, Injectable, NgZone } from '@angular/core';
|
|
11
11
|
import { DOCUMENT } from '@angular/common';
|
|
12
|
-
import {
|
|
13
|
-
import { debounceTime, distinctUntilChanged, map, startWith
|
|
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(
|
|
20
|
-
this._document =
|
|
21
|
-
this._zone =
|
|
22
|
-
this.
|
|
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
|
-
//
|
|
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
|
-
//
|
|
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
|
-
|
|
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
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
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: [
|
|
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: () => [
|
|
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=
|