@skyux/popovers 8.7.0 → 9.0.0-alpha.0
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/{esm2020 → esm2022}/lib/modules/dropdown/dropdown-button.component.mjs +4 -4
- package/esm2022/lib/modules/dropdown/dropdown-item.component.mjs +68 -0
- package/esm2022/lib/modules/dropdown/dropdown-menu.component.mjs +314 -0
- package/esm2022/lib/modules/dropdown/dropdown.component.mjs +391 -0
- package/{esm2020 → esm2022}/lib/modules/dropdown/dropdown.module.mjs +21 -21
- package/{esm2020 → esm2022}/lib/modules/popover/popover-adapter.service.mjs +4 -4
- package/esm2022/lib/modules/popover/popover-content.component.mjs +273 -0
- package/esm2022/lib/modules/popover/popover.component.mjs +236 -0
- package/esm2022/lib/modules/popover/popover.directive.mjs +217 -0
- package/{esm2020 → esm2022}/lib/modules/popover/popover.module.mjs +19 -19
- package/esm2022/lib/modules/shared/sky-popovers-resources.module.mjs +47 -0
- package/esm2022/testing/dropdown/dropdown-fixture.mjs +138 -0
- package/{esm2020 → esm2022}/testing/dropdown/dropdown-testing.module.mjs +5 -5
- package/esm2022/testing/dropdown/harness/dropdown-harness.mjs +95 -0
- package/esm2022/testing/dropdown/harness/dropdown-item-harness.mjs +38 -0
- package/esm2022/testing/dropdown/harness/dropdown-menu-harness.mjs +63 -0
- package/esm2022/testing/popover/harness/popover-body-harness.mjs +42 -0
- package/esm2022/testing/popover/harness/popover-content-harness.mjs +94 -0
- package/esm2022/testing/popover/harness/popover-harness.mjs +51 -0
- package/esm2022/testing/popover/popover-fixture.mjs +88 -0
- package/{esm2020 → esm2022}/testing/popover/popover-testing.module.mjs +11 -11
- package/fesm2022/skyux-popovers-testing.mjs +651 -0
- package/{fesm2020 → fesm2022}/skyux-popovers-testing.mjs.map +1 -1
- package/fesm2022/skyux-popovers.mjs +1827 -0
- package/{fesm2020 → fesm2022}/skyux-popovers.mjs.map +1 -1
- package/lib/modules/dropdown/dropdown-item.component.d.ts +1 -1
- package/lib/modules/dropdown/dropdown-menu.component.d.ts +1 -1
- package/lib/modules/dropdown/dropdown.component.d.ts +1 -1
- package/lib/modules/popover/popover.component.d.ts +1 -1
- package/lib/modules/popover/popover.directive.d.ts +1 -1
- package/package.json +18 -26
- package/esm2020/lib/modules/dropdown/dropdown-item.component.mjs +0 -70
- package/esm2020/lib/modules/dropdown/dropdown-menu.component.mjs +0 -307
- package/esm2020/lib/modules/dropdown/dropdown.component.mjs +0 -375
- package/esm2020/lib/modules/popover/popover-content.component.mjs +0 -268
- package/esm2020/lib/modules/popover/popover.component.mjs +0 -233
- package/esm2020/lib/modules/popover/popover.directive.mjs +0 -209
- package/esm2020/lib/modules/shared/sky-popovers-resources.module.mjs +0 -47
- package/esm2020/testing/dropdown/dropdown-fixture.mjs +0 -137
- package/esm2020/testing/dropdown/harness/dropdown-harness.mjs +0 -102
- package/esm2020/testing/dropdown/harness/dropdown-item-harness.mjs +0 -44
- package/esm2020/testing/dropdown/harness/dropdown-menu-harness.mjs +0 -69
- package/esm2020/testing/popover/harness/popover-body-harness.mjs +0 -42
- package/esm2020/testing/popover/harness/popover-content-harness.mjs +0 -100
- package/esm2020/testing/popover/harness/popover-harness.mjs +0 -56
- package/esm2020/testing/popover/popover-fixture.mjs +0 -74
- package/fesm2015/skyux-popovers-testing.mjs +0 -739
- package/fesm2015/skyux-popovers-testing.mjs.map +0 -1
- package/fesm2015/skyux-popovers.mjs +0 -1807
- package/fesm2015/skyux-popovers.mjs.map +0 -1
- package/fesm2020/skyux-popovers-testing.mjs +0 -660
- package/fesm2020/skyux-popovers.mjs +0 -1785
- /package/{esm2020 → esm2022}/index.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/modules/dropdown/dropdown-extensions.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/modules/dropdown/types/dropdown-button-type.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/modules/dropdown/types/dropdown-horizontal-alignment.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/modules/dropdown/types/dropdown-menu-change.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/modules/dropdown/types/dropdown-message-type.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/modules/dropdown/types/dropdown-message.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/modules/dropdown/types/dropdown-trigger-type.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/modules/popover/popover-animation-state.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/modules/popover/popover-animation.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/modules/popover/popover-context.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/modules/popover/popover-extensions.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/modules/popover/types/popover-adapter-arrow-coordinates.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/modules/popover/types/popover-adapter-elements.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/modules/popover/types/popover-alignment.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/modules/popover/types/popover-message-type.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/modules/popover/types/popover-message.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/modules/popover/types/popover-placement.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/modules/popover/types/popover-position.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/modules/popover/types/popover-trigger.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/modules/popover/types/popover-type.mjs +0 -0
- /package/{esm2020 → esm2022}/skyux-popovers.mjs +0 -0
- /package/{esm2020 → esm2022}/testing/dropdown/harness/dropdown-harness.filters.mjs +0 -0
- /package/{esm2020 → esm2022}/testing/dropdown/harness/dropdown-item-harness.filters.mjs +0 -0
- /package/{esm2020 → esm2022}/testing/dropdown/harness/dropdown-menu-harness.filters.mjs +0 -0
- /package/{esm2020 → esm2022}/testing/dropdown/popovers-fixture-dropdown-item.mjs +0 -0
- /package/{esm2020 → esm2022}/testing/dropdown/popovers-fixture-dropdown-menu.mjs +0 -0
- /package/{esm2020 → esm2022}/testing/dropdown/popovers-fixture-dropdown.mjs +0 -0
- /package/{esm2020 → esm2022}/testing/popover/harness/popover-content-harness-filters.mjs +0 -0
- /package/{esm2020 → esm2022}/testing/popover/harness/popover-harness-filters.mjs +0 -0
- /package/{esm2020 → esm2022}/testing/public-api.mjs +0 -0
- /package/{esm2020 → esm2022}/testing/skyux-popovers-testing.mjs +0 -0
|
@@ -4,11 +4,11 @@ import * as i0 from "@angular/core";
|
|
|
4
4
|
* Specifies the button for the dropdown menu.
|
|
5
5
|
*/
|
|
6
6
|
export class SkyDropdownButtonComponent {
|
|
7
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: SkyDropdownButtonComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
8
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: SkyDropdownButtonComponent, selector: "sky-dropdown-button", ngImport: i0, template: "<ng-content></ng-content>\n" }); }
|
|
7
9
|
}
|
|
8
|
-
|
|
9
|
-
SkyDropdownButtonComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.9", type: SkyDropdownButtonComponent, selector: "sky-dropdown-button", ngImport: i0, template: "<ng-content></ng-content>\n" });
|
|
10
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: SkyDropdownButtonComponent, decorators: [{
|
|
10
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: SkyDropdownButtonComponent, decorators: [{
|
|
11
11
|
type: Component,
|
|
12
12
|
args: [{ selector: 'sky-dropdown-button', template: "<ng-content></ng-content>\n" }]
|
|
13
13
|
}] });
|
|
14
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
14
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHJvcGRvd24tYnV0dG9uLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvY29tcG9uZW50cy9wb3BvdmVycy9zcmMvbGliL21vZHVsZXMvZHJvcGRvd24vZHJvcGRvd24tYnV0dG9uLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvY29tcG9uZW50cy9wb3BvdmVycy9zcmMvbGliL21vZHVsZXMvZHJvcGRvd24vZHJvcGRvd24tYnV0dG9uLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7O0FBRTFDOztHQUVHO0FBS0gsTUFBTSxPQUFPLDBCQUEwQjs4R0FBMUIsMEJBQTBCO2tHQUExQiwwQkFBMEIsMkRDVHZDLDZCQUNBOzsyRkRRYSwwQkFBMEI7a0JBSnRDLFNBQVM7K0JBQ0UscUJBQXFCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbi8qKlxuICogU3BlY2lmaWVzIHRoZSBidXR0b24gZm9yIHRoZSBkcm9wZG93biBtZW51LlxuICovXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdza3ktZHJvcGRvd24tYnV0dG9uJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2Ryb3Bkb3duLWJ1dHRvbi5jb21wb25lbnQuaHRtbCcsXG59KVxuZXhwb3J0IGNsYXNzIFNreURyb3Bkb3duQnV0dG9uQ29tcG9uZW50IHt9XG4iLCI8bmctY29udGVudD48L25nLWNvbnRlbnQ+XG4iXX0=
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import { ChangeDetectionStrategy, Component, Input, ViewEncapsulation, } from '@angular/core';
|
|
2
|
+
import * as i0 from "@angular/core";
|
|
3
|
+
import * as i1 from "@angular/common";
|
|
4
|
+
/**
|
|
5
|
+
* Specifies the items to display on the dropdown menu.
|
|
6
|
+
*/
|
|
7
|
+
export class SkyDropdownItemComponent {
|
|
8
|
+
/**
|
|
9
|
+
* The ARIA role for the dropdown menu item
|
|
10
|
+
* [to support accessibility](https://developer.blackbaud.com/skyux/learn/accessibility)
|
|
11
|
+
* by indicating how the item functions and what it controls. For information about
|
|
12
|
+
* how an ARIA role indicates what an item represents on a web page, see the
|
|
13
|
+
* [WAI-ARIA roles model](https://www.w3.org/WAI/PF/aria/#roles).
|
|
14
|
+
* @default "menuitem"
|
|
15
|
+
*/
|
|
16
|
+
set ariaRole(value) {
|
|
17
|
+
this.#_ariaRole = value ?? 'menuitem';
|
|
18
|
+
}
|
|
19
|
+
get ariaRole() {
|
|
20
|
+
return this.#_ariaRole;
|
|
21
|
+
}
|
|
22
|
+
#_ariaRole;
|
|
23
|
+
#changeDetector;
|
|
24
|
+
#renderer;
|
|
25
|
+
constructor(elementRef, changeDetector, renderer) {
|
|
26
|
+
this.elementRef = elementRef;
|
|
27
|
+
this.isActive = false;
|
|
28
|
+
this.#_ariaRole = 'menuitem';
|
|
29
|
+
this.#changeDetector = changeDetector;
|
|
30
|
+
this.#renderer = renderer;
|
|
31
|
+
}
|
|
32
|
+
ngAfterViewInit() {
|
|
33
|
+
// Make sure anchor elements are tab-able.
|
|
34
|
+
const buttonElement = this.#getButtonElement();
|
|
35
|
+
/* istanbul ignore else */
|
|
36
|
+
if (buttonElement) {
|
|
37
|
+
this.#renderer.setAttribute(buttonElement, 'tabIndex', '0');
|
|
38
|
+
}
|
|
39
|
+
this.#changeDetector.detectChanges();
|
|
40
|
+
}
|
|
41
|
+
focusElement(enableNativeFocus) {
|
|
42
|
+
this.isActive = true;
|
|
43
|
+
if (enableNativeFocus) {
|
|
44
|
+
this.#getButtonElement()?.focus();
|
|
45
|
+
}
|
|
46
|
+
this.#changeDetector.detectChanges();
|
|
47
|
+
}
|
|
48
|
+
isFocusable() {
|
|
49
|
+
const isFocusable = this.#getButtonElement()?.getAttribute('disabled') === null;
|
|
50
|
+
return isFocusable;
|
|
51
|
+
}
|
|
52
|
+
resetState() {
|
|
53
|
+
this.isActive = false;
|
|
54
|
+
this.#changeDetector.markForCheck();
|
|
55
|
+
}
|
|
56
|
+
#getButtonElement() {
|
|
57
|
+
return this.elementRef.nativeElement.querySelector('button,a');
|
|
58
|
+
}
|
|
59
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: SkyDropdownItemComponent, deps: [{ token: i0.ElementRef }, { token: i0.ChangeDetectorRef }, { token: i0.Renderer2 }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
60
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: SkyDropdownItemComponent, selector: "sky-dropdown-item", inputs: { ariaRole: "ariaRole" }, ngImport: i0, template: "<div\n class=\"sky-dropdown-item\"\n [attr.role]=\"ariaRole\"\n [ngClass]=\"{\n 'sky-dropdown-item-active': isActive\n }\"\n>\n <ng-content> </ng-content>\n</div>\n", styles: [".sky-dropdown-item{background-color:transparent;border:none;display:block;margin:4px;min-width:160px;text-align:left}.sky-dropdown-item.sky-dropdown-item-active a,.sky-dropdown-item.sky-dropdown-item-active button,.sky-dropdown-item:hover a,.sky-dropdown-item:hover button{background-color:#eeeeef}.sky-dropdown-item button[disabled],.sky-dropdown-item a[disabled]{cursor:default}.sky-dropdown-item button[disabled]:hover,.sky-dropdown-item a[disabled]:hover{background-color:transparent}.sky-dropdown-item>a,.sky-dropdown-item>button{background-color:transparent;border:none;color:#212327;cursor:pointer;display:block;padding:3px 20px;text-align:left;width:100%}.sky-dropdown-item>a:hover,.sky-dropdown-item>button:hover{text-decoration:none}.sky-dropdown-item>a[disabled],.sky-dropdown-item>button[disabled]{color:#686c73}.sky-dropdown-item>a[disabled]:hover,.sky-dropdown-item>button[disabled]:hover{cursor:default}.sky-theme-modern .sky-dropdown-item{margin:0}.sky-theme-modern .sky-dropdown-item.sky-dropdown-item-active,.sky-theme-modern .sky-dropdown-item:hover{background-color:transparent}.sky-theme-modern .sky-dropdown-item>a,.sky-theme-modern .sky-dropdown-item>button{padding:10px 20px;border-radius:6px;transition:box-shadow .15s}.sky-theme-modern .sky-dropdown-item>a:hover,.sky-theme-modern .sky-dropdown-item>button:hover{outline:solid 1px #1870B8;outline-offset:-1px}.sky-theme-modern .sky-dropdown-item>a:focus-visible,.sky-theme-modern .sky-dropdown-item>a:active,.sky-theme-modern .sky-dropdown-item>button:focus-visible,.sky-theme-modern .sky-dropdown-item>button:active{outline:solid 2px #1870B8;outline-offset:-2px}.sky-theme-modern .sky-dropdown-item>a:focus-visible:not(:active),.sky-theme-modern .sky-dropdown-item>button:focus-visible:not(:active){box-shadow:0 1px 8px #0000004d}.sky-theme-modern.sky-theme-mode-dark .sky-dropdown-item>a,.sky-theme-modern.sky-theme-mode-dark .sky-dropdown-item>button{color:#fbfcfe}\n"], dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
|
|
61
|
+
}
|
|
62
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: SkyDropdownItemComponent, decorators: [{
|
|
63
|
+
type: Component,
|
|
64
|
+
args: [{ selector: 'sky-dropdown-item', changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, template: "<div\n class=\"sky-dropdown-item\"\n [attr.role]=\"ariaRole\"\n [ngClass]=\"{\n 'sky-dropdown-item-active': isActive\n }\"\n>\n <ng-content> </ng-content>\n</div>\n", styles: [".sky-dropdown-item{background-color:transparent;border:none;display:block;margin:4px;min-width:160px;text-align:left}.sky-dropdown-item.sky-dropdown-item-active a,.sky-dropdown-item.sky-dropdown-item-active button,.sky-dropdown-item:hover a,.sky-dropdown-item:hover button{background-color:#eeeeef}.sky-dropdown-item button[disabled],.sky-dropdown-item a[disabled]{cursor:default}.sky-dropdown-item button[disabled]:hover,.sky-dropdown-item a[disabled]:hover{background-color:transparent}.sky-dropdown-item>a,.sky-dropdown-item>button{background-color:transparent;border:none;color:#212327;cursor:pointer;display:block;padding:3px 20px;text-align:left;width:100%}.sky-dropdown-item>a:hover,.sky-dropdown-item>button:hover{text-decoration:none}.sky-dropdown-item>a[disabled],.sky-dropdown-item>button[disabled]{color:#686c73}.sky-dropdown-item>a[disabled]:hover,.sky-dropdown-item>button[disabled]:hover{cursor:default}.sky-theme-modern .sky-dropdown-item{margin:0}.sky-theme-modern .sky-dropdown-item.sky-dropdown-item-active,.sky-theme-modern .sky-dropdown-item:hover{background-color:transparent}.sky-theme-modern .sky-dropdown-item>a,.sky-theme-modern .sky-dropdown-item>button{padding:10px 20px;border-radius:6px;transition:box-shadow .15s}.sky-theme-modern .sky-dropdown-item>a:hover,.sky-theme-modern .sky-dropdown-item>button:hover{outline:solid 1px #1870B8;outline-offset:-1px}.sky-theme-modern .sky-dropdown-item>a:focus-visible,.sky-theme-modern .sky-dropdown-item>a:active,.sky-theme-modern .sky-dropdown-item>button:focus-visible,.sky-theme-modern .sky-dropdown-item>button:active{outline:solid 2px #1870B8;outline-offset:-2px}.sky-theme-modern .sky-dropdown-item>a:focus-visible:not(:active),.sky-theme-modern .sky-dropdown-item>button:focus-visible:not(:active){box-shadow:0 1px 8px #0000004d}.sky-theme-modern.sky-theme-mode-dark .sky-dropdown-item>a,.sky-theme-modern.sky-theme-mode-dark .sky-dropdown-item>button{color:#fbfcfe}\n"] }]
|
|
65
|
+
}], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i0.ChangeDetectorRef }, { type: i0.Renderer2 }]; }, propDecorators: { ariaRole: [{
|
|
66
|
+
type: Input
|
|
67
|
+
}] } });
|
|
68
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHJvcGRvd24taXRlbS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL2NvbXBvbmVudHMvcG9wb3ZlcnMvc3JjL2xpYi9tb2R1bGVzL2Ryb3Bkb3duL2Ryb3Bkb3duLWl0ZW0uY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9jb21wb25lbnRzL3BvcG92ZXJzL3NyYy9saWIvbW9kdWxlcy9kcm9wZG93bi9kcm9wZG93bi1pdGVtLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFFTCx1QkFBdUIsRUFFdkIsU0FBUyxFQUVULEtBQUssRUFFTCxpQkFBaUIsR0FDbEIsTUFBTSxlQUFlLENBQUM7OztBQUV2Qjs7R0FFRztBQVFILE1BQU0sT0FBTyx3QkFBd0I7SUFDbkM7Ozs7Ozs7T0FPRztJQUNILElBQ1csUUFBUSxDQUFDLEtBQXlCO1FBQzNDLElBQUksQ0FBQyxVQUFVLEdBQUcsS0FBSyxJQUFJLFVBQVUsQ0FBQztJQUN4QyxDQUFDO0lBRUQsSUFBVyxRQUFRO1FBQ2pCLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQztJQUN6QixDQUFDO0lBSUQsVUFBVSxDQUFjO0lBRXhCLGVBQWUsQ0FBb0I7SUFDbkMsU0FBUyxDQUFZO0lBRXJCLFlBQ1MsVUFBc0IsRUFDN0IsY0FBaUMsRUFDakMsUUFBbUI7UUFGWixlQUFVLEdBQVYsVUFBVSxDQUFZO1FBUnhCLGFBQVEsR0FBRyxLQUFLLENBQUM7UUFFeEIsZUFBVSxHQUFHLFVBQVUsQ0FBQztRQVV0QixJQUFJLENBQUMsZUFBZSxHQUFHLGNBQWMsQ0FBQztRQUN0QyxJQUFJLENBQUMsU0FBUyxHQUFHLFFBQVEsQ0FBQztJQUM1QixDQUFDO0lBRU0sZUFBZTtRQUNwQiwwQ0FBMEM7UUFDMUMsTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7UUFDL0MsMEJBQTBCO1FBQzFCLElBQUksYUFBYSxFQUFFO1lBQ2pCLElBQUksQ0FBQyxTQUFTLENBQUMsWUFBWSxDQUFDLGFBQWEsRUFBRSxVQUFVLEVBQUUsR0FBRyxDQUFDLENBQUM7U0FDN0Q7UUFFRCxJQUFJLENBQUMsZUFBZSxDQUFDLGFBQWEsRUFBRSxDQUFDO0lBQ3ZDLENBQUM7SUFFTSxZQUFZLENBQUMsaUJBQTBCO1FBQzVDLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDO1FBRXJCLElBQUksaUJBQWlCLEVBQUU7WUFDckIsSUFBSSxDQUFDLGlCQUFpQixFQUFFLEVBQUUsS0FBSyxFQUFFLENBQUM7U0FDbkM7UUFFRCxJQUFJLENBQUMsZUFBZSxDQUFDLGFBQWEsRUFBRSxDQUFDO0lBQ3ZDLENBQUM7SUFFTSxXQUFXO1FBQ2hCLE1BQU0sV0FBVyxHQUNmLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxFQUFFLFlBQVksQ0FBQyxVQUFVLENBQUMsS0FBSyxJQUFJLENBQUM7UUFDOUQsT0FBTyxXQUFXLENBQUM7SUFDckIsQ0FBQztJQUVNLFVBQVU7UUFDZixJQUFJLENBQUMsUUFBUSxHQUFHLEtBQUssQ0FBQztRQUN0QixJQUFJLENBQUMsZUFBZSxDQUFDLFlBQVksRUFBRSxDQUFDO0lBQ3RDLENBQUM7SUFFRCxpQkFBaUI7UUFDZixPQUFPLElBQUksQ0FBQyxVQUFVLENBQUMsYUFBYSxDQUFDLGFBQWEsQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUNqRSxDQUFDOzhHQXBFVSx3QkFBd0I7a0dBQXhCLHdCQUF3QiwyRkNyQnJDLDhLQVNBOzsyRkRZYSx3QkFBd0I7a0JBUHBDLFNBQVM7K0JBQ0UsbUJBQW1CLG1CQUdaLHVCQUF1QixDQUFDLE1BQU0saUJBQ2hDLGlCQUFpQixDQUFDLElBQUk7eUpBWTFCLFFBQVE7c0JBRGxCLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBBZnRlclZpZXdJbml0LFxuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gIENvbXBvbmVudCxcbiAgRWxlbWVudFJlZixcbiAgSW5wdXQsXG4gIFJlbmRlcmVyMixcbiAgVmlld0VuY2Fwc3VsYXRpb24sXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG4vKipcbiAqIFNwZWNpZmllcyB0aGUgaXRlbXMgdG8gZGlzcGxheSBvbiB0aGUgZHJvcGRvd24gbWVudS5cbiAqL1xuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnc2t5LWRyb3Bkb3duLWl0ZW0nLFxuICB0ZW1wbGF0ZVVybDogJy4vZHJvcGRvd24taXRlbS5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2Ryb3Bkb3duLWl0ZW0uY29tcG9uZW50LnNjc3MnXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmUsXG59KVxuZXhwb3J0IGNsYXNzIFNreURyb3Bkb3duSXRlbUNvbXBvbmVudCBpbXBsZW1lbnRzIEFmdGVyVmlld0luaXQge1xuICAvKipcbiAgICogVGhlIEFSSUEgcm9sZSBmb3IgdGhlIGRyb3Bkb3duIG1lbnUgaXRlbVxuICAgKiBbdG8gc3VwcG9ydCBhY2Nlc3NpYmlsaXR5XShodHRwczovL2RldmVsb3Blci5ibGFja2JhdWQuY29tL3NreXV4L2xlYXJuL2FjY2Vzc2liaWxpdHkpXG4gICAqIGJ5IGluZGljYXRpbmcgaG93IHRoZSBpdGVtIGZ1bmN0aW9ucyBhbmQgd2hhdCBpdCBjb250cm9scy4gRm9yIGluZm9ybWF0aW9uIGFib3V0XG4gICAqIGhvdyBhbiBBUklBIHJvbGUgaW5kaWNhdGVzIHdoYXQgYW4gaXRlbSByZXByZXNlbnRzIG9uIGEgd2ViIHBhZ2UsIHNlZSB0aGVcbiAgICogW1dBSS1BUklBIHJvbGVzIG1vZGVsXShodHRwczovL3d3dy53My5vcmcvV0FJL1BGL2FyaWEvI3JvbGVzKS5cbiAgICogQGRlZmF1bHQgXCJtZW51aXRlbVwiXG4gICAqL1xuICBASW5wdXQoKVxuICBwdWJsaWMgc2V0IGFyaWFSb2xlKHZhbHVlOiBzdHJpbmcgfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLiNfYXJpYVJvbGUgPSB2YWx1ZSA/PyAnbWVudWl0ZW0nO1xuICB9XG5cbiAgcHVibGljIGdldCBhcmlhUm9sZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLiNfYXJpYVJvbGU7XG4gIH1cblxuICBwdWJsaWMgaXNBY3RpdmUgPSBmYWxzZTtcblxuICAjX2FyaWFSb2xlID0gJ21lbnVpdGVtJztcblxuICAjY2hhbmdlRGV0ZWN0b3I6IENoYW5nZURldGVjdG9yUmVmO1xuICAjcmVuZGVyZXI6IFJlbmRlcmVyMjtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMgZWxlbWVudFJlZjogRWxlbWVudFJlZixcbiAgICBjaGFuZ2VEZXRlY3RvcjogQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgcmVuZGVyZXI6IFJlbmRlcmVyMlxuICApIHtcbiAgICB0aGlzLiNjaGFuZ2VEZXRlY3RvciA9IGNoYW5nZURldGVjdG9yO1xuICAgIHRoaXMuI3JlbmRlcmVyID0gcmVuZGVyZXI7XG4gIH1cblxuICBwdWJsaWMgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xuICAgIC8vIE1ha2Ugc3VyZSBhbmNob3IgZWxlbWVudHMgYXJlIHRhYi1hYmxlLlxuICAgIGNvbnN0IGJ1dHRvbkVsZW1lbnQgPSB0aGlzLiNnZXRCdXR0b25FbGVtZW50KCk7XG4gICAgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cbiAgICBpZiAoYnV0dG9uRWxlbWVudCkge1xuICAgICAgdGhpcy4jcmVuZGVyZXIuc2V0QXR0cmlidXRlKGJ1dHRvbkVsZW1lbnQsICd0YWJJbmRleCcsICcwJyk7XG4gICAgfVxuXG4gICAgdGhpcy4jY2hhbmdlRGV0ZWN0b3IuZGV0ZWN0Q2hhbmdlcygpO1xuICB9XG5cbiAgcHVibGljIGZvY3VzRWxlbWVudChlbmFibGVOYXRpdmVGb2N1czogYm9vbGVhbik6IHZvaWQge1xuICAgIHRoaXMuaXNBY3RpdmUgPSB0cnVlO1xuXG4gICAgaWYgKGVuYWJsZU5hdGl2ZUZvY3VzKSB7XG4gICAgICB0aGlzLiNnZXRCdXR0b25FbGVtZW50KCk/LmZvY3VzKCk7XG4gICAgfVxuXG4gICAgdGhpcy4jY2hhbmdlRGV0ZWN0b3IuZGV0ZWN0Q2hhbmdlcygpO1xuICB9XG5cbiAgcHVibGljIGlzRm9jdXNhYmxlKCk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGlzRm9jdXNhYmxlID1cbiAgICAgIHRoaXMuI2dldEJ1dHRvbkVsZW1lbnQoKT8uZ2V0QXR0cmlidXRlKCdkaXNhYmxlZCcpID09PSBudWxsO1xuICAgIHJldHVybiBpc0ZvY3VzYWJsZTtcbiAgfVxuXG4gIHB1YmxpYyByZXNldFN0YXRlKCk6IHZvaWQge1xuICAgIHRoaXMuaXNBY3RpdmUgPSBmYWxzZTtcbiAgICB0aGlzLiNjaGFuZ2VEZXRlY3Rvci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gICNnZXRCdXR0b25FbGVtZW50KCk6IEhUTUxCdXR0b25FbGVtZW50IHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJ2J1dHRvbixhJyk7XG4gIH1cbn1cbiIsIjxkaXZcbiAgY2xhc3M9XCJza3ktZHJvcGRvd24taXRlbVwiXG4gIFthdHRyLnJvbGVdPVwiYXJpYVJvbGVcIlxuICBbbmdDbGFzc109XCJ7XG4gICAgJ3NreS1kcm9wZG93bi1pdGVtLWFjdGl2ZSc6IGlzQWN0aXZlXG4gIH1cIlxuPlxuICA8bmctY29udGVudD4gPC9uZy1jb250ZW50PlxuPC9kaXY+XG4iXX0=
|
|
@@ -0,0 +1,314 @@
|
|
|
1
|
+
import { ChangeDetectionStrategy, Component, ContentChildren, EventEmitter, Input, Optional, Output, ViewEncapsulation, } from '@angular/core';
|
|
2
|
+
import { Subject, fromEvent as observableFromEvent } from 'rxjs';
|
|
3
|
+
import { takeUntil } from 'rxjs/operators';
|
|
4
|
+
import { SkyDropdownItemComponent } from './dropdown-item.component';
|
|
5
|
+
import { SkyDropdownMessageType } from './types/dropdown-message-type';
|
|
6
|
+
import * as i0 from "@angular/core";
|
|
7
|
+
import * as i1 from "./dropdown.component";
|
|
8
|
+
let nextId = 0;
|
|
9
|
+
/**
|
|
10
|
+
* Creates a menu that contains dropdown menu items.
|
|
11
|
+
*
|
|
12
|
+
*/
|
|
13
|
+
export class SkyDropdownMenuComponent {
|
|
14
|
+
/**
|
|
15
|
+
* The ARIA role for the dropdown menu
|
|
16
|
+
* [to support accessibility](https://developer.blackbaud.com/skyux/learn/accessibility)
|
|
17
|
+
* by indicating how the dropdown menu functions and what it controls. The dropdown button
|
|
18
|
+
* inherits this value to set its `aria-haspopup` property. For information
|
|
19
|
+
* about how an ARIA role indicates what an item represents on a web page, see the
|
|
20
|
+
* [WAI-ARIA roles model](https://www.w3.org/WAI/PF/aria/#roles).
|
|
21
|
+
* @default "menu"
|
|
22
|
+
*/
|
|
23
|
+
set ariaRole(value) {
|
|
24
|
+
this.#_ariaRole = value ?? 'menu';
|
|
25
|
+
}
|
|
26
|
+
get ariaRole() {
|
|
27
|
+
return this.#_ariaRole;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Whether to use the browser's native focus function when users navigate through menu
|
|
31
|
+
* items with the keyboard. To disable the native focus function, set this property to `false`.
|
|
32
|
+
* For example, to let users interact with the dropdown menu but keep the keyboard focus on a
|
|
33
|
+
* different element, set this property to `false`.
|
|
34
|
+
* @default true
|
|
35
|
+
* @internal
|
|
36
|
+
*/
|
|
37
|
+
set useNativeFocus(value) {
|
|
38
|
+
this.#_useNativeFocus = value ?? true;
|
|
39
|
+
}
|
|
40
|
+
get useNativeFocus() {
|
|
41
|
+
return this.#_useNativeFocus;
|
|
42
|
+
}
|
|
43
|
+
set menuIndex(value) {
|
|
44
|
+
if (value < 0) {
|
|
45
|
+
value = this.menuItems.length - 1;
|
|
46
|
+
}
|
|
47
|
+
if (value >= this.menuItems.length) {
|
|
48
|
+
value = 0;
|
|
49
|
+
}
|
|
50
|
+
this.#_menuIndex = value;
|
|
51
|
+
}
|
|
52
|
+
get menuIndex() {
|
|
53
|
+
return this.#_menuIndex;
|
|
54
|
+
}
|
|
55
|
+
#ngUnsubscribe;
|
|
56
|
+
#_ariaRole;
|
|
57
|
+
#_menuIndex;
|
|
58
|
+
#_useNativeFocus;
|
|
59
|
+
#changeDetector;
|
|
60
|
+
#elementRef;
|
|
61
|
+
#dropdownComponent;
|
|
62
|
+
constructor(changeDetector, elementRef, dropdownComponent) {
|
|
63
|
+
/**
|
|
64
|
+
* Fires when the dropdown menu's active index or selected item changes. This event provides an
|
|
65
|
+
* observable to emit changes, and the response is of
|
|
66
|
+
* the SkyDropdownMenuChange type.
|
|
67
|
+
* @internal
|
|
68
|
+
*/
|
|
69
|
+
this.menuChanges = new EventEmitter();
|
|
70
|
+
this.dropdownMenuId = `sky-dropdown-menu-${++nextId}`;
|
|
71
|
+
this.#ngUnsubscribe = new Subject();
|
|
72
|
+
this.#_ariaRole = 'menu';
|
|
73
|
+
this.#_menuIndex = 0;
|
|
74
|
+
this.#_useNativeFocus = true;
|
|
75
|
+
this.#changeDetector = changeDetector;
|
|
76
|
+
this.#elementRef = elementRef;
|
|
77
|
+
this.#dropdownComponent = dropdownComponent;
|
|
78
|
+
}
|
|
79
|
+
ngAfterContentInit() {
|
|
80
|
+
/* istanbul ignore else */
|
|
81
|
+
if (this.#dropdownComponent) {
|
|
82
|
+
this.#dropdownComponent.menuId = this.dropdownMenuId;
|
|
83
|
+
this.#dropdownComponent.menuAriaRole = this.ariaRole;
|
|
84
|
+
this.#dropdownComponent.messageStream
|
|
85
|
+
?.pipe(takeUntil(this.#ngUnsubscribe))
|
|
86
|
+
.subscribe((message) => {
|
|
87
|
+
switch (message.type) {
|
|
88
|
+
case SkyDropdownMessageType.Open:
|
|
89
|
+
case SkyDropdownMessageType.Close:
|
|
90
|
+
this.reset();
|
|
91
|
+
break;
|
|
92
|
+
case SkyDropdownMessageType.FocusFirstItem:
|
|
93
|
+
this.focusFirstItem();
|
|
94
|
+
break;
|
|
95
|
+
case SkyDropdownMessageType.FocusNextItem:
|
|
96
|
+
this.focusNextItem();
|
|
97
|
+
break;
|
|
98
|
+
case SkyDropdownMessageType.FocusPreviousItem:
|
|
99
|
+
this.focusPreviousItem();
|
|
100
|
+
break;
|
|
101
|
+
case SkyDropdownMessageType.FocusLastItem:
|
|
102
|
+
this.focusLastItem();
|
|
103
|
+
break;
|
|
104
|
+
}
|
|
105
|
+
});
|
|
106
|
+
this.menuChanges
|
|
107
|
+
.pipe(takeUntil(this.#ngUnsubscribe))
|
|
108
|
+
.subscribe((change) => {
|
|
109
|
+
// Close the dropdown when a menu item is selected.
|
|
110
|
+
if (change.selectedItem) {
|
|
111
|
+
this.#sendMessage(SkyDropdownMessageType.Close);
|
|
112
|
+
this.#sendMessage(SkyDropdownMessageType.FocusTriggerButton);
|
|
113
|
+
}
|
|
114
|
+
if (change.items) {
|
|
115
|
+
// Update the popover style and position whenever the number of items changes.
|
|
116
|
+
this.#sendMessage(SkyDropdownMessageType.Reposition);
|
|
117
|
+
}
|
|
118
|
+
});
|
|
119
|
+
}
|
|
120
|
+
// Reset dropdown whenever the menu items change.
|
|
121
|
+
this.menuItems.changes
|
|
122
|
+
.pipe(takeUntil(this.#ngUnsubscribe))
|
|
123
|
+
.subscribe((items) => {
|
|
124
|
+
this.reset();
|
|
125
|
+
this.menuChanges.emit({
|
|
126
|
+
items: items.toArray(),
|
|
127
|
+
});
|
|
128
|
+
});
|
|
129
|
+
this.#addEventListeners();
|
|
130
|
+
}
|
|
131
|
+
ngOnDestroy() {
|
|
132
|
+
this.#ngUnsubscribe.next();
|
|
133
|
+
this.#ngUnsubscribe.complete();
|
|
134
|
+
}
|
|
135
|
+
focusFirstItem() {
|
|
136
|
+
if (!this.#hasFocusableItems()) {
|
|
137
|
+
return;
|
|
138
|
+
}
|
|
139
|
+
this.menuIndex = 0;
|
|
140
|
+
const firstItem = this.#getItemByIndex(this.menuIndex);
|
|
141
|
+
if (firstItem && firstItem.isFocusable()) {
|
|
142
|
+
this.#focusItem(firstItem);
|
|
143
|
+
}
|
|
144
|
+
else {
|
|
145
|
+
this.focusNextItem();
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
focusLastItem() {
|
|
149
|
+
if (!this.#hasFocusableItems()) {
|
|
150
|
+
return;
|
|
151
|
+
}
|
|
152
|
+
this.menuIndex = this.menuItems.length - 1;
|
|
153
|
+
const lastItem = this.#getItemByIndex(this.menuIndex);
|
|
154
|
+
if (lastItem && lastItem.isFocusable()) {
|
|
155
|
+
this.#focusItem(lastItem);
|
|
156
|
+
}
|
|
157
|
+
else {
|
|
158
|
+
this.focusPreviousItem();
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
focusPreviousItem() {
|
|
162
|
+
if (!this.#hasFocusableItems()) {
|
|
163
|
+
return;
|
|
164
|
+
}
|
|
165
|
+
this.menuIndex--;
|
|
166
|
+
const previousItem = this.#getItemByIndex(this.menuIndex);
|
|
167
|
+
if (previousItem && previousItem.isFocusable()) {
|
|
168
|
+
this.#focusItem(previousItem);
|
|
169
|
+
}
|
|
170
|
+
else {
|
|
171
|
+
this.focusPreviousItem();
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
focusNextItem() {
|
|
175
|
+
if (!this.#hasFocusableItems()) {
|
|
176
|
+
return;
|
|
177
|
+
}
|
|
178
|
+
this.menuIndex++;
|
|
179
|
+
const nextItem = this.#getItemByIndex(this.menuIndex);
|
|
180
|
+
if (nextItem && nextItem.isFocusable()) {
|
|
181
|
+
this.#focusItem(nextItem);
|
|
182
|
+
}
|
|
183
|
+
else {
|
|
184
|
+
this.focusNextItem();
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
reset() {
|
|
188
|
+
this.#_menuIndex = -1;
|
|
189
|
+
this.#resetItemsActiveState();
|
|
190
|
+
this.#changeDetector.markForCheck();
|
|
191
|
+
}
|
|
192
|
+
#resetItemsActiveState() {
|
|
193
|
+
this.menuItems.forEach((item) => {
|
|
194
|
+
item.resetState();
|
|
195
|
+
});
|
|
196
|
+
}
|
|
197
|
+
#focusItem(item) {
|
|
198
|
+
this.#resetItemsActiveState();
|
|
199
|
+
item.focusElement(this.useNativeFocus);
|
|
200
|
+
this.menuChanges.emit({
|
|
201
|
+
activeIndex: this.menuIndex,
|
|
202
|
+
});
|
|
203
|
+
}
|
|
204
|
+
#getItemByIndex(index) {
|
|
205
|
+
return this.menuItems.find((_, i) => i === index);
|
|
206
|
+
}
|
|
207
|
+
#selectItemByEventTarget(target) {
|
|
208
|
+
const selectedItem = this.menuItems.find((item, i) => {
|
|
209
|
+
const found = item.elementRef.nativeElement.contains(target);
|
|
210
|
+
if (found) {
|
|
211
|
+
this.menuIndex = i;
|
|
212
|
+
this.menuChanges.next({
|
|
213
|
+
activeIndex: this.menuIndex,
|
|
214
|
+
});
|
|
215
|
+
}
|
|
216
|
+
return found;
|
|
217
|
+
});
|
|
218
|
+
/* istanbul ignore else */
|
|
219
|
+
if (selectedItem) {
|
|
220
|
+
this.menuChanges.next({
|
|
221
|
+
selectedItem,
|
|
222
|
+
});
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
#sendMessage(type) {
|
|
226
|
+
this.#dropdownComponent?.messageStream?.next({ type });
|
|
227
|
+
}
|
|
228
|
+
#addEventListeners() {
|
|
229
|
+
const dropdownMenuElement = this.#elementRef.nativeElement;
|
|
230
|
+
observableFromEvent(dropdownMenuElement, 'click')
|
|
231
|
+
.pipe(takeUntil(this.#ngUnsubscribe))
|
|
232
|
+
.subscribe((event) => {
|
|
233
|
+
this.#selectItemByEventTarget(event.target);
|
|
234
|
+
});
|
|
235
|
+
observableFromEvent(dropdownMenuElement, 'keydown')
|
|
236
|
+
.pipe(takeUntil(this.#ngUnsubscribe))
|
|
237
|
+
.subscribe((event) => {
|
|
238
|
+
const key = event.key.toLowerCase();
|
|
239
|
+
switch (key) {
|
|
240
|
+
case 'escape':
|
|
241
|
+
this.#sendMessage(SkyDropdownMessageType.Close);
|
|
242
|
+
this.#sendMessage(SkyDropdownMessageType.FocusTriggerButton);
|
|
243
|
+
event.stopPropagation();
|
|
244
|
+
event.preventDefault();
|
|
245
|
+
break;
|
|
246
|
+
case 'arrowdown':
|
|
247
|
+
case 'down':
|
|
248
|
+
this.focusNextItem();
|
|
249
|
+
event.preventDefault();
|
|
250
|
+
break;
|
|
251
|
+
case 'arrowup':
|
|
252
|
+
case 'up':
|
|
253
|
+
this.focusPreviousItem();
|
|
254
|
+
event.preventDefault();
|
|
255
|
+
break;
|
|
256
|
+
case 'tab':
|
|
257
|
+
if (this.#dropdownComponent?.dismissOnBlur) {
|
|
258
|
+
this.#sendMessage(SkyDropdownMessageType.Close);
|
|
259
|
+
}
|
|
260
|
+
this.#sendMessage(SkyDropdownMessageType.FocusTriggerButton);
|
|
261
|
+
break;
|
|
262
|
+
}
|
|
263
|
+
});
|
|
264
|
+
observableFromEvent(dropdownMenuElement, 'mouseenter')
|
|
265
|
+
.pipe(takeUntil(this.#ngUnsubscribe))
|
|
266
|
+
.subscribe(() => {
|
|
267
|
+
/* istanbul ignore else */
|
|
268
|
+
if (this.#dropdownComponent) {
|
|
269
|
+
this.#dropdownComponent.isMouseEnter = true;
|
|
270
|
+
}
|
|
271
|
+
});
|
|
272
|
+
observableFromEvent(dropdownMenuElement, 'mouseleave')
|
|
273
|
+
.pipe(takeUntil(this.#ngUnsubscribe))
|
|
274
|
+
.subscribe(() => {
|
|
275
|
+
/* istanbul ignore else */
|
|
276
|
+
if (this.#dropdownComponent) {
|
|
277
|
+
this.#dropdownComponent.isMouseEnter = false;
|
|
278
|
+
// Allow the dropdown component to set isMouseEnter before checking if the close action
|
|
279
|
+
// should be taken.
|
|
280
|
+
setTimeout(() => {
|
|
281
|
+
if (this.#dropdownComponent &&
|
|
282
|
+
this.#dropdownComponent.trigger === 'hover' &&
|
|
283
|
+
this.#dropdownComponent.isMouseEnter === false) {
|
|
284
|
+
this.#sendMessage(SkyDropdownMessageType.Close);
|
|
285
|
+
}
|
|
286
|
+
});
|
|
287
|
+
}
|
|
288
|
+
});
|
|
289
|
+
}
|
|
290
|
+
#hasFocusableItems() {
|
|
291
|
+
const found = this.menuItems.find((item) => item.isFocusable());
|
|
292
|
+
return found !== undefined;
|
|
293
|
+
}
|
|
294
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: SkyDropdownMenuComponent, deps: [{ token: i0.ChangeDetectorRef }, { token: i0.ElementRef }, { token: i1.SkyDropdownComponent, optional: true }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
295
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: SkyDropdownMenuComponent, selector: "sky-dropdown-menu", inputs: { ariaLabelledBy: "ariaLabelledBy", ariaRole: "ariaRole", useNativeFocus: "useNativeFocus" }, outputs: { menuChanges: "menuChanges" }, queries: [{ propertyName: "menuItems", predicate: SkyDropdownItemComponent, descendants: true }], ngImport: i0, template: "<div\n class=\"sky-dropdown-menu sky-shadow sky-elevation-4\"\n [attr.aria-labelledby]=\"ariaLabelledBy\"\n [attr.role]=\"ariaRole\"\n [id]=\"dropdownMenuId\"\n>\n <ng-content> </ng-content>\n</div>\n", styles: [".sky-dropdown-menu{overflow-y:auto;overflow-x:hidden;min-height:35px;max-height:calc(50vh - 50px);display:flex;flex-direction:column;background-color:#fff}.sky-dropdown-menu button{overflow:hidden;text-overflow:ellipsis}.sky-theme-modern .sky-dropdown-menu{border-radius:6px;padding:10px 0}.sky-theme-modern.sky-theme-mode-dark .sky-dropdown-menu{background-color:#252a2e;color:#fff}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
|
|
296
|
+
}
|
|
297
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: SkyDropdownMenuComponent, decorators: [{
|
|
298
|
+
type: Component,
|
|
299
|
+
args: [{ selector: 'sky-dropdown-menu', changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, template: "<div\n class=\"sky-dropdown-menu sky-shadow sky-elevation-4\"\n [attr.aria-labelledby]=\"ariaLabelledBy\"\n [attr.role]=\"ariaRole\"\n [id]=\"dropdownMenuId\"\n>\n <ng-content> </ng-content>\n</div>\n", styles: [".sky-dropdown-menu{overflow-y:auto;overflow-x:hidden;min-height:35px;max-height:calc(50vh - 50px);display:flex;flex-direction:column;background-color:#fff}.sky-dropdown-menu button{overflow:hidden;text-overflow:ellipsis}.sky-theme-modern .sky-dropdown-menu{border-radius:6px;padding:10px 0}.sky-theme-modern.sky-theme-mode-dark .sky-dropdown-menu{background-color:#252a2e;color:#fff}\n"] }]
|
|
300
|
+
}], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }, { type: i0.ElementRef }, { type: i1.SkyDropdownComponent, decorators: [{
|
|
301
|
+
type: Optional
|
|
302
|
+
}] }]; }, propDecorators: { ariaLabelledBy: [{
|
|
303
|
+
type: Input
|
|
304
|
+
}], ariaRole: [{
|
|
305
|
+
type: Input
|
|
306
|
+
}], useNativeFocus: [{
|
|
307
|
+
type: Input
|
|
308
|
+
}], menuChanges: [{
|
|
309
|
+
type: Output
|
|
310
|
+
}], menuItems: [{
|
|
311
|
+
type: ContentChildren,
|
|
312
|
+
args: [SkyDropdownItemComponent, { descendants: true }]
|
|
313
|
+
}] } });
|
|
314
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHJvcGRvd24tbWVudS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL2NvbXBvbmVudHMvcG9wb3ZlcnMvc3JjL2xpYi9tb2R1bGVzL2Ryb3Bkb3duL2Ryb3Bkb3duLW1lbnUuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9jb21wb25lbnRzL3BvcG92ZXJzL3NyYy9saWIvbW9kdWxlcy9kcm9wZG93bi9kcm9wZG93bi1tZW51LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFFTCx1QkFBdUIsRUFFdkIsU0FBUyxFQUNULGVBQWUsRUFFZixZQUFZLEVBQ1osS0FBSyxFQUVMLFFBQVEsRUFDUixNQUFNLEVBRU4saUJBQWlCLEdBQ2xCLE1BQU0sZUFBZSxDQUFDO0FBRXZCLE9BQU8sRUFBRSxPQUFPLEVBQUUsU0FBUyxJQUFJLG1CQUFtQixFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ2pFLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUUzQyxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUlyRSxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQzs7O0FBRXZFLElBQUksTUFBTSxHQUFHLENBQUMsQ0FBQztBQUNmOzs7R0FHRztBQVFILE1BQU0sT0FBTyx3QkFBd0I7SUFVbkM7Ozs7Ozs7O09BUUc7SUFDSCxJQUNXLFFBQVEsQ0FBQyxLQUF5QjtRQUMzQyxJQUFJLENBQUMsVUFBVSxHQUFHLEtBQUssSUFBSSxNQUFNLENBQUM7SUFDcEMsQ0FBQztJQUVELElBQVcsUUFBUTtRQUNqQixPQUFPLElBQUksQ0FBQyxVQUFVLENBQUM7SUFDekIsQ0FBQztJQUVEOzs7Ozs7O09BT0c7SUFDSCxJQUNXLGNBQWMsQ0FBQyxLQUEwQjtRQUNsRCxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsS0FBSyxJQUFJLElBQUksQ0FBQztJQUN4QyxDQUFDO0lBRUQsSUFBVyxjQUFjO1FBQ3ZCLE9BQU8sSUFBSSxDQUFDLGdCQUFnQixDQUFDO0lBQy9CLENBQUM7SUFhRCxJQUFXLFNBQVMsQ0FBQyxLQUFhO1FBQ2hDLElBQUksS0FBSyxHQUFHLENBQUMsRUFBRTtZQUNiLEtBQUssR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7U0FDbkM7UUFFRCxJQUFJLEtBQUssSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sRUFBRTtZQUNsQyxLQUFLLEdBQUcsQ0FBQyxDQUFDO1NBQ1g7UUFFRCxJQUFJLENBQUMsV0FBVyxHQUFHLEtBQUssQ0FBQztJQUMzQixDQUFDO0lBRUQsSUFBVyxTQUFTO1FBQ2xCLE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQztJQUMxQixDQUFDO0lBS0QsY0FBYyxDQUF1QjtJQUVyQyxVQUFVLENBQVU7SUFFcEIsV0FBVyxDQUFLO0lBRWhCLGdCQUFnQixDQUFRO0lBRXhCLGVBQWUsQ0FBb0I7SUFDbkMsV0FBVyxDQUFhO0lBQ3hCLGtCQUFrQixDQUFtQztJQUVyRCxZQUNFLGNBQWlDLEVBQ2pDLFVBQXNCLEVBQ1YsaUJBQXdDO1FBN0N0RDs7Ozs7V0FLRztRQUVJLGdCQUFXLEdBQUcsSUFBSSxZQUFZLEVBQXlCLENBQUM7UUFFeEQsbUJBQWMsR0FBRyxxQkFBcUIsRUFBRSxNQUFNLEVBQUUsQ0FBQztRQXFCeEQsbUJBQWMsR0FBRyxJQUFJLE9BQU8sRUFBUSxDQUFDO1FBRXJDLGVBQVUsR0FBRyxNQUFNLENBQUM7UUFFcEIsZ0JBQVcsR0FBRyxDQUFDLENBQUM7UUFFaEIscUJBQWdCLEdBQUcsSUFBSSxDQUFDO1FBV3RCLElBQUksQ0FBQyxlQUFlLEdBQUcsY0FBYyxDQUFDO1FBQ3RDLElBQUksQ0FBQyxXQUFXLEdBQUcsVUFBVSxDQUFDO1FBQzlCLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxpQkFBaUIsQ0FBQztJQUM5QyxDQUFDO0lBRU0sa0JBQWtCO1FBQ3ZCLDBCQUEwQjtRQUMxQixJQUFJLElBQUksQ0FBQyxrQkFBa0IsRUFBRTtZQUMzQixJQUFJLENBQUMsa0JBQWtCLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUM7WUFDckQsSUFBSSxDQUFDLGtCQUFrQixDQUFDLFlBQVksR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDO1lBRXJELElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxhQUFhO2dCQUNuQyxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDO2lCQUNyQyxTQUFTLENBQUMsQ0FBQyxPQUEyQixFQUFFLEVBQUU7Z0JBQ3pDLFFBQVEsT0FBTyxDQUFDLElBQUksRUFBRTtvQkFDcEIsS0FBSyxzQkFBc0IsQ0FBQyxJQUFJLENBQUM7b0JBQ2pDLEtBQUssc0JBQXNCLENBQUMsS0FBSzt3QkFDL0IsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO3dCQUNiLE1BQU07b0JBRVIsS0FBSyxzQkFBc0IsQ0FBQyxjQUFjO3dCQUN4QyxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7d0JBQ3RCLE1BQU07b0JBRVIsS0FBSyxzQkFBc0IsQ0FBQyxhQUFhO3dCQUN2QyxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7d0JBQ3JCLE1BQU07b0JBRVIsS0FBSyxzQkFBc0IsQ0FBQyxpQkFBaUI7d0JBQzNDLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO3dCQUN6QixNQUFNO29CQUVSLEtBQUssc0JBQXNCLENBQUMsYUFBYTt3QkFDdkMsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO3dCQUNyQixNQUFNO2lCQUNUO1lBQ0gsQ0FBQyxDQUFDLENBQUM7WUFFTCxJQUFJLENBQUMsV0FBVztpQkFDYixJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQztpQkFDcEMsU0FBUyxDQUFDLENBQUMsTUFBNkIsRUFBRSxFQUFFO2dCQUMzQyxtREFBbUQ7Z0JBQ25ELElBQUksTUFBTSxDQUFDLFlBQVksRUFBRTtvQkFDdkIsSUFBSSxDQUFDLFlBQVksQ0FBQyxzQkFBc0IsQ0FBQyxLQUFLLENBQUMsQ0FBQztvQkFDaEQsSUFBSSxDQUFDLFlBQVksQ0FBQyxzQkFBc0IsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO2lCQUM5RDtnQkFFRCxJQUFJLE1BQU0sQ0FBQyxLQUFLLEVBQUU7b0JBQ2hCLDhFQUE4RTtvQkFDOUUsSUFBSSxDQUFDLFlBQVksQ0FBQyxzQkFBc0IsQ0FBQyxVQUFVLENBQUMsQ0FBQztpQkFDdEQ7WUFDSCxDQUFDLENBQUMsQ0FBQztTQUNOO1FBRUQsaURBQWlEO1FBQ2pELElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTzthQUNuQixJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQzthQUNwQyxTQUFTLENBQUMsQ0FBQyxLQUEwQyxFQUFFLEVBQUU7WUFDeEQsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ2IsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUM7Z0JBQ3BCLEtBQUssRUFBRSxLQUFLLENBQUMsT0FBTyxFQUFFO2FBQ3ZCLENBQUMsQ0FBQztRQUNMLENBQUMsQ0FBQyxDQUFDO1FBRUwsSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7SUFDNUIsQ0FBQztJQUVNLFdBQVc7UUFDaEIsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUMzQixJQUFJLENBQUMsY0FBYyxDQUFDLFFBQVEsRUFBRSxDQUFDO0lBQ2pDLENBQUM7SUFFTSxjQUFjO1FBQ25CLElBQUksQ0FBQyxJQUFJLENBQUMsa0JBQWtCLEVBQUUsRUFBRTtZQUM5QixPQUFPO1NBQ1I7UUFFRCxJQUFJLENBQUMsU0FBUyxHQUFHLENBQUMsQ0FBQztRQUVuQixNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUN2RCxJQUFJLFNBQVMsSUFBSSxTQUFTLENBQUMsV0FBVyxFQUFFLEVBQUU7WUFDeEMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsQ0FBQztTQUM1QjthQUFNO1lBQ0wsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1NBQ3RCO0lBQ0gsQ0FBQztJQUVNLGFBQWE7UUFDbEIsSUFBSSxDQUFDLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxFQUFFO1lBQzlCLE9BQU87U0FDUjtRQUVELElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO1FBRTNDLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ3RELElBQUksUUFBUSxJQUFJLFFBQVEsQ0FBQyxXQUFXLEVBQUUsRUFBRTtZQUN0QyxJQUFJLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1NBQzNCO2FBQU07WUFDTCxJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztTQUMxQjtJQUNILENBQUM7SUFFTSxpQkFBaUI7UUFDdEIsSUFBSSxDQUFDLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxFQUFFO1lBQzlCLE9BQU87U0FDUjtRQUVELElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztRQUVqQixNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUMxRCxJQUFJLFlBQVksSUFBSSxZQUFZLENBQUMsV0FBVyxFQUFFLEVBQUU7WUFDOUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxZQUFZLENBQUMsQ0FBQztTQUMvQjthQUFNO1lBQ0wsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7U0FDMUI7SUFDSCxDQUFDO0lBRU0sYUFBYTtRQUNsQixJQUFJLENBQUMsSUFBSSxDQUFDLGtCQUFrQixFQUFFLEVBQUU7WUFDOUIsT0FBTztTQUNSO1FBRUQsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO1FBRWpCLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ3RELElBQUksUUFBUSxJQUFJLFFBQVEsQ0FBQyxXQUFXLEVBQUUsRUFBRTtZQUN0QyxJQUFJLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1NBQzNCO2FBQU07WUFDTCxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7U0FDdEI7SUFDSCxDQUFDO0lBRU0sS0FBSztRQUNWLElBQUksQ0FBQyxXQUFXLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDdEIsSUFBSSxDQUFDLHNCQUFzQixFQUFFLENBQUM7UUFDOUIsSUFBSSxDQUFDLGVBQWUsQ0FBQyxZQUFZLEVBQUUsQ0FBQztJQUN0QyxDQUFDO0lBRUQsc0JBQXNCO1FBQ3BCLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBOEIsRUFBRSxFQUFFO1lBQ3hELElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUNwQixDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCxVQUFVLENBQUMsSUFBOEI7UUFDdkMsSUFBSSxDQUFDLHNCQUFzQixFQUFFLENBQUM7UUFDOUIsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUM7UUFDdkMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUM7WUFDcEIsV0FBVyxFQUFFLElBQUksQ0FBQyxTQUFTO1NBQzVCLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCxlQUFlLENBQUMsS0FBYTtRQUMzQixPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxLQUFLLEtBQUssQ0FBQyxDQUFDO0lBQ3BELENBQUM7SUFFRCx3QkFBd0IsQ0FBQyxNQUFtQjtRQUMxQyxNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FDdEMsQ0FBQyxJQUE4QixFQUFFLENBQVMsRUFBRSxFQUFFO1lBQzVDLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsYUFBYSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUU3RCxJQUFJLEtBQUssRUFBRTtnQkFDVCxJQUFJLENBQUMsU0FBUyxHQUFHLENBQUMsQ0FBQztnQkFDbkIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUM7b0JBQ3BCLFdBQVcsRUFBRSxJQUFJLENBQUMsU0FBUztpQkFDNUIsQ0FBQyxDQUFDO2FBQ0o7WUFFRCxPQUFPLEtBQUssQ0FBQztRQUNmLENBQUMsQ0FDRixDQUFDO1FBRUYsMEJBQTBCO1FBQzFCLElBQUksWUFBWSxFQUFFO1lBQ2hCLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDO2dCQUNwQixZQUFZO2FBQ2IsQ0FBQyxDQUFDO1NBQ0o7SUFDSCxDQUFDO0lBRUQsWUFBWSxDQUFDLElBQTRCO1FBQ3ZDLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxhQUFhLEVBQUUsSUFBSSxDQUFDLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztJQUN6RCxDQUFDO0lBRUQsa0JBQWtCO1FBQ2hCLE1BQU0sbUJBQW1CLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxhQUFhLENBQUM7UUFFM0QsbUJBQW1CLENBQWEsbUJBQW1CLEVBQUUsT0FBTyxDQUFDO2FBQzFELElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDO2FBQ3BDLFNBQVMsQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFO1lBQ25CLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxLQUFLLENBQUMsTUFBcUIsQ0FBQyxDQUFDO1FBQzdELENBQUMsQ0FBQyxDQUFDO1FBRUwsbUJBQW1CLENBQWdCLG1CQUFtQixFQUFFLFNBQVMsQ0FBQzthQUMvRCxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQzthQUNwQyxTQUFTLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRTtZQUNuQixNQUFNLEdBQUcsR0FBRyxLQUFLLENBQUMsR0FBRyxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBRXBDLFFBQVEsR0FBRyxFQUFFO2dCQUNYLEtBQUssUUFBUTtvQkFDWCxJQUFJLENBQUMsWUFBWSxDQUFDLHNCQUFzQixDQUFDLEtBQUssQ0FBQyxDQUFDO29CQUNoRCxJQUFJLENBQUMsWUFBWSxDQUFDLHNCQUFzQixDQUFDLGtCQUFrQixDQUFDLENBQUM7b0JBQzdELEtBQUssQ0FBQyxlQUFlLEVBQUUsQ0FBQztvQkFDeEIsS0FBSyxDQUFDLGNBQWMsRUFBRSxDQUFDO29CQUN2QixNQUFNO2dCQUVSLEtBQUssV0FBVyxDQUFDO2dCQUNqQixLQUFLLE1BQU07b0JBQ1QsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO29CQUNyQixLQUFLLENBQUMsY0FBYyxFQUFFLENBQUM7b0JBQ3ZCLE1BQU07Z0JBRVIsS0FBSyxTQUFTLENBQUM7Z0JBQ2YsS0FBSyxJQUFJO29CQUNQLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO29CQUN6QixLQUFLLENBQUMsY0FBYyxFQUFFLENBQUM7b0JBQ3ZCLE1BQU07Z0JBRVIsS0FBSyxLQUFLO29CQUNSLElBQUksSUFBSSxDQUFDLGtCQUFrQixFQUFFLGFBQWEsRUFBRTt3QkFDMUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxzQkFBc0IsQ0FBQyxLQUFLLENBQUMsQ0FBQztxQkFDakQ7b0JBQ0QsSUFBSSxDQUFDLFlBQVksQ0FBQyxzQkFBc0IsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO29CQUM3RCxNQUFNO2FBQ1Q7UUFDSCxDQUFDLENBQUMsQ0FBQztRQUVMLG1CQUFtQixDQUFDLG1CQUFtQixFQUFFLFlBQVksQ0FBQzthQUNuRCxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQzthQUNwQyxTQUFTLENBQUMsR0FBRyxFQUFFO1lBQ2QsMEJBQTBCO1lBQzFCLElBQUksSUFBSSxDQUFDLGtCQUFrQixFQUFFO2dCQUMzQixJQUFJLENBQUMsa0JBQWtCLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQzthQUM3QztRQUNILENBQUMsQ0FBQyxDQUFDO1FBRUwsbUJBQW1CLENBQUMsbUJBQW1CLEVBQUUsWUFBWSxDQUFDO2FBQ25ELElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDO2FBQ3BDLFNBQVMsQ0FBQyxHQUFHLEVBQUU7WUFDZCwwQkFBMEI7WUFDMUIsSUFBSSxJQUFJLENBQUMsa0JBQWtCLEVBQUU7Z0JBQzNCLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxZQUFZLEdBQUcsS0FBSyxDQUFDO2dCQUM3Qyx1RkFBdUY7Z0JBQ3ZGLG1CQUFtQjtnQkFDbkIsVUFBVSxDQUFDLEdBQUcsRUFBRTtvQkFDZCxJQUNFLElBQUksQ0FBQyxrQkFBa0I7d0JBQ3ZCLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxPQUFPLEtBQUssT0FBTzt3QkFDM0MsSUFBSSxDQUFDLGtCQUFrQixDQUFDLFlBQVksS0FBSyxLQUFLLEVBQzlDO3dCQUNBLElBQUksQ0FBQyxZQUFZLENBQUMsc0JBQXNCLENBQUMsS0FBSyxDQUFDLENBQUM7cUJBQ2pEO2dCQUNILENBQUMsQ0FBQyxDQUFDO2FBQ0o7UUFDSCxDQUFDLENBQUMsQ0FBQztJQUNQLENBQUM7SUFFRCxrQkFBa0I7UUFDaEIsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDO1FBQ2hFLE9BQU8sS0FBSyxLQUFLLFNBQVMsQ0FBQztJQUM3QixDQUFDOzhHQWhXVSx3QkFBd0I7a0dBQXhCLHdCQUF3QixrT0F3RWxCLHdCQUF3QixnREM3RzNDLCtNQVFBOzsyRkQ2QmEsd0JBQXdCO2tCQVBwQyxTQUFTOytCQUNFLG1CQUFtQixtQkFHWix1QkFBdUIsQ0FBQyxNQUFNLGlCQUNoQyxpQkFBaUIsQ0FBQyxJQUFJOzswQkE0RmxDLFFBQVE7NENBbEZKLGNBQWM7c0JBRHBCLEtBQUs7Z0JBYUssUUFBUTtzQkFEbEIsS0FBSztnQkFrQkssY0FBYztzQkFEeEIsS0FBSztnQkFnQkMsV0FBVztzQkFEakIsTUFBTTtnQkFzQkEsU0FBUztzQkFEZixlQUFlO3VCQUFDLHdCQUF3QixFQUFFLEVBQUUsV0FBVyxFQUFFLElBQUksRUFBRSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIEFmdGVyQ29udGVudEluaXQsXG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgQ29tcG9uZW50LFxuICBDb250ZW50Q2hpbGRyZW4sXG4gIEVsZW1lbnRSZWYsXG4gIEV2ZW50RW1pdHRlcixcbiAgSW5wdXQsXG4gIE9uRGVzdHJveSxcbiAgT3B0aW9uYWwsXG4gIE91dHB1dCxcbiAgUXVlcnlMaXN0LFxuICBWaWV3RW5jYXBzdWxhdGlvbixcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmltcG9ydCB7IFN1YmplY3QsIGZyb21FdmVudCBhcyBvYnNlcnZhYmxlRnJvbUV2ZW50IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyB0YWtlVW50aWwgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5cbmltcG9ydCB7IFNreURyb3Bkb3duSXRlbUNvbXBvbmVudCB9IGZyb20gJy4vZHJvcGRvd24taXRlbS5jb21wb25lbnQnO1xuaW1wb3J0IHsgU2t5RHJvcGRvd25Db21wb25lbnQgfSBmcm9tICcuL2Ryb3Bkb3duLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBTa3lEcm9wZG93bk1lbnVDaGFuZ2UgfSBmcm9tICcuL3R5cGVzL2Ryb3Bkb3duLW1lbnUtY2hhbmdlJztcbmltcG9ydCB7IFNreURyb3Bkb3duTWVzc2FnZSB9IGZyb20gJy4vdHlwZXMvZHJvcGRvd24tbWVzc2FnZSc7XG5pbXBvcnQgeyBTa3lEcm9wZG93bk1lc3NhZ2VUeXBlIH0gZnJvbSAnLi90eXBlcy9kcm9wZG93bi1tZXNzYWdlLXR5cGUnO1xuXG5sZXQgbmV4dElkID0gMDtcbi8qKlxuICogQ3JlYXRlcyBhIG1lbnUgdGhhdCBjb250YWlucyBkcm9wZG93biBtZW51IGl0ZW1zLlxuICpcbiAqL1xuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnc2t5LWRyb3Bkb3duLW1lbnUnLFxuICB0ZW1wbGF0ZVVybDogJy4vZHJvcGRvd24tbWVudS5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2Ryb3Bkb3duLW1lbnUuY29tcG9uZW50LnNjc3MnXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmUsXG59KVxuZXhwb3J0IGNsYXNzIFNreURyb3Bkb3duTWVudUNvbXBvbmVudCBpbXBsZW1lbnRzIEFmdGVyQ29udGVudEluaXQsIE9uRGVzdHJveSB7XG4gIC8qKlxuICAgKiBUaGUgSFRNTCBlbGVtZW50IElEIG9mIHRoZSBlbGVtZW50IHRoYXQgbGFiZWxzXG4gICAqIHRoZSBkcm9wZG93biBtZW51LiBUaGlzIHNldHMgdGhlIGRyb3Bkb3duIG1lbnUncyBgYXJpYS1sYWJlbGxlZGJ5YCBhdHRyaWJ1dGUgdG8gcHJvdmlkZSBhIHRleHQgZXF1aXZhbGVudCBmb3JcbiAgICogW3RvIHN1cHBvcnQgYWNjZXNzaWJpbGl0eV0oaHR0cHM6Ly9kZXZlbG9wZXIuYmxhY2tiYXVkLmNvbS9za3l1eC9sZWFybi9hY2Nlc3NpYmlsaXR5KS5cbiAgICogRm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGBhcmlhLWxhYmVsbGVkYnlgIGF0dHJpYnV0ZSwgc2VlIHRoZSBbV0FJLUFSSUEgZGVmaW5pdGlvbl0oaHR0cHM6Ly93d3cudzMub3JnL1RSL3dhaS1hcmlhLyNhcmlhLWxhYmVsbGVkYnkpLlxuICAgKi9cbiAgQElucHV0KClcbiAgcHVibGljIGFyaWFMYWJlbGxlZEJ5OiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIFRoZSBBUklBIHJvbGUgZm9yIHRoZSBkcm9wZG93biBtZW51XG4gICAqIFt0byBzdXBwb3J0IGFjY2Vzc2liaWxpdHldKGh0dHBzOi8vZGV2ZWxvcGVyLmJsYWNrYmF1ZC5jb20vc2t5dXgvbGVhcm4vYWNjZXNzaWJpbGl0eSlcbiAgICogYnkgaW5kaWNhdGluZyBob3cgdGhlIGRyb3Bkb3duIG1lbnUgZnVuY3Rpb25zIGFuZCB3aGF0IGl0IGNvbnRyb2xzLiBUaGUgZHJvcGRvd24gYnV0dG9uXG4gICAqIGluaGVyaXRzIHRoaXMgdmFsdWUgdG8gc2V0IGl0cyBgYXJpYS1oYXNwb3B1cGAgcHJvcGVydHkuIEZvciBpbmZvcm1hdGlvblxuICAgKiBhYm91dCBob3cgYW4gQVJJQSByb2xlIGluZGljYXRlcyB3aGF0IGFuIGl0ZW0gcmVwcmVzZW50cyBvbiBhIHdlYiBwYWdlLCBzZWUgdGhlXG4gICAqIFtXQUktQVJJQSByb2xlcyBtb2RlbF0oaHR0cHM6Ly93d3cudzMub3JnL1dBSS9QRi9hcmlhLyNyb2xlcykuXG4gICAqIEBkZWZhdWx0IFwibWVudVwiXG4gICAqL1xuICBASW5wdXQoKVxuICBwdWJsaWMgc2V0IGFyaWFSb2xlKHZhbHVlOiBzdHJpbmcgfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLiNfYXJpYVJvbGUgPSB2YWx1ZSA/PyAnbWVudSc7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGFyaWFSb2xlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuI19hcmlhUm9sZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIHVzZSB0aGUgYnJvd3NlcidzIG5hdGl2ZSBmb2N1cyBmdW5jdGlvbiB3aGVuIHVzZXJzIG5hdmlnYXRlIHRocm91Z2ggbWVudVxuICAgKiBpdGVtcyB3aXRoIHRoZSBrZXlib2FyZC4gVG8gZGlzYWJsZSB0aGUgbmF0aXZlIGZvY3VzIGZ1bmN0aW9uLCBzZXQgdGhpcyBwcm9wZXJ0eSB0byBgZmFsc2VgLlxuICAgKiBGb3IgZXhhbXBsZSwgdG8gbGV0IHVzZXJzIGludGVyYWN0IHdpdGggdGhlIGRyb3Bkb3duIG1lbnUgYnV0IGtlZXAgdGhlIGtleWJvYXJkIGZvY3VzIG9uIGFcbiAgICogZGlmZmVyZW50IGVsZW1lbnQsIHNldCB0aGlzIHByb3BlcnR5IHRvIGBmYWxzZWAuXG4gICAqIEBkZWZhdWx0IHRydWVcbiAgICogQGludGVybmFsXG4gICAqL1xuICBASW5wdXQoKVxuICBwdWJsaWMgc2V0IHVzZU5hdGl2ZUZvY3VzKHZhbHVlOiBib29sZWFuIHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy4jX3VzZU5hdGl2ZUZvY3VzID0gdmFsdWUgPz8gdHJ1ZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgdXNlTmF0aXZlRm9jdXMoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuI191c2VOYXRpdmVGb2N1cztcbiAgfVxuXG4gIC8qKlxuICAgKiBGaXJlcyB3aGVuIHRoZSBkcm9wZG93biBtZW51J3MgYWN0aXZlIGluZGV4IG9yIHNlbGVjdGVkIGl0ZW0gY2hhbmdlcy4gVGhpcyBldmVudCBwcm92aWRlcyBhblxuICAgKiBvYnNlcnZhYmxlIHRvIGVtaXQgY2hhbmdlcywgYW5kIHRoZSByZXNwb25zZSBpcyBvZlxuICAgKiB0aGUgU2t5RHJvcGRvd25NZW51Q2hhbmdlIHR5cGUuXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgQE91dHB1dCgpXG4gIHB1YmxpYyBtZW51Q2hhbmdlcyA9IG5ldyBFdmVudEVtaXR0ZXI8U2t5RHJvcGRvd25NZW51Q2hhbmdlPigpO1xuXG4gIHB1YmxpYyBkcm9wZG93bk1lbnVJZCA9IGBza3ktZHJvcGRvd24tbWVudS0keysrbmV4dElkfWA7XG5cbiAgcHVibGljIHNldCBtZW51SW5kZXgodmFsdWU6IG51bWJlcikge1xuICAgIGlmICh2YWx1ZSA8IDApIHtcbiAgICAgIHZhbHVlID0gdGhpcy5tZW51SXRlbXMubGVuZ3RoIC0gMTtcbiAgICB9XG5cbiAgICBpZiAodmFsdWUgPj0gdGhpcy5tZW51SXRlbXMubGVuZ3RoKSB7XG4gICAgICB2YWx1ZSA9IDA7XG4gICAgfVxuXG4gICAgdGhpcy4jX21lbnVJbmRleCA9IHZhbHVlO1xuICB9XG5cbiAgcHVibGljIGdldCBtZW51SW5kZXgoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy4jX21lbnVJbmRleDtcbiAgfVxuXG4gIEBDb250ZW50Q2hpbGRyZW4oU2t5RHJvcGRvd25JdGVtQ29tcG9uZW50LCB7IGRlc2NlbmRhbnRzOiB0cnVlIH0pXG4gIHB1YmxpYyBtZW51SXRlbXMhOiBRdWVyeUxpc3Q8U2t5RHJvcGRvd25JdGVtQ29tcG9uZW50PjtcblxuICAjbmdVbnN1YnNjcmliZSA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG5cbiAgI19hcmlhUm9sZSA9ICdtZW51JztcblxuICAjX21lbnVJbmRleCA9IDA7XG5cbiAgI191c2VOYXRpdmVGb2N1cyA9IHRydWU7XG5cbiAgI2NoYW5nZURldGVjdG9yOiBDaGFuZ2VEZXRlY3RvclJlZjtcbiAgI2VsZW1lbnRSZWY6IEVsZW1lbnRSZWY7XG4gICNkcm9wZG93bkNvbXBvbmVudDogU2t5RHJvcGRvd25Db21wb25lbnQgfCB1bmRlZmluZWQ7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgY2hhbmdlRGV0ZWN0b3I6IENoYW5nZURldGVjdG9yUmVmLFxuICAgIGVsZW1lbnRSZWY6IEVsZW1lbnRSZWYsXG4gICAgQE9wdGlvbmFsKCkgZHJvcGRvd25Db21wb25lbnQ/OiBTa3lEcm9wZG93bkNvbXBvbmVudFxuICApIHtcbiAgICB0aGlzLiNjaGFuZ2VEZXRlY3RvciA9IGNoYW5nZURldGVjdG9yO1xuICAgIHRoaXMuI2VsZW1lbnRSZWYgPSBlbGVtZW50UmVmO1xuICAgIHRoaXMuI2Ryb3Bkb3duQ29tcG9uZW50ID0gZHJvcGRvd25Db21wb25lbnQ7XG4gIH1cblxuICBwdWJsaWMgbmdBZnRlckNvbnRlbnRJbml0KCk6IHZvaWQge1xuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovXG4gICAgaWYgKHRoaXMuI2Ryb3Bkb3duQ29tcG9uZW50KSB7XG4gICAgICB0aGlzLiNkcm9wZG93bkNvbXBvbmVudC5tZW51SWQgPSB0aGlzLmRyb3Bkb3duTWVudUlkO1xuICAgICAgdGhpcy4jZHJvcGRvd25Db21wb25lbnQubWVudUFyaWFSb2xlID0gdGhpcy5hcmlhUm9sZTtcblxuICAgICAgdGhpcy4jZHJvcGRvd25Db21wb25lbnQubWVzc2FnZVN0cmVhbVxuICAgICAgICA/LnBpcGUodGFrZVVudGlsKHRoaXMuI25nVW5zdWJzY3JpYmUpKVxuICAgICAgICAuc3Vic2NyaWJlKChtZXNzYWdlOiBTa3lEcm9wZG93bk1lc3NhZ2UpID0+IHtcbiAgICAgICAgICBzd2l0Y2ggKG1lc3NhZ2UudHlwZSkge1xuICAgICAgICAgICAgY2FzZSBTa3lEcm9wZG93bk1lc3NhZ2VUeXBlLk9wZW46XG4gICAgICAgICAgICBjYXNlIFNreURyb3Bkb3duTWVzc2FnZVR5cGUuQ2xvc2U6XG4gICAgICAgICAgICAgIHRoaXMucmVzZXQoKTtcbiAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgIGNhc2UgU2t5RHJvcGRvd25NZXNzYWdlVHlwZS5Gb2N1c0ZpcnN0SXRlbTpcbiAgICAgICAgICAgICAgdGhpcy5mb2N1c0ZpcnN0SXRlbSgpO1xuICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgY2FzZSBTa3lEcm9wZG93bk1lc3NhZ2VUeXBlLkZvY3VzTmV4dEl0ZW06XG4gICAgICAgICAgICAgIHRoaXMuZm9jdXNOZXh0SXRlbSgpO1xuICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgY2FzZSBTa3lEcm9wZG93bk1lc3NhZ2VUeXBlLkZvY3VzUHJldmlvdXNJdGVtOlxuICAgICAgICAgICAgICB0aGlzLmZvY3VzUHJldmlvdXNJdGVtKCk7XG4gICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICBjYXNlIFNreURyb3Bkb3duTWVzc2FnZVR5cGUuRm9jdXNMYXN0SXRlbTpcbiAgICAgICAgICAgICAgdGhpcy5mb2N1c0xhc3RJdGVtKCk7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgIHRoaXMubWVudUNoYW5nZXNcbiAgICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuI25nVW5zdWJzY3JpYmUpKVxuICAgICAgICAuc3Vic2NyaWJlKChjaGFuZ2U6IFNreURyb3Bkb3duTWVudUNoYW5nZSkgPT4ge1xuICAgICAgICAgIC8vIENsb3NlIHRoZSBkcm9wZG93biB3aGVuIGEgbWVudSBpdGVtIGlzIHNlbGVjdGVkLlxuICAgICAgICAgIGlmIChjaGFuZ2Uuc2VsZWN0ZWRJdGVtKSB7XG4gICAgICAgICAgICB0aGlzLiNzZW5kTWVzc2FnZShTa3lEcm9wZG93bk1lc3NhZ2VUeXBlLkNsb3NlKTtcbiAgICAgICAgICAgIHRoaXMuI3NlbmRNZXNzYWdlKFNreURyb3Bkb3duTWVzc2FnZVR5cGUuRm9jdXNUcmlnZ2VyQnV0dG9uKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoY2hhbmdlLml0ZW1zKSB7XG4gICAgICAgICAgICAvLyBVcGRhdGUgdGhlIHBvcG92ZXIgc3R5bGUgYW5kIHBvc2l0aW9uIHdoZW5ldmVyIHRoZSBudW1iZXIgb2YgaXRlbXMgY2hhbmdlcy5cbiAgICAgICAgICAgIHRoaXMuI3NlbmRNZXNzYWdlKFNreURyb3Bkb3duTWVzc2FnZVR5cGUuUmVwb3NpdGlvbik7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBSZXNldCBkcm9wZG93biB3aGVuZXZlciB0aGUgbWVudSBpdGVtcyBjaGFuZ2UuXG4gICAgdGhpcy5tZW51SXRlbXMuY2hhbmdlc1xuICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuI25nVW5zdWJzY3JpYmUpKVxuICAgICAgLnN1YnNjcmliZSgoaXRlbXM6IFF1ZXJ5TGlzdDxTa3lEcm9wZG93bkl0ZW1Db21wb25lbnQ+KSA9PiB7XG4gICAgICAgIHRoaXMucmVzZXQoKTtcbiAgICAgICAgdGhpcy5tZW51Q2hhbmdlcy5lbWl0KHtcbiAgICAgICAgICBpdGVtczogaXRlbXMudG9BcnJheSgpLFxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuXG4gICAgdGhpcy4jYWRkRXZlbnRMaXN0ZW5lcnMoKTtcbiAgfVxuXG4gIHB1YmxpYyBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLiNuZ1Vuc3Vic2NyaWJlLm5leHQoKTtcbiAgICB0aGlzLiNuZ1Vuc3Vic2NyaWJlLmNvbXBsZXRlKCk7XG4gIH1cblxuICBwdWJsaWMgZm9jdXNGaXJzdEl0ZW0oKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLiNoYXNGb2N1c2FibGVJdGVtcygpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5tZW51SW5kZXggPSAwO1xuXG4gICAgY29uc3QgZmlyc3RJdGVtID0gdGhpcy4jZ2V0SXRlbUJ5SW5kZXgodGhpcy5tZW51SW5kZXgpO1xuICAgIGlmIChmaXJzdEl0ZW0gJiYgZmlyc3RJdGVtLmlzRm9jdXNhYmxlKCkpIHtcbiAgICAgIHRoaXMuI2ZvY3VzSXRlbShmaXJzdEl0ZW0pO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmZvY3VzTmV4dEl0ZW0oKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgZm9jdXNMYXN0SXRlbSgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuI2hhc0ZvY3VzYWJsZUl0ZW1zKCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLm1lbnVJbmRleCA9IHRoaXMubWVudUl0ZW1zLmxlbmd0aCAtIDE7XG5cbiAgICBjb25zdCBsYXN0SXRlbSA9IHRoaXMuI2dldEl0ZW1CeUluZGV4KHRoaXMubWVudUluZGV4KTtcbiAgICBpZiAobGFzdEl0ZW0gJiYgbGFzdEl0ZW0uaXNGb2N1c2FibGUoKSkge1xuICAgICAgdGhpcy4jZm9jdXNJdGVtKGxhc3RJdGVtKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5mb2N1c1ByZXZpb3VzSXRlbSgpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBmb2N1c1ByZXZpb3VzSXRlbSgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuI2hhc0ZvY3VzYWJsZUl0ZW1zKCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLm1lbnVJbmRleC0tO1xuXG4gICAgY29uc3QgcHJldmlvdXNJdGVtID0gdGhpcy4jZ2V0SXRlbUJ5SW5kZXgodGhpcy5tZW51SW5kZXgpO1xuICAgIGlmIChwcmV2aW91c0l0ZW0gJiYgcHJldmlvdXNJdGVtLmlzRm9jdXNhYmxlKCkpIHtcbiAgICAgIHRoaXMuI2ZvY3VzSXRlbShwcmV2aW91c0l0ZW0pO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmZvY3VzUHJldmlvdXNJdGVtKCk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGZvY3VzTmV4dEl0ZW0oKSB7XG4gICAgaWYgKCF0aGlzLiNoYXNGb2N1c2FibGVJdGVtcygpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5tZW51SW5kZXgrKztcblxuICAgIGNvbnN0IG5leHRJdGVtID0gdGhpcy4jZ2V0SXRlbUJ5SW5kZXgodGhpcy5tZW51SW5kZXgpO1xuICAgIGlmIChuZXh0SXRlbSAmJiBuZXh0SXRlbS5pc0ZvY3VzYWJsZSgpKSB7XG4gICAgICB0aGlzLiNmb2N1c0l0ZW0obmV4dEl0ZW0pO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmZvY3VzTmV4dEl0ZW0oKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgcmVzZXQoKTogdm9pZCB7XG4gICAgdGhpcy4jX21lbnVJbmRleCA9IC0xO1xuICAgIHRoaXMuI3Jlc2V0SXRlbXNBY3RpdmVTdGF0ZSgpO1xuICAgIHRoaXMuI2NoYW5nZURldGVjdG9yLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgI3Jlc2V0SXRlbXNBY3RpdmVTdGF0ZSgpIHtcbiAgICB0aGlzLm1lbnVJdGVtcy5mb3JFYWNoKChpdGVtOiBTa3lEcm9wZG93bkl0ZW1Db21wb25lbnQpID0+IHtcbiAgICAgIGl0ZW0ucmVzZXRTdGF0ZSgpO1xuICAgIH0pO1xuICB9XG5cbiAgI2ZvY3VzSXRlbShpdGVtOiBTa3lEcm9wZG93bkl0ZW1Db21wb25lbnQpOiB2b2lkIHtcbiAgICB0aGlzLiNyZXNldEl0ZW1zQWN0aXZlU3RhdGUoKTtcbiAgICBpdGVtLmZvY3VzRWxlbWVudCh0aGlzLnVzZU5hdGl2ZUZvY3VzKTtcbiAgICB0aGlzLm1lbnVDaGFuZ2VzLmVtaXQoe1xuICAgICAgYWN0aXZlSW5kZXg6IHRoaXMubWVudUluZGV4LFxuICAgIH0pO1xuICB9XG5cbiAgI2dldEl0ZW1CeUluZGV4KGluZGV4OiBudW1iZXIpOiBTa3lEcm9wZG93bkl0ZW1Db21wb25lbnQgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLm1lbnVJdGVtcy5maW5kKChfLCBpKSA9PiBpID09PSBpbmRleCk7XG4gIH1cblxuICAjc2VsZWN0SXRlbUJ5RXZlbnRUYXJnZXQodGFyZ2V0OiBFdmVudFRhcmdldCk6IHZvaWQge1xuICAgIGNvbnN0IHNlbGVjdGVkSXRlbSA9IHRoaXMubWVudUl0ZW1zLmZpbmQoXG4gICAgICAoaXRlbTogU2t5RHJvcGRvd25JdGVtQ29tcG9uZW50LCBpOiBudW1iZXIpID0+IHtcbiAgICAgICAgY29uc3QgZm91bmQgPSBpdGVtLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5jb250YWlucyh0YXJnZXQpO1xuXG4gICAgICAgIGlmIChmb3VuZCkge1xuICAgICAgICAgIHRoaXMubWVudUluZGV4ID0gaTtcbiAgICAgICAgICB0aGlzLm1lbnVDaGFuZ2VzLm5leHQoe1xuICAgICAgICAgICAgYWN0aXZlSW5kZXg6IHRoaXMubWVudUluZGV4LFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGZvdW5kO1xuICAgICAgfVxuICAgICk7XG5cbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuICAgIGlmIChzZWxlY3RlZEl0ZW0pIHtcbiAgICAgIHRoaXMubWVudUNoYW5nZXMubmV4dCh7XG4gICAgICAgIHNlbGVjdGVkSXRlbSxcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gICNzZW5kTWVzc2FnZSh0eXBlOiBTa3lEcm9wZG93bk1lc3NhZ2VUeXBlKTogdm9pZCB7XG4gICAgdGhpcy4jZHJvcGRvd25Db21wb25lbnQ/Lm1lc3NhZ2VTdHJlYW0/Lm5leHQoeyB0eXBlIH0pO1xuICB9XG5cbiAgI2FkZEV2ZW50TGlzdGVuZXJzKCk6IHZvaWQge1xuICAgIGNvbnN0IGRyb3Bkb3duTWVudUVsZW1lbnQgPSB0aGlzLiNlbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQ7XG5cbiAgICBvYnNlcnZhYmxlRnJvbUV2ZW50PE1vdXNlRXZlbnQ+KGRyb3Bkb3duTWVudUVsZW1lbnQsICdjbGljaycpXG4gICAgICAucGlwZSh0YWtlVW50aWwodGhpcy4jbmdVbnN1YnNjcmliZSkpXG4gICAgICAuc3Vic2NyaWJlKChldmVudCkgPT4ge1xuICAgICAgICB0aGlzLiNzZWxlY3RJdGVtQnlFdmVudFRhcmdldChldmVudC50YXJnZXQgYXMgRXZlbnRUYXJnZXQpO1xuICAgICAgfSk7XG5cbiAgICBvYnNlcnZhYmxlRnJvbUV2ZW50PEtleWJvYXJkRXZlbnQ+KGRyb3Bkb3duTWVudUVsZW1lbnQsICdrZXlkb3duJylcbiAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLiNuZ1Vuc3Vic2NyaWJlKSlcbiAgICAgIC5zdWJzY3JpYmUoKGV2ZW50KSA9PiB7XG4gICAgICAgIGNvbnN0IGtleSA9IGV2ZW50LmtleS50b0xvd2VyQ2FzZSgpO1xuXG4gICAgICAgIHN3aXRjaCAoa2V5KSB7XG4gICAgICAgICAgY2FzZSAnZXNjYXBlJzpcbiAgICAgICAgICAgIHRoaXMuI3NlbmRNZXNzYWdlKFNreURyb3Bkb3duTWVzc2FnZVR5cGUuQ2xvc2UpO1xuICAgICAgICAgICAgdGhpcy4jc2VuZE1lc3NhZ2UoU2t5RHJvcGRvd25NZXNzYWdlVHlwZS5Gb2N1c1RyaWdnZXJCdXR0b24pO1xuICAgICAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICBjYXNlICdhcnJvd2Rvd24nOlxuICAgICAgICAgIGNhc2UgJ2Rvd24nOlxuICAgICAgICAgICAgdGhpcy5mb2N1c05leHRJdGVtKCk7XG4gICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICBjYXNlICdhcnJvd3VwJzpcbiAgICAgICAgICBjYXNlICd1cCc6XG4gICAgICAgICAgICB0aGlzLmZvY3VzUHJldmlvdXNJdGVtKCk7XG4gICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICBjYXNlICd0YWInOlxuICAgICAgICAgICAgaWYgKHRoaXMuI2Ryb3Bkb3duQ29tcG9uZW50Py5kaXNtaXNzT25CbHVyKSB7XG4gICAgICAgICAgICAgIHRoaXMuI3NlbmRNZXNzYWdlKFNreURyb3Bkb3duTWVzc2FnZVR5cGUuQ2xvc2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy4jc2VuZE1lc3NhZ2UoU2t5RHJvcGRvd25NZXNzYWdlVHlwZS5Gb2N1c1RyaWdnZXJCdXR0b24pO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgb2JzZXJ2YWJsZUZyb21FdmVudChkcm9wZG93bk1lbnVFbGVtZW50LCAnbW91c2VlbnRlcicpXG4gICAgICAucGlwZSh0YWtlVW50aWwodGhpcy4jbmdVbnN1YnNjcmliZSkpXG4gICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cbiAgICAgICAgaWYgKHRoaXMuI2Ryb3Bkb3duQ29tcG9uZW50KSB7XG4gICAgICAgICAgdGhpcy4jZHJvcGRvd25Db21wb25lbnQuaXNNb3VzZUVudGVyID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICBvYnNlcnZhYmxlRnJvbUV2ZW50KGRyb3Bkb3duTWVudUVsZW1lbnQsICdtb3VzZWxlYXZlJylcbiAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLiNuZ1Vuc3Vic2NyaWJlKSlcbiAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuICAgICAgICBpZiAodGhpcy4jZHJvcGRvd25Db21wb25lbnQpIHtcbiAgICAgICAgICB0aGlzLiNkcm9wZG93bkNvbXBvbmVudC5pc01vdXNlRW50ZXIgPSBmYWxzZTtcbiAgICAgICAgICAvLyBBbGxvdyB0aGUgZHJvcGRvd24gY29tcG9uZW50IHRvIHNldCBpc01vdXNlRW50ZXIgYmVmb3JlIGNoZWNraW5nIGlmIHRoZSBjbG9zZSBhY3Rpb25cbiAgICAgICAgICAvLyBzaG91bGQgYmUgdGFrZW4uXG4gICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgIHRoaXMuI2Ryb3Bkb3duQ29tcG9uZW50ICYmXG4gICAgICAgICAgICAgIHRoaXMuI2Ryb3Bkb3duQ29tcG9uZW50LnRyaWdnZXIgPT09ICdob3ZlcicgJiZcbiAgICAgICAgICAgICAgdGhpcy4jZHJvcGRvd25Db21wb25lbnQuaXNNb3VzZUVudGVyID09PSBmYWxzZVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgIHRoaXMuI3NlbmRNZXNzYWdlKFNreURyb3Bkb3duTWVzc2FnZVR5cGUuQ2xvc2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgfVxuXG4gICNoYXNGb2N1c2FibGVJdGVtcygpOiBib29sZWFuIHtcbiAgICBjb25zdCBmb3VuZCA9IHRoaXMubWVudUl0ZW1zLmZpbmQoKGl0ZW0pID0+IGl0ZW0uaXNGb2N1c2FibGUoKSk7XG4gICAgcmV0dXJuIGZvdW5kICE9PSB1bmRlZmluZWQ7XG4gIH1cbn1cbiIsIjxkaXZcbiAgY2xhc3M9XCJza3ktZHJvcGRvd24tbWVudSBza3ktc2hhZG93IHNreS1lbGV2YXRpb24tNFwiXG4gIFthdHRyLmFyaWEtbGFiZWxsZWRieV09XCJhcmlhTGFiZWxsZWRCeVwiXG4gIFthdHRyLnJvbGVdPVwiYXJpYVJvbGVcIlxuICBbaWRdPVwiZHJvcGRvd25NZW51SWRcIlxuPlxuICA8bmctY29udGVudD4gPC9uZy1jb250ZW50PlxuPC9kaXY+XG4iXX0=
|