@skyux/popovers 5.0.2 → 5.5.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.
Files changed (152) hide show
  1. package/README.md +6 -4
  2. package/bundles/skyux-popovers-testing.umd.js +8 -8
  3. package/bundles/skyux-popovers.umd.js +43 -39
  4. package/documentation.json +241 -44
  5. package/esm2015/index.js +23 -0
  6. package/esm2015/index.js.map +1 -0
  7. package/esm2015/lib/modules/dropdown/dropdown-button.component.js +14 -0
  8. package/esm2015/lib/modules/dropdown/dropdown-button.component.js.map +1 -0
  9. package/esm2015/lib/modules/dropdown/dropdown-extensions.js +14 -0
  10. package/esm2015/lib/modules/dropdown/dropdown-extensions.js.map +1 -0
  11. package/esm2015/lib/modules/dropdown/dropdown-item.component.js +72 -0
  12. package/esm2015/lib/modules/dropdown/dropdown-item.component.js.map +1 -0
  13. package/esm2015/lib/modules/dropdown/dropdown-menu.component.js +307 -0
  14. package/esm2015/lib/modules/dropdown/dropdown-menu.component.js.map +1 -0
  15. package/esm2015/lib/modules/dropdown/dropdown.component.js +360 -0
  16. package/esm2015/lib/modules/dropdown/dropdown.component.js.map +1 -0
  17. package/esm2015/lib/modules/dropdown/dropdown.module.js +60 -0
  18. package/esm2015/lib/modules/dropdown/dropdown.module.js.map +1 -0
  19. package/esm2015/lib/modules/dropdown/types/dropdown-horizontal-alignment.js +2 -0
  20. package/esm2015/lib/modules/dropdown/types/dropdown-horizontal-alignment.js.map +1 -0
  21. package/esm2015/lib/modules/dropdown/types/dropdown-menu-change.js +2 -0
  22. package/esm2015/lib/modules/dropdown/types/dropdown-menu-change.js.map +1 -0
  23. package/esm2015/lib/modules/dropdown/types/dropdown-message-type.js +37 -0
  24. package/esm2015/lib/modules/dropdown/types/dropdown-message-type.js.map +1 -0
  25. package/esm2015/lib/modules/dropdown/types/dropdown-message.js +2 -0
  26. package/esm2015/lib/modules/dropdown/types/dropdown-message.js.map +1 -0
  27. package/esm2015/lib/modules/dropdown/types/dropdown-trigger-type.js +2 -0
  28. package/esm2015/lib/modules/dropdown/types/dropdown-trigger-type.js.map +1 -0
  29. package/esm2015/lib/modules/popover/popover-adapter.service.js +74 -0
  30. package/esm2015/lib/modules/popover/popover-adapter.service.js.map +1 -0
  31. package/esm2015/lib/modules/popover/popover-animation-state.js +2 -0
  32. package/esm2015/lib/modules/popover/popover-animation-state.js.map +1 -0
  33. package/esm2015/lib/modules/popover/popover-animation.js +19 -0
  34. package/esm2015/lib/modules/popover/popover-animation.js.map +1 -0
  35. package/esm2015/lib/modules/popover/popover-content.component.js +268 -0
  36. package/esm2015/lib/modules/popover/popover-content.component.js.map +1 -0
  37. package/esm2015/lib/modules/popover/popover-context.js +10 -0
  38. package/esm2015/lib/modules/popover/popover-context.js.map +1 -0
  39. package/esm2015/lib/modules/popover/popover-extensions.js +29 -0
  40. package/esm2015/lib/modules/popover/popover-extensions.js.map +1 -0
  41. package/esm2015/lib/modules/popover/popover.component.js +203 -0
  42. package/esm2015/lib/modules/popover/popover.component.js.map +1 -0
  43. package/esm2015/lib/modules/popover/popover.directive.js +176 -0
  44. package/esm2015/lib/modules/popover/popover.directive.js.map +1 -0
  45. package/esm2015/lib/modules/popover/popover.module.js +56 -0
  46. package/esm2015/lib/modules/popover/popover.module.js.map +1 -0
  47. package/esm2015/lib/modules/popover/types/popover-adapter-arrow-coordinates.js +2 -0
  48. package/esm2015/lib/modules/popover/types/popover-adapter-arrow-coordinates.js.map +1 -0
  49. package/esm2015/lib/modules/popover/types/popover-adapter-elements.js +2 -0
  50. package/esm2015/lib/modules/popover/types/popover-adapter-elements.js.map +1 -0
  51. package/esm2015/lib/modules/popover/types/popover-alignment.js +2 -0
  52. package/esm2015/lib/modules/popover/types/popover-alignment.js.map +1 -0
  53. package/esm2015/lib/modules/popover/types/popover-message-type.js +24 -0
  54. package/esm2015/lib/modules/popover/types/popover-message-type.js.map +1 -0
  55. package/esm2015/lib/modules/popover/types/popover-message.js +2 -0
  56. package/esm2015/lib/modules/popover/types/popover-message.js.map +1 -0
  57. package/esm2015/lib/modules/popover/types/popover-placement.js +2 -0
  58. package/esm2015/lib/modules/popover/types/popover-placement.js.map +1 -0
  59. package/esm2015/lib/modules/popover/types/popover-position.js +2 -0
  60. package/esm2015/lib/modules/popover/types/popover-position.js.map +1 -0
  61. package/esm2015/lib/modules/popover/types/popover-trigger.js +2 -0
  62. package/esm2015/lib/modules/popover/types/popover-trigger.js.map +1 -0
  63. package/esm2015/lib/modules/shared/sky-popovers-resources.module.js +47 -0
  64. package/esm2015/lib/modules/shared/sky-popovers-resources.module.js.map +1 -0
  65. package/esm2015/skyux-popovers.js +2 -2
  66. package/esm2015/skyux-popovers.js.map +1 -0
  67. package/esm2015/testing/dropdown/dropdown-fixture.js +1 -1
  68. package/esm2015/testing/dropdown/dropdown-fixture.js.map +1 -0
  69. package/esm2015/testing/dropdown/dropdown-testing.module.js +5 -5
  70. package/esm2015/testing/dropdown/dropdown-testing.module.js.map +1 -0
  71. package/esm2015/testing/dropdown/popovers-fixture-dropdown-item.js +1 -1
  72. package/esm2015/testing/dropdown/popovers-fixture-dropdown-item.js.map +1 -0
  73. package/esm2015/testing/dropdown/popovers-fixture-dropdown-menu.js +1 -1
  74. package/esm2015/testing/dropdown/popovers-fixture-dropdown-menu.js.map +1 -0
  75. package/esm2015/testing/dropdown/popovers-fixture-dropdown.js +1 -1
  76. package/esm2015/testing/dropdown/popovers-fixture-dropdown.js.map +1 -0
  77. package/esm2015/testing/popover/popover-fixture.js +1 -1
  78. package/esm2015/testing/popover/popover-fixture.js.map +1 -0
  79. package/esm2015/testing/popover/popover-testing.module.js +5 -5
  80. package/esm2015/testing/popover/popover-testing.module.js.map +1 -0
  81. package/esm2015/testing/public-api.js +1 -1
  82. package/esm2015/testing/public-api.js.map +1 -0
  83. package/esm2015/testing/skyux-popovers-testing.js +1 -1
  84. package/esm2015/testing/skyux-popovers-testing.js.map +1 -0
  85. package/fesm2015/skyux-popovers-testing.js +8 -8
  86. package/fesm2015/skyux-popovers-testing.js.map +1 -1
  87. package/fesm2015/skyux-popovers.js +53 -49
  88. package/fesm2015/skyux-popovers.js.map +1 -1
  89. package/index.d.ts +20 -0
  90. package/{modules → lib/modules}/dropdown/dropdown-button.component.d.ts +0 -0
  91. package/{modules → lib/modules}/dropdown/dropdown-extensions.d.ts +0 -0
  92. package/{modules → lib/modules}/dropdown/dropdown-item.component.d.ts +0 -0
  93. package/{modules → lib/modules}/dropdown/dropdown-menu.component.d.ts +0 -0
  94. package/{modules → lib/modules}/dropdown/dropdown.component.d.ts +0 -0
  95. package/{modules → lib/modules}/dropdown/dropdown.module.d.ts +0 -0
  96. package/{modules → lib/modules}/dropdown/types/dropdown-horizontal-alignment.d.ts +0 -0
  97. package/{modules → lib/modules}/dropdown/types/dropdown-menu-change.d.ts +0 -0
  98. package/{modules → lib/modules}/dropdown/types/dropdown-message-type.d.ts +0 -0
  99. package/{modules → lib/modules}/dropdown/types/dropdown-message.d.ts +0 -0
  100. package/{modules → lib/modules}/dropdown/types/dropdown-trigger-type.d.ts +0 -0
  101. package/{modules → lib/modules}/popover/popover-adapter.service.d.ts +0 -0
  102. package/{modules → lib/modules}/popover/popover-animation-state.d.ts +0 -0
  103. package/{modules → lib/modules}/popover/popover-animation.d.ts +0 -0
  104. package/{modules → lib/modules}/popover/popover-content.component.d.ts +0 -0
  105. package/{modules → lib/modules}/popover/popover-context.d.ts +0 -0
  106. package/{modules → lib/modules}/popover/popover-extensions.d.ts +0 -0
  107. package/{modules → lib/modules}/popover/popover.component.d.ts +4 -1
  108. package/{modules → lib/modules}/popover/popover.directive.d.ts +2 -0
  109. package/{modules → lib/modules}/popover/popover.module.d.ts +0 -0
  110. package/{modules → lib/modules}/popover/types/popover-adapter-arrow-coordinates.d.ts +0 -0
  111. package/{modules → lib/modules}/popover/types/popover-adapter-elements.d.ts +0 -0
  112. package/{modules → lib/modules}/popover/types/popover-alignment.d.ts +0 -0
  113. package/{modules → lib/modules}/popover/types/popover-message-type.d.ts +0 -0
  114. package/{modules → lib/modules}/popover/types/popover-message.d.ts +0 -0
  115. package/{modules → lib/modules}/popover/types/popover-placement.d.ts +0 -0
  116. package/{modules → lib/modules}/popover/types/popover-position.d.ts +0 -0
  117. package/{modules → lib/modules}/popover/types/popover-trigger.d.ts +0 -0
  118. package/{modules → lib/modules}/shared/sky-popovers-resources.module.d.ts +0 -0
  119. package/package.json +23 -9
  120. package/skyux-popovers.d.ts +1 -1
  121. package/LICENSE +0 -21
  122. package/esm2015/modules/dropdown/dropdown-button.component.js +0 -14
  123. package/esm2015/modules/dropdown/dropdown-extensions.js +0 -14
  124. package/esm2015/modules/dropdown/dropdown-item.component.js +0 -72
  125. package/esm2015/modules/dropdown/dropdown-menu.component.js +0 -306
  126. package/esm2015/modules/dropdown/dropdown.component.js +0 -357
  127. package/esm2015/modules/dropdown/dropdown.module.js +0 -60
  128. package/esm2015/modules/dropdown/types/dropdown-horizontal-alignment.js +0 -2
  129. package/esm2015/modules/dropdown/types/dropdown-menu-change.js +0 -2
  130. package/esm2015/modules/dropdown/types/dropdown-message-type.js +0 -37
  131. package/esm2015/modules/dropdown/types/dropdown-message.js +0 -2
  132. package/esm2015/modules/dropdown/types/dropdown-trigger-type.js +0 -2
  133. package/esm2015/modules/popover/popover-adapter.service.js +0 -74
  134. package/esm2015/modules/popover/popover-animation-state.js +0 -2
  135. package/esm2015/modules/popover/popover-animation.js +0 -19
  136. package/esm2015/modules/popover/popover-content.component.js +0 -266
  137. package/esm2015/modules/popover/popover-context.js +0 -10
  138. package/esm2015/modules/popover/popover-extensions.js +0 -29
  139. package/esm2015/modules/popover/popover.component.js +0 -200
  140. package/esm2015/modules/popover/popover.directive.js +0 -175
  141. package/esm2015/modules/popover/popover.module.js +0 -56
  142. package/esm2015/modules/popover/types/popover-adapter-arrow-coordinates.js +0 -2
  143. package/esm2015/modules/popover/types/popover-adapter-elements.js +0 -2
  144. package/esm2015/modules/popover/types/popover-alignment.js +0 -2
  145. package/esm2015/modules/popover/types/popover-message-type.js +0 -24
  146. package/esm2015/modules/popover/types/popover-message.js +0 -2
  147. package/esm2015/modules/popover/types/popover-placement.js +0 -2
  148. package/esm2015/modules/popover/types/popover-position.js +0 -2
  149. package/esm2015/modules/popover/types/popover-trigger.js +0 -2
  150. package/esm2015/modules/shared/sky-popovers-resources.module.js +0 -47
  151. package/esm2015/public-api.js +0 -23
  152. package/public-api.d.ts +0 -20
@@ -15,6 +15,7 @@ export declare class SkyPopoverDirective implements OnInit, OnDestroy {
15
15
  skyPopover: SkyPopoverComponent;
16
16
  /**
17
17
  * Specifies the horizontal alignment of the popover in relation to the trigger element.
18
+ * Options include:`"center"`, `"right"`, and `"left"`.
18
19
  * @default "center"
19
20
  */
20
21
  skyPopoverAlignment: SkyPopoverAlignment;
@@ -24,6 +25,7 @@ export declare class SkyPopoverDirective implements OnInit, OnDestroy {
24
25
  skyPopoverMessageStream: Subject<SkyPopoverMessage>;
25
26
  /**
26
27
  * Specifies the placement of the popover in relation to the trigger element.
28
+ * Options include:`"above"`, `"below"`, `"right"`, and `"left"`.
27
29
  * @default "above"
28
30
  */
29
31
  skyPopoverPlacement: SkyPopoverPlacement;
package/package.json CHANGED
@@ -1,19 +1,33 @@
1
1
  {
2
2
  "name": "@skyux/popovers",
3
- "version": "5.0.2",
3
+ "version": "5.5.0",
4
4
  "peerDependencies": {
5
- "@angular/animations": "^12.2.15",
6
- "@angular/common": "^12.2.15",
7
- "@angular/core": "^12.2.15",
8
- "@angular/platform-browser": "^12.2.15",
9
- "@skyux/core": "^5.2.2",
10
- "@skyux/i18n": "^5.0.1",
11
- "@skyux/indicators": "^5.1.2",
12
- "@skyux/theme": "^5.0.4"
5
+ "@angular/animations": "^12.2.16",
6
+ "@angular/common": "^12.2.16",
7
+ "@angular/core": "^12.2.16",
8
+ "@angular/platform-browser": "^12.2.16",
9
+ "@skyux/core": "5.5.0",
10
+ "@skyux/i18n": "5.5.0",
11
+ "@skyux/indicators": "5.5.0",
12
+ "@skyux/theme": "5.5.0"
13
13
  },
14
14
  "dependencies": {
15
15
  "tslib": "^2.3.1"
16
16
  },
17
+ "author": "Blackbaud, Inc.",
18
+ "keywords": [
19
+ "blackbaud",
20
+ "skyux"
21
+ ],
22
+ "license": "MIT",
23
+ "repository": {
24
+ "type": "git",
25
+ "url": "git+https://github.com/blackbaud/skyux.git"
26
+ },
27
+ "bugs": {
28
+ "url": "https://github.com/blackbaud/skyux/issues"
29
+ },
30
+ "homepage": "https://github.com/blackbaud/skyux#readme",
17
31
  "main": "bundles/skyux-popovers.umd.js",
18
32
  "module": "fesm2015/skyux-popovers.js",
19
33
  "es2015": "fesm2015/skyux-popovers.js",
@@ -2,4 +2,4 @@
2
2
  * Generated bundle index. Do not edit.
3
3
  */
4
4
  /// <amd-module name="@skyux/popovers" />
5
- export * from './public-api';
5
+ export * from './index';
package/LICENSE DELETED
@@ -1,21 +0,0 @@
1
- The MIT License (MIT)
2
-
3
- Copyright (c) 2020 Blackbaud
4
-
5
- Permission is hereby granted, free of charge, to any person obtaining a copy
6
- of this software and associated documentation files (the "Software"), to deal
7
- in the Software without restriction, including without limitation the rights
8
- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
- copies of the Software, and to permit persons to whom the Software is
10
- furnished to do so, subject to the following conditions:
11
-
12
- The above copyright notice and this permission notice shall be included in all
13
- copies or substantial portions of the Software.
14
-
15
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
- SOFTWARE.
@@ -1,14 +0,0 @@
1
- import { Component } from '@angular/core';
2
- import * as i0 from "@angular/core";
3
- export class SkyDropdownButtonComponent {
4
- }
5
- SkyDropdownButtonComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.15", ngImport: i0, type: SkyDropdownButtonComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
6
- SkyDropdownButtonComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.15", type: SkyDropdownButtonComponent, selector: "sky-dropdown-button", ngImport: i0, template: "<ng-content></ng-content>\n" });
7
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.15", ngImport: i0, type: SkyDropdownButtonComponent, decorators: [{
8
- type: Component,
9
- args: [{
10
- selector: 'sky-dropdown-button',
11
- templateUrl: './dropdown-button.component.html',
12
- }]
13
- }] });
14
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHJvcGRvd24tYnV0dG9uLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3BvcG92ZXJzL3NyYy9tb2R1bGVzL2Ryb3Bkb3duL2Ryb3Bkb3duLWJ1dHRvbi5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9wb3BvdmVycy9zcmMvbW9kdWxlcy9kcm9wZG93bi9kcm9wZG93bi1idXR0b24uY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQzs7QUFNMUMsTUFBTSxPQUFPLDBCQUEwQjs7d0hBQTFCLDBCQUEwQjs0R0FBMUIsMEJBQTBCLDJEQ052Qyw2QkFDQTs0RkRLYSwwQkFBMEI7a0JBSnRDLFNBQVM7bUJBQUM7b0JBQ1QsUUFBUSxFQUFFLHFCQUFxQjtvQkFDL0IsV0FBVyxFQUFFLGtDQUFrQztpQkFDaEQiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnc2t5LWRyb3Bkb3duLWJ1dHRvbicsXG4gIHRlbXBsYXRlVXJsOiAnLi9kcm9wZG93bi1idXR0b24uY29tcG9uZW50Lmh0bWwnLFxufSlcbmV4cG9ydCBjbGFzcyBTa3lEcm9wZG93bkJ1dHRvbkNvbXBvbmVudCB7fVxuIiwiPG5nLWNvbnRlbnQ+PC9uZy1jb250ZW50PlxuIl19
@@ -1,14 +0,0 @@
1
- export function parseAffixHorizontalAlignment(alignment) {
2
- switch (alignment) {
3
- case 'center':
4
- return 'center';
5
- case 'left':
6
- return 'left';
7
- case 'right':
8
- return 'right';
9
- /* istanbul ignore next */
10
- default:
11
- throw `SkyAffixHorizontalAlignment does not have a matching value for '${alignment}'!`;
12
- }
13
- }
14
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHJvcGRvd24tZXh0ZW5zaW9ucy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3BvcG92ZXJzL3NyYy9tb2R1bGVzL2Ryb3Bkb3duL2Ryb3Bkb3duLWV4dGVuc2lvbnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBSUEsTUFBTSxVQUFVLDZCQUE2QixDQUMzQyxTQUF5QztJQUV6QyxRQUFRLFNBQVMsRUFBRTtRQUNqQixLQUFLLFFBQVE7WUFDWCxPQUFPLFFBQVEsQ0FBQztRQUNsQixLQUFLLE1BQU07WUFDVCxPQUFPLE1BQU0sQ0FBQztRQUNoQixLQUFLLE9BQU87WUFDVixPQUFPLE9BQU8sQ0FBQztRQUNqQiwwQkFBMEI7UUFDMUI7WUFDRSxNQUFNLG1FQUFtRSxTQUFTLElBQUksQ0FBQztLQUMxRjtBQUNILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBTa3lBZmZpeEhvcml6b250YWxBbGlnbm1lbnQgfSBmcm9tICdAc2t5dXgvY29yZSc7XG5cbmltcG9ydCB7IFNreURyb3Bkb3duSG9yaXpvbnRhbEFsaWdubWVudCB9IGZyb20gJy4vdHlwZXMvZHJvcGRvd24taG9yaXpvbnRhbC1hbGlnbm1lbnQnO1xuXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VBZmZpeEhvcml6b250YWxBbGlnbm1lbnQoXG4gIGFsaWdubWVudDogU2t5RHJvcGRvd25Ib3Jpem9udGFsQWxpZ25tZW50XG4pOiBTa3lBZmZpeEhvcml6b250YWxBbGlnbm1lbnQge1xuICBzd2l0Y2ggKGFsaWdubWVudCkge1xuICAgIGNhc2UgJ2NlbnRlcic6XG4gICAgICByZXR1cm4gJ2NlbnRlcic7XG4gICAgY2FzZSAnbGVmdCc6XG4gICAgICByZXR1cm4gJ2xlZnQnO1xuICAgIGNhc2UgJ3JpZ2h0JzpcbiAgICAgIHJldHVybiAncmlnaHQnO1xuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gICAgZGVmYXVsdDpcbiAgICAgIHRocm93IGBTa3lBZmZpeEhvcml6b250YWxBbGlnbm1lbnQgZG9lcyBub3QgaGF2ZSBhIG1hdGNoaW5nIHZhbHVlIGZvciAnJHthbGlnbm1lbnR9JyFgO1xuICB9XG59XG4iXX0=
@@ -1,72 +0,0 @@
1
- import { ChangeDetectionStrategy, Component, Input, ViewEncapsulation, } from '@angular/core';
2
- import * as i0 from "@angular/core";
3
- import * as i1 from "@angular/common";
4
- export class SkyDropdownItemComponent {
5
- constructor(elementRef, changeDetector, renderer) {
6
- this.elementRef = elementRef;
7
- this.changeDetector = changeDetector;
8
- this.renderer = renderer;
9
- this.isActive = false;
10
- this.isDisabled = false;
11
- }
12
- /**
13
- * Specifies an ARIA role for the dropdown menu item
14
- * [to support accessibility](https://developer.blackbaud.com/skyux/learn/accessibility)
15
- * by indicating how the item functions and what it controls. For information about
16
- * how an ARIA role indicates what an item represents on a web page, see the
17
- * [WAI-ARIA roles model](https://www.w3.org/WAI/PF/aria/roles).
18
- * @default "menuitem"
19
- */
20
- set ariaRole(value) {
21
- this._ariaRole = value;
22
- }
23
- get ariaRole() {
24
- return this._ariaRole || 'menuitem';
25
- }
26
- get buttonElement() {
27
- return this.elementRef.nativeElement.querySelector('button,a');
28
- }
29
- ngAfterViewInit() {
30
- this.isDisabled = !this.isFocusable();
31
- // Make sure anchor elements are tab-able.
32
- const buttonElement = this.buttonElement;
33
- /* istanbul ignore else */
34
- if (buttonElement) {
35
- this.renderer.setAttribute(buttonElement, 'tabIndex', '0');
36
- }
37
- this.changeDetector.detectChanges();
38
- }
39
- focusElement(enableNativeFocus) {
40
- this.isActive = true;
41
- if (enableNativeFocus) {
42
- this.buttonElement.focus();
43
- }
44
- this.changeDetector.detectChanges();
45
- }
46
- isFocusable() {
47
- /*tslint:disable no-null-keyword */
48
- const isFocusable = this.buttonElement &&
49
- this.buttonElement.getAttribute('disabled') === null;
50
- /*tslint:enable */
51
- return isFocusable;
52
- }
53
- resetState() {
54
- this.isActive = false;
55
- this.changeDetector.markForCheck();
56
- }
57
- }
58
- SkyDropdownItemComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.15", ngImport: i0, type: SkyDropdownItemComponent, deps: [{ token: i0.ElementRef }, { token: i0.ChangeDetectorRef }, { token: i0.Renderer2 }], target: i0.ɵɵFactoryTarget.Component });
59
- SkyDropdownItemComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.15", 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 'sky-dropdown-item-disabled': isDisabled\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,.sky-dropdown-item:hover{background-color:#eeeeef}.sky-dropdown-item.sky-dropdown-item-disabled{cursor:default}.sky-dropdown-item.sky-dropdown-item-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:8px 20px;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,.sky-theme-modern .sky-dropdown-item>a:active,.sky-theme-modern .sky-dropdown-item>button:focus,.sky-theme-modern .sky-dropdown-item>button:active{outline:solid 2px #1870B8;outline-offset:-2px}.sky-theme-modern .sky-dropdown-item>a:focus:not(:active),.sky-theme-modern .sky-dropdown-item>button:focus: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"], directives: [{ type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
60
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.15", ngImport: i0, type: SkyDropdownItemComponent, decorators: [{
61
- type: Component,
62
- args: [{
63
- selector: 'sky-dropdown-item',
64
- templateUrl: './dropdown-item.component.html',
65
- styleUrls: ['./dropdown-item.component.scss'],
66
- changeDetection: ChangeDetectionStrategy.OnPush,
67
- encapsulation: ViewEncapsulation.None,
68
- }]
69
- }], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i0.ChangeDetectorRef }, { type: i0.Renderer2 }]; }, propDecorators: { ariaRole: [{
70
- type: Input
71
- }] } });
72
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHJvcGRvd24taXRlbS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9wb3BvdmVycy9zcmMvbW9kdWxlcy9kcm9wZG93bi9kcm9wZG93bi1pdGVtLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3BvcG92ZXJzL3NyYy9tb2R1bGVzL2Ryb3Bkb3duL2Ryb3Bkb3duLWl0ZW0uY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUVMLHVCQUF1QixFQUV2QixTQUFTLEVBRVQsS0FBSyxFQUVMLGlCQUFpQixHQUNsQixNQUFNLGVBQWUsQ0FBQzs7O0FBU3ZCLE1BQU0sT0FBTyx3QkFBd0I7SUE0Qm5DLFlBQ1MsVUFBc0IsRUFDckIsY0FBaUMsRUFDakMsUUFBbUI7UUFGcEIsZUFBVSxHQUFWLFVBQVUsQ0FBWTtRQUNyQixtQkFBYyxHQUFkLGNBQWMsQ0FBbUI7UUFDakMsYUFBUSxHQUFSLFFBQVEsQ0FBVztRQVR0QixhQUFRLEdBQUcsS0FBSyxDQUFDO1FBRWpCLGVBQVUsR0FBRyxLQUFLLENBQUM7SUFRdkIsQ0FBQztJQS9CSjs7Ozs7OztPQU9HO0lBQ0gsSUFDVyxRQUFRLENBQUMsS0FBYTtRQUMvQixJQUFJLENBQUMsU0FBUyxHQUFHLEtBQUssQ0FBQztJQUN6QixDQUFDO0lBRUQsSUFBVyxRQUFRO1FBQ2pCLE9BQU8sSUFBSSxDQUFDLFNBQVMsSUFBSSxVQUFVLENBQUM7SUFDdEMsQ0FBQztJQUVELElBQVcsYUFBYTtRQUN0QixPQUFPLElBQUksQ0FBQyxVQUFVLENBQUMsYUFBYSxDQUFDLGFBQWEsQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUNqRSxDQUFDO0lBY00sZUFBZTtRQUNwQixJQUFJLENBQUMsVUFBVSxHQUFHLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBRXRDLDBDQUEwQztRQUMxQyxNQUFNLGFBQWEsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDO1FBQ3pDLDBCQUEwQjtRQUMxQixJQUFJLGFBQWEsRUFBRTtZQUNqQixJQUFJLENBQUMsUUFBUSxDQUFDLFlBQVksQ0FBQyxhQUFhLEVBQUUsVUFBVSxFQUFFLEdBQUcsQ0FBQyxDQUFDO1NBQzVEO1FBRUQsSUFBSSxDQUFDLGNBQWMsQ0FBQyxhQUFhLEVBQUUsQ0FBQztJQUN0QyxDQUFDO0lBRU0sWUFBWSxDQUFDLGlCQUEwQjtRQUM1QyxJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQztRQUVyQixJQUFJLGlCQUFpQixFQUFFO1lBQ3JCLElBQUksQ0FBQyxhQUFhLENBQUMsS0FBSyxFQUFFLENBQUM7U0FDNUI7UUFFRCxJQUFJLENBQUMsY0FBYyxDQUFDLGFBQWEsRUFBRSxDQUFDO0lBQ3RDLENBQUM7SUFFTSxXQUFXO1FBQ2hCLG1DQUFtQztRQUNuQyxNQUFNLFdBQVcsR0FDZixJQUFJLENBQUMsYUFBYTtZQUNsQixJQUFJLENBQUMsYUFBYSxDQUFDLFlBQVksQ0FBQyxVQUFVLENBQUMsS0FBSyxJQUFJLENBQUM7UUFDdkQsa0JBQWtCO1FBQ2xCLE9BQU8sV0FBVyxDQUFDO0lBQ3JCLENBQUM7SUFFTSxVQUFVO1FBQ2YsSUFBSSxDQUFDLFFBQVEsR0FBRyxLQUFLLENBQUM7UUFDdEIsSUFBSSxDQUFDLGNBQWMsQ0FBQyxZQUFZLEVBQUUsQ0FBQztJQUNyQyxDQUFDOztzSEFyRVUsd0JBQXdCOzBHQUF4Qix3QkFBd0IsMkZDbEJyQyw2TkFVQTs0RkRRYSx3QkFBd0I7a0JBUHBDLFNBQVM7bUJBQUM7b0JBQ1QsUUFBUSxFQUFFLG1CQUFtQjtvQkFDN0IsV0FBVyxFQUFFLGdDQUFnQztvQkFDN0MsU0FBUyxFQUFFLENBQUMsZ0NBQWdDLENBQUM7b0JBQzdDLGVBQWUsRUFBRSx1QkFBdUIsQ0FBQyxNQUFNO29CQUMvQyxhQUFhLEVBQUUsaUJBQWlCLENBQUMsSUFBSTtpQkFDdEM7eUpBV1ksUUFBUTtzQkFEbEIsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIEFmdGVyVmlld0luaXQsXG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgQ29tcG9uZW50LFxuICBFbGVtZW50UmVmLFxuICBJbnB1dCxcbiAgUmVuZGVyZXIyLFxuICBWaWV3RW5jYXBzdWxhdGlvbixcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3NreS1kcm9wZG93bi1pdGVtJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2Ryb3Bkb3duLWl0ZW0uY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9kcm9wZG93bi1pdGVtLmNvbXBvbmVudC5zY3NzJ10sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lLFxufSlcbmV4cG9ydCBjbGFzcyBTa3lEcm9wZG93bkl0ZW1Db21wb25lbnQgaW1wbGVtZW50cyBBZnRlclZpZXdJbml0IHtcbiAgLyoqXG4gICAqIFNwZWNpZmllcyBhbiBBUklBIHJvbGUgZm9yIHRoZSBkcm9wZG93biBtZW51IGl0ZW1cbiAgICogW3RvIHN1cHBvcnQgYWNjZXNzaWJpbGl0eV0oaHR0cHM6Ly9kZXZlbG9wZXIuYmxhY2tiYXVkLmNvbS9za3l1eC9sZWFybi9hY2Nlc3NpYmlsaXR5KVxuICAgKiBieSBpbmRpY2F0aW5nIGhvdyB0aGUgaXRlbSBmdW5jdGlvbnMgYW5kIHdoYXQgaXQgY29udHJvbHMuIEZvciBpbmZvcm1hdGlvbiBhYm91dFxuICAgKiBob3cgYW4gQVJJQSByb2xlIGluZGljYXRlcyB3aGF0IGFuIGl0ZW0gcmVwcmVzZW50cyBvbiBhIHdlYiBwYWdlLCBzZWUgdGhlXG4gICAqIFtXQUktQVJJQSByb2xlcyBtb2RlbF0oaHR0cHM6Ly93d3cudzMub3JnL1dBSS9QRi9hcmlhL3JvbGVzKS5cbiAgICogQGRlZmF1bHQgXCJtZW51aXRlbVwiXG4gICAqL1xuICBASW5wdXQoKVxuICBwdWJsaWMgc2V0IGFyaWFSb2xlKHZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLl9hcmlhUm9sZSA9IHZhbHVlO1xuICB9XG5cbiAgcHVibGljIGdldCBhcmlhUm9sZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9hcmlhUm9sZSB8fCAnbWVudWl0ZW0nO1xuICB9XG5cbiAgcHVibGljIGdldCBidXR0b25FbGVtZW50KCk6IEhUTUxCdXR0b25FbGVtZW50IHtcbiAgICByZXR1cm4gdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvcignYnV0dG9uLGEnKTtcbiAgfVxuXG4gIHB1YmxpYyBpc0FjdGl2ZSA9IGZhbHNlO1xuXG4gIHB1YmxpYyBpc0Rpc2FibGVkID0gZmFsc2U7XG5cbiAgcHJpdmF0ZSBfYXJpYVJvbGU6IHN0cmluZztcblxuICBwdWJsaWMgY29uc3RydWN0b3IoXG4gICAgcHVibGljIGVsZW1lbnRSZWY6IEVsZW1lbnRSZWYsXG4gICAgcHJpdmF0ZSBjaGFuZ2VEZXRlY3RvcjogQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgcHJpdmF0ZSByZW5kZXJlcjogUmVuZGVyZXIyXG4gICkge31cblxuICBwdWJsaWMgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xuICAgIHRoaXMuaXNEaXNhYmxlZCA9ICF0aGlzLmlzRm9jdXNhYmxlKCk7XG5cbiAgICAvLyBNYWtlIHN1cmUgYW5jaG9yIGVsZW1lbnRzIGFyZSB0YWItYWJsZS5cbiAgICBjb25zdCBidXR0b25FbGVtZW50ID0gdGhpcy5idXR0b25FbGVtZW50O1xuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovXG4gICAgaWYgKGJ1dHRvbkVsZW1lbnQpIHtcbiAgICAgIHRoaXMucmVuZGVyZXIuc2V0QXR0cmlidXRlKGJ1dHRvbkVsZW1lbnQsICd0YWJJbmRleCcsICcwJyk7XG4gICAgfVxuXG4gICAgdGhpcy5jaGFuZ2VEZXRlY3Rvci5kZXRlY3RDaGFuZ2VzKCk7XG4gIH1cblxuICBwdWJsaWMgZm9jdXNFbGVtZW50KGVuYWJsZU5hdGl2ZUZvY3VzOiBib29sZWFuKTogdm9pZCB7XG4gICAgdGhpcy5pc0FjdGl2ZSA9IHRydWU7XG5cbiAgICBpZiAoZW5hYmxlTmF0aXZlRm9jdXMpIHtcbiAgICAgIHRoaXMuYnV0dG9uRWxlbWVudC5mb2N1cygpO1xuICAgIH1cblxuICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3IuZGV0ZWN0Q2hhbmdlcygpO1xuICB9XG5cbiAgcHVibGljIGlzRm9jdXNhYmxlKCk6IGJvb2xlYW4ge1xuICAgIC8qdHNsaW50OmRpc2FibGUgbm8tbnVsbC1rZXl3b3JkICovXG4gICAgY29uc3QgaXNGb2N1c2FibGUgPVxuICAgICAgdGhpcy5idXR0b25FbGVtZW50ICYmXG4gICAgICB0aGlzLmJ1dHRvbkVsZW1lbnQuZ2V0QXR0cmlidXRlKCdkaXNhYmxlZCcpID09PSBudWxsO1xuICAgIC8qdHNsaW50OmVuYWJsZSAqL1xuICAgIHJldHVybiBpc0ZvY3VzYWJsZTtcbiAgfVxuXG4gIHB1YmxpYyByZXNldFN0YXRlKCk6IHZvaWQge1xuICAgIHRoaXMuaXNBY3RpdmUgPSBmYWxzZTtcbiAgICB0aGlzLmNoYW5nZURldGVjdG9yLm1hcmtGb3JDaGVjaygpO1xuICB9XG59XG4iLCI8ZGl2XG4gIGNsYXNzPVwic2t5LWRyb3Bkb3duLWl0ZW1cIlxuICBbYXR0ci5yb2xlXT1cImFyaWFSb2xlXCJcbiAgW25nQ2xhc3NdPVwie1xuICAgICdza3ktZHJvcGRvd24taXRlbS1hY3RpdmUnOiBpc0FjdGl2ZSxcbiAgICAnc2t5LWRyb3Bkb3duLWl0ZW0tZGlzYWJsZWQnOiBpc0Rpc2FibGVkXG4gIH1cIlxuPlxuICA8bmctY29udGVudD4gPC9uZy1jb250ZW50PlxuPC9kaXY+XG4iXX0=
@@ -1,306 +0,0 @@
1
- import { ChangeDetectionStrategy, Component, ContentChildren, EventEmitter, Input, Optional, Output, ViewEncapsulation, } from '@angular/core';
2
- import { fromEvent as observableFromEvent, Subject } 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
- export class SkyDropdownMenuComponent {
10
- constructor(changeDetector, elementRef, dropdownComponent) {
11
- this.changeDetector = changeDetector;
12
- this.elementRef = elementRef;
13
- this.dropdownComponent = dropdownComponent;
14
- /**
15
- * Fires when the dropdown menu's active index or selected item changes. This event provides an
16
- * observable to emit changes, and the response is of
17
- * the SkyDropdownMenuChange type.
18
- */
19
- this.menuChanges = new EventEmitter();
20
- this.dropdownMenuId = `sky-dropdown-menu-${++nextId}`;
21
- this.ngUnsubscribe = new Subject();
22
- this._menuIndex = 0;
23
- }
24
- /**
25
- * Specifies an ARIA role for the dropdown menu
26
- * [to support accessibility](https://developer.blackbaud.com/skyux/learn/accessibility)
27
- * by indicating how the dropdown menu functions and what it controls. The dropdown button
28
- * inherits this value to set its `aria-haspopup` property. For information
29
- * about how an ARIA role indicates what an item represents on a web page, see the
30
- * [WAI-ARIA roles model](https://www.w3.org/WAI/PF/aria/roles).
31
- * @default "menu"
32
- */
33
- set ariaRole(value) {
34
- this._ariaRole = value;
35
- }
36
- get ariaRole() {
37
- return this._ariaRole || 'menu';
38
- }
39
- /**
40
- * Indicates whether to use the browser's native focus function when users navigate through menu
41
- * items with the keyboard. To disable the native focus function, set this property to `false`.
42
- * For example, to let users interact with the dropdown menu but keep the keyboard focus on a
43
- * different element, set this property to `false`.
44
- * @default true
45
- */
46
- set useNativeFocus(value) {
47
- this._useNativeFocus = value;
48
- }
49
- get useNativeFocus() {
50
- if (this._useNativeFocus === undefined) {
51
- return true;
52
- }
53
- return this._useNativeFocus;
54
- }
55
- get hasFocusableItems() {
56
- const found = this.menuItems.find((item) => item.isFocusable());
57
- return found !== undefined;
58
- }
59
- set menuIndex(value) {
60
- if (value < 0) {
61
- value = this.menuItems.length - 1;
62
- }
63
- if (value >= this.menuItems.length) {
64
- value = 0;
65
- }
66
- this._menuIndex = value;
67
- }
68
- get menuIndex() {
69
- return this._menuIndex;
70
- }
71
- ngAfterContentInit() {
72
- /* istanbul ignore else */
73
- if (this.dropdownComponent) {
74
- this.dropdownComponent.menuId = this.dropdownMenuId;
75
- this.dropdownComponent.menuAriaRole = this.ariaRole;
76
- this.dropdownComponent.messageStream
77
- .pipe(takeUntil(this.ngUnsubscribe))
78
- .subscribe((message) => {
79
- /* tslint:disable-next-line:switch-default */
80
- switch (message.type) {
81
- case SkyDropdownMessageType.Open:
82
- case SkyDropdownMessageType.Close:
83
- this.reset();
84
- break;
85
- case SkyDropdownMessageType.FocusFirstItem:
86
- this.focusFirstItem();
87
- break;
88
- case SkyDropdownMessageType.FocusNextItem:
89
- this.focusNextItem();
90
- break;
91
- case SkyDropdownMessageType.FocusPreviousItem:
92
- this.focusPreviousItem();
93
- break;
94
- case SkyDropdownMessageType.FocusLastItem:
95
- this.focusLastItem();
96
- break;
97
- }
98
- });
99
- this.menuChanges
100
- .pipe(takeUntil(this.ngUnsubscribe))
101
- .subscribe((change) => {
102
- // Close the dropdown when a menu item is selected.
103
- if (change.selectedItem) {
104
- this.sendMessage(SkyDropdownMessageType.Close);
105
- this.sendMessage(SkyDropdownMessageType.FocusTriggerButton);
106
- }
107
- if (change.items) {
108
- // Update the popover style and position whenever the number of items changes.
109
- this.sendMessage(SkyDropdownMessageType.Reposition);
110
- }
111
- });
112
- }
113
- // Reset dropdown whenever the menu items change.
114
- this.menuItems.changes
115
- .pipe(takeUntil(this.ngUnsubscribe))
116
- .subscribe((items) => {
117
- this.reset();
118
- this.menuChanges.emit({
119
- items: items.toArray(),
120
- });
121
- });
122
- this.addEventListeners();
123
- }
124
- ngOnDestroy() {
125
- this.ngUnsubscribe.next();
126
- this.ngUnsubscribe.complete();
127
- this.ngUnsubscribe = undefined;
128
- }
129
- focusFirstItem() {
130
- if (!this.hasFocusableItems) {
131
- return;
132
- }
133
- this.menuIndex = 0;
134
- const firstItem = this.getItemByIndex(this.menuIndex);
135
- if (firstItem && firstItem.isFocusable()) {
136
- this.focusItem(firstItem);
137
- }
138
- else {
139
- this.focusNextItem();
140
- }
141
- }
142
- focusLastItem() {
143
- if (!this.hasFocusableItems) {
144
- return;
145
- }
146
- this.menuIndex = this.menuItems.length - 1;
147
- const lastItem = this.getItemByIndex(this.menuIndex);
148
- if (lastItem && lastItem.isFocusable()) {
149
- this.focusItem(lastItem);
150
- }
151
- else {
152
- this.focusPreviousItem();
153
- }
154
- }
155
- focusPreviousItem() {
156
- if (!this.hasFocusableItems) {
157
- return;
158
- }
159
- this.menuIndex--;
160
- const previousItem = this.getItemByIndex(this.menuIndex);
161
- if (previousItem && previousItem.isFocusable()) {
162
- this.focusItem(previousItem);
163
- }
164
- else {
165
- this.focusPreviousItem();
166
- }
167
- }
168
- focusNextItem() {
169
- if (!this.hasFocusableItems) {
170
- return;
171
- }
172
- this.menuIndex++;
173
- const nextItem = this.getItemByIndex(this.menuIndex);
174
- if (nextItem && nextItem.isFocusable()) {
175
- this.focusItem(nextItem);
176
- }
177
- else {
178
- this.focusNextItem();
179
- }
180
- }
181
- reset() {
182
- this._menuIndex = -1;
183
- this.resetItemsActiveState();
184
- this.changeDetector.markForCheck();
185
- }
186
- resetItemsActiveState() {
187
- this.menuItems.forEach((item) => {
188
- item.resetState();
189
- });
190
- }
191
- focusItem(item) {
192
- this.resetItemsActiveState();
193
- item.focusElement(this.useNativeFocus);
194
- this.menuChanges.emit({
195
- activeIndex: this.menuIndex,
196
- });
197
- }
198
- getItemByIndex(index) {
199
- return this.menuItems.find((item, i) => {
200
- return i === index;
201
- });
202
- }
203
- selectItemByEventTarget(target) {
204
- const selectedItem = this.menuItems.find((item, i) => {
205
- const found = item.elementRef.nativeElement.contains(target);
206
- if (found) {
207
- this.menuIndex = i;
208
- this.menuChanges.next({
209
- activeIndex: this.menuIndex,
210
- });
211
- }
212
- return found;
213
- });
214
- /* istanbul ignore else */
215
- if (selectedItem) {
216
- this.menuChanges.next({
217
- selectedItem,
218
- });
219
- }
220
- }
221
- sendMessage(type) {
222
- this.dropdownComponent.messageStream.next({ type });
223
- }
224
- addEventListeners() {
225
- const dropdownMenuElement = this.elementRef.nativeElement;
226
- observableFromEvent(dropdownMenuElement, 'click')
227
- .pipe(takeUntil(this.ngUnsubscribe))
228
- .subscribe((event) => {
229
- this.selectItemByEventTarget(event.target);
230
- });
231
- observableFromEvent(dropdownMenuElement, 'keydown')
232
- .pipe(takeUntil(this.ngUnsubscribe))
233
- .subscribe((event) => {
234
- const key = event.key.toLowerCase();
235
- /*tslint:disable-next-line:switch-default*/
236
- switch (key) {
237
- case 'escape':
238
- this.sendMessage(SkyDropdownMessageType.Close);
239
- this.sendMessage(SkyDropdownMessageType.FocusTriggerButton);
240
- event.stopPropagation();
241
- event.preventDefault();
242
- break;
243
- case 'arrowdown':
244
- case 'down':
245
- this.focusNextItem();
246
- event.preventDefault();
247
- break;
248
- case 'arrowup':
249
- case 'up':
250
- this.focusPreviousItem();
251
- event.preventDefault();
252
- break;
253
- case 'tab':
254
- if (this.dropdownComponent.dismissOnBlur) {
255
- this.sendMessage(SkyDropdownMessageType.Close);
256
- }
257
- this.sendMessage(SkyDropdownMessageType.FocusTriggerButton);
258
- break;
259
- }
260
- });
261
- observableFromEvent(dropdownMenuElement, 'mouseenter')
262
- .pipe(takeUntil(this.ngUnsubscribe))
263
- .subscribe(() => {
264
- this.dropdownComponent.isMouseEnter = true;
265
- });
266
- observableFromEvent(dropdownMenuElement, 'mouseleave')
267
- .pipe(takeUntil(this.ngUnsubscribe))
268
- .subscribe(() => {
269
- this.dropdownComponent.isMouseEnter = false;
270
- // Allow the dropdown component to set isMouseEnter before checking if the close action
271
- // should be taken.
272
- setTimeout(() => {
273
- if (this.dropdownComponent.trigger === 'hover' &&
274
- this.dropdownComponent.isMouseEnter === false) {
275
- this.sendMessage(SkyDropdownMessageType.Close);
276
- }
277
- });
278
- });
279
- }
280
- }
281
- SkyDropdownMenuComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.15", ngImport: i0, type: SkyDropdownMenuComponent, deps: [{ token: i0.ChangeDetectorRef }, { token: i0.ElementRef }, { token: i1.SkyDropdownComponent, optional: true }], target: i0.ɵɵFactoryTarget.Component });
282
- SkyDropdownMenuComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.15", 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-theme-mode-dark .sky-dropdown-menu{background-color:#252a2e;color:#fff}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
283
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.15", ngImport: i0, type: SkyDropdownMenuComponent, decorators: [{
284
- type: Component,
285
- args: [{
286
- selector: 'sky-dropdown-menu',
287
- templateUrl: './dropdown-menu.component.html',
288
- styleUrls: ['./dropdown-menu.component.scss'],
289
- changeDetection: ChangeDetectionStrategy.OnPush,
290
- encapsulation: ViewEncapsulation.None,
291
- }]
292
- }], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }, { type: i0.ElementRef }, { type: i1.SkyDropdownComponent, decorators: [{
293
- type: Optional
294
- }] }]; }, propDecorators: { ariaLabelledBy: [{
295
- type: Input
296
- }], ariaRole: [{
297
- type: Input
298
- }], useNativeFocus: [{
299
- type: Input
300
- }], menuChanges: [{
301
- type: Output
302
- }], menuItems: [{
303
- type: ContentChildren,
304
- args: [SkyDropdownItemComponent, { descendants: true }]
305
- }] } });
306
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHJvcGRvd24tbWVudS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9wb3BvdmVycy9zcmMvbW9kdWxlcy9kcm9wZG93bi9kcm9wZG93bi1tZW51LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3BvcG92ZXJzL3NyYy9tb2R1bGVzL2Ryb3Bkb3duL2Ryb3Bkb3duLW1lbnUuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUVMLHVCQUF1QixFQUV2QixTQUFTLEVBQ1QsZUFBZSxFQUVmLFlBQVksRUFDWixLQUFLLEVBRUwsUUFBUSxFQUNSLE1BQU0sRUFFTixpQkFBaUIsR0FDbEIsTUFBTSxlQUFlLENBQUM7QUFFdkIsT0FBTyxFQUFFLFNBQVMsSUFBSSxtQkFBbUIsRUFBRSxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFFakUsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBSTNDLE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBTXJFLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLCtCQUErQixDQUFDOzs7QUFFdkUsSUFBSSxNQUFNLEdBQUcsQ0FBQyxDQUFDO0FBU2YsTUFBTSxPQUFPLHdCQUF3QjtJQXlGbkMsWUFDVSxjQUFpQyxFQUNqQyxVQUFzQixFQUNWLGlCQUF1QztRQUZuRCxtQkFBYyxHQUFkLGNBQWMsQ0FBbUI7UUFDakMsZUFBVSxHQUFWLFVBQVUsQ0FBWTtRQUNWLHNCQUFpQixHQUFqQixpQkFBaUIsQ0FBc0I7UUE3QzdEOzs7O1dBSUc7UUFFSSxnQkFBVyxHQUFHLElBQUksWUFBWSxFQUF5QixDQUFDO1FBRXhELG1CQUFjLEdBQVcscUJBQXFCLEVBQUUsTUFBTSxFQUFFLENBQUM7UUEwQnhELGtCQUFhLEdBQUcsSUFBSSxPQUFPLEVBQUUsQ0FBQztRQUk5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O2FBQ25ELElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDO2FBQ25DLFNBQVMsQ0FBQyxHQUFHLEVBQUU7WUFDZCxJQUFJLENBQUMsaUJBQWlCLENBQUMsWUFBWSxHQUFHLEtBQUssQ0FBQztZQUM1Qyx1RkFBdUY7WUFDdkYsbUJBQW1CO1lBQ25CLFVBQVUsQ0FBQyxHQUFHLEVBQUU7Z0JBQ2QsSUFDRSxJQUFJLENBQUMsaUJBQWlCLENBQUMsT0FBTyxLQUFLLE9BQU87b0JBQzFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxZQUFZLEtBQUssS0FBSyxFQUM3QztvQkFDQSxJQUFJLENBQUMsV0FBVyxDQUFDLHNCQUFzQixDQUFDLEtBQUssQ0FBQyxDQUFDO2lCQUNoRDtZQUNILENBQUMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDOztzSEF2VlUsd0JBQXdCOzBHQUF4Qix3QkFBd0Isa09BOEVsQix3QkFBd0IsZ0RDckgzQywrTUFRQTs0RkQrQmEsd0JBQXdCO2tCQVBwQyxTQUFTO21CQUFDO29CQUNULFFBQVEsRUFBRSxtQkFBbUI7b0JBQzdCLFdBQVcsRUFBRSxnQ0FBZ0M7b0JBQzdDLFNBQVMsRUFBRSxDQUFDLGdDQUFnQyxDQUFDO29CQUM3QyxlQUFlLEVBQUUsdUJBQXVCLENBQUMsTUFBTTtvQkFDL0MsYUFBYSxFQUFFLGlCQUFpQixDQUFDLElBQUk7aUJBQ3RDOzswQkE2RkksUUFBUTs0Q0FyRkosY0FBYztzQkFEcEIsS0FBSztnQkFhSyxRQUFRO3NCQURsQixLQUFLO2dCQWlCSyxjQUFjO3NCQUR4QixLQUFLO2dCQW1CQyxXQUFXO3NCQURqQixNQUFNO2dCQTJCQSxTQUFTO3NCQURmLGVBQWU7dUJBQUMsd0JBQXdCLEVBQUUsRUFBRSxXQUFXLEVBQUUsSUFBSSxFQUFFIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQWZ0ZXJDb250ZW50SW5pdCxcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENoYW5nZURldGVjdG9yUmVmLFxuICBDb21wb25lbnQsXG4gIENvbnRlbnRDaGlsZHJlbixcbiAgRWxlbWVudFJlZixcbiAgRXZlbnRFbWl0dGVyLFxuICBJbnB1dCxcbiAgT25EZXN0cm95LFxuICBPcHRpb25hbCxcbiAgT3V0cHV0LFxuICBRdWVyeUxpc3QsXG4gIFZpZXdFbmNhcHN1bGF0aW9uLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuaW1wb3J0IHsgZnJvbUV2ZW50IGFzIG9ic2VydmFibGVGcm9tRXZlbnQsIFN1YmplY3QgfSBmcm9tICdyeGpzJztcblxuaW1wb3J0IHsgdGFrZVVudGlsIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuXG5pbXBvcnQgeyBTa3lEcm9wZG93bkNvbXBvbmVudCB9IGZyb20gJy4vZHJvcGRvd24uY29tcG9uZW50JztcblxuaW1wb3J0IHsgU2t5RHJvcGRvd25JdGVtQ29tcG9uZW50IH0gZnJvbSAnLi9kcm9wZG93bi1pdGVtLmNvbXBvbmVudCc7XG5cbmltcG9ydCB7IFNreURyb3Bkb3duTWVudUNoYW5nZSB9IGZyb20gJy4vdHlwZXMvZHJvcGRvd24tbWVudS1jaGFuZ2UnO1xuXG5pbXBvcnQgeyBTa3lEcm9wZG93bk1lc3NhZ2UgfSBmcm9tICcuL3R5cGVzL2Ryb3Bkb3duLW1lc3NhZ2UnO1xuXG5pbXBvcnQgeyBTa3lEcm9wZG93bk1lc3NhZ2VUeXBlIH0gZnJvbSAnLi90eXBlcy9kcm9wZG93bi1tZXNzYWdlLXR5cGUnO1xuXG5sZXQgbmV4dElkID0gMDtcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnc2t5LWRyb3Bkb3duLW1lbnUnLFxuICB0ZW1wbGF0ZVVybDogJy4vZHJvcGRvd24tbWVudS5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2Ryb3Bkb3duLW1lbnUuY29tcG9uZW50LnNjc3MnXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmUsXG59KVxuZXhwb3J0IGNsYXNzIFNreURyb3Bkb3duTWVudUNvbXBvbmVudCBpbXBsZW1lbnRzIEFmdGVyQ29udGVudEluaXQsIE9uRGVzdHJveSB7XG4gIC8qKlxuICAgKiBTcGVjaWZpZXMgdGhlIEhUTUwgZWxlbWVudCBJRCAod2l0aG91dCB0aGUgbGVhZGluZyBgI2ApIG9mIHRoZSBlbGVtZW50IHRoYXQgbGFiZWxzXG4gICAqIHRoZSBkcm9wZG93biBtZW51LiBUaGlzIHNldHMgdGhlIGRyb3Bkb3duIG1lbnUncyBgYXJpYS1sYWJlbGxlZGJ5YCBhdHRyaWJ1dGVcbiAgICogW3RvIHN1cHBvcnQgYWNjZXNzaWJpbGl0eV0oaHR0cHM6Ly9kZXZlbG9wZXIuYmxhY2tiYXVkLmNvbS9za3l1eC9sZWFybi9hY2Nlc3NpYmlsaXR5KS5cbiAgICovXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBhcmlhTGFiZWxsZWRCeTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBTcGVjaWZpZXMgYW4gQVJJQSByb2xlIGZvciB0aGUgZHJvcGRvd24gbWVudVxuICAgKiBbdG8gc3VwcG9ydCBhY2Nlc3NpYmlsaXR5XShodHRwczovL2RldmVsb3Blci5ibGFja2JhdWQuY29tL3NreXV4L2xlYXJuL2FjY2Vzc2liaWxpdHkpXG4gICAqIGJ5IGluZGljYXRpbmcgaG93IHRoZSBkcm9wZG93biBtZW51IGZ1bmN0aW9ucyBhbmQgd2hhdCBpdCBjb250cm9scy4gVGhlIGRyb3Bkb3duIGJ1dHRvblxuICAgKiBpbmhlcml0cyB0aGlzIHZhbHVlIHRvIHNldCBpdHMgYGFyaWEtaGFzcG9wdXBgIHByb3BlcnR5LiBGb3IgaW5mb3JtYXRpb25cbiAgICogYWJvdXQgaG93IGFuIEFSSUEgcm9sZSBpbmRpY2F0ZXMgd2hhdCBhbiBpdGVtIHJlcHJlc2VudHMgb24gYSB3ZWIgcGFnZSwgc2VlIHRoZVxuICAgKiBbV0FJLUFSSUEgcm9sZXMgbW9kZWxdKGh0dHBzOi8vd3d3LnczLm9yZy9XQUkvUEYvYXJpYS9yb2xlcykuXG4gICAqIEBkZWZhdWx0IFwibWVudVwiXG4gICAqL1xuICBASW5wdXQoKVxuICBwdWJsaWMgc2V0IGFyaWFSb2xlKHZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLl9hcmlhUm9sZSA9IHZhbHVlO1xuICB9XG5cbiAgcHVibGljIGdldCBhcmlhUm9sZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9hcmlhUm9sZSB8fCAnbWVudSc7XG4gIH1cblxuICAvKipcbiAgICogSW5kaWNhdGVzIHdoZXRoZXIgdG8gdXNlIHRoZSBicm93c2VyJ3MgbmF0aXZlIGZvY3VzIGZ1bmN0aW9uIHdoZW4gdXNlcnMgbmF2aWdhdGUgdGhyb3VnaCBtZW51XG4gICAqIGl0ZW1zIHdpdGggdGhlIGtleWJvYXJkLiBUbyBkaXNhYmxlIHRoZSBuYXRpdmUgZm9jdXMgZnVuY3Rpb24sIHNldCB0aGlzIHByb3BlcnR5IHRvIGBmYWxzZWAuXG4gICAqIEZvciBleGFtcGxlLCB0byBsZXQgdXNlcnMgaW50ZXJhY3Qgd2l0aCB0aGUgZHJvcGRvd24gbWVudSBidXQga2VlcCB0aGUga2V5Ym9hcmQgZm9jdXMgb24gYVxuICAgKiBkaWZmZXJlbnQgZWxlbWVudCwgc2V0IHRoaXMgcHJvcGVydHkgdG8gYGZhbHNlYC5cbiAgICogQGRlZmF1bHQgdHJ1ZVxuICAgKi9cbiAgQElucHV0KClcbiAgcHVibGljIHNldCB1c2VOYXRpdmVGb2N1cyh2YWx1ZTogYm9vbGVhbikge1xuICAgIHRoaXMuX3VzZU5hdGl2ZUZvY3VzID0gdmFsdWU7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHVzZU5hdGl2ZUZvY3VzKCk6IGJvb2xlYW4ge1xuICAgIGlmICh0aGlzLl91c2VOYXRpdmVGb2N1cyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5fdXNlTmF0aXZlRm9jdXM7XG4gIH1cblxuICAvKipcbiAgICogRmlyZXMgd2hlbiB0aGUgZHJvcGRvd24gbWVudSdzIGFjdGl2ZSBpbmRleCBvciBzZWxlY3RlZCBpdGVtIGNoYW5nZXMuIFRoaXMgZXZlbnQgcHJvdmlkZXMgYW5cbiAgICogb2JzZXJ2YWJsZSB0byBlbWl0IGNoYW5nZXMsIGFuZCB0aGUgcmVzcG9uc2UgaXMgb2ZcbiAgICogdGhlIFNreURyb3Bkb3duTWVudUNoYW5nZSB0eXBlLlxuICAgKi9cbiAgQE91dHB1dCgpXG4gIHB1YmxpYyBtZW51Q2hhbmdlcyA9IG5ldyBFdmVudEVtaXR0ZXI8U2t5RHJvcGRvd25NZW51Q2hhbmdlPigpO1xuXG4gIHB1YmxpYyBkcm9wZG93bk1lbnVJZDogc3RyaW5nID0gYHNreS1kcm9wZG93bi1tZW51LSR7KytuZXh0SWR9YDtcblxuICBwcml2YXRlIGdldCBoYXNGb2N1c2FibGVJdGVtcygpOiBib29sZWFuIHtcbiAgICBjb25zdCBmb3VuZCA9IHRoaXMubWVudUl0ZW1zLmZpbmQoKGl0ZW0pID0+IGl0ZW0uaXNGb2N1c2FibGUoKSk7XG4gICAgcmV0dXJuIGZvdW5kICE9PSB1bmRlZmluZWQ7XG4gIH1cblxuICBwdWJsaWMgc2V0IG1lbnVJbmRleCh2YWx1ZTogbnVtYmVyKSB7XG4gICAgaWYgKHZhbHVlIDwgMCkge1xuICAgICAgdmFsdWUgPSB0aGlzLm1lbnVJdGVtcy5sZW5ndGggLSAxO1xuICAgIH1cblxuICAgIGlmICh2YWx1ZSA+PSB0aGlzLm1lbnVJdGVtcy5sZW5ndGgpIHtcbiAgICAgIHZhbHVlID0gMDtcbiAgICB9XG5cbiAgICB0aGlzLl9tZW51SW5kZXggPSB2YWx1ZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgbWVudUluZGV4KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuX21lbnVJbmRleDtcbiAgfVxuXG4gIEBDb250ZW50Q2hpbGRyZW4oU2t5RHJvcGRvd25JdGVtQ29tcG9uZW50LCB7IGRlc2NlbmRhbnRzOiB0cnVlIH0pXG4gIHB1YmxpYyBtZW51SXRlbXM6IFF1ZXJ5TGlzdDxTa3lEcm9wZG93bkl0ZW1Db21wb25lbnQ+O1xuXG4gIHByaXZhdGUgbmdVbnN1YnNjcmliZSA9IG5ldyBTdWJqZWN0KCk7XG5cbiAgcHJpdmF0ZSBfYXJpYVJvbGU6IHN0cmluZztcblxuICBwcml2YXRlIF9tZW51SW5kZXggPSAwO1xuXG4gIHByaXZhdGUgX3VzZU5hdGl2ZUZvY3VzOiBib29sZWFuO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgY2hhbmdlRGV0ZWN0b3I6IENoYW5nZURldGVjdG9yUmVmLFxuICAgIHByaXZhdGUgZWxlbWVudFJlZjogRWxlbWVudFJlZixcbiAgICBAT3B0aW9uYWwoKSBwcml2YXRlIGRyb3Bkb3duQ29tcG9uZW50OiBTa3lEcm9wZG93bkNvbXBvbmVudFxuICApIHt9XG5cbiAgcHVibGljIG5nQWZ0ZXJDb250ZW50SW5pdCgpOiB2b2lkIHtcbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuICAgIGlmICh0aGlzLmRyb3Bkb3duQ29tcG9uZW50KSB7XG4gICAgICB0aGlzLmRyb3Bkb3duQ29tcG9uZW50Lm1lbnVJZCA9IHRoaXMuZHJvcGRvd25NZW51SWQ7XG4gICAgICB0aGlzLmRyb3Bkb3duQ29tcG9uZW50Lm1lbnVBcmlhUm9sZSA9IHRoaXMuYXJpYVJvbGU7XG5cbiAgICAgIHRoaXMuZHJvcGRvd25Db21wb25lbnQubWVzc2FnZVN0cmVhbVxuICAgICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5uZ1Vuc3Vic2NyaWJlKSlcbiAgICAgICAgLnN1YnNjcmliZSgobWVzc2FnZTogU2t5RHJvcGRvd25NZXNzYWdlKSA9PiB7XG4gICAgICAgICAgLyogdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOnN3aXRjaC1kZWZhdWx0ICovXG4gICAgICAgICAgc3dpdGNoIChtZXNzYWdlLnR5cGUpIHtcbiAgICAgICAgICAgIGNhc2UgU2t5RHJvcGRvd25NZXNzYWdlVHlwZS5PcGVuOlxuICAgICAgICAgICAgY2FzZSBTa3lEcm9wZG93bk1lc3NhZ2VUeXBlLkNsb3NlOlxuICAgICAgICAgICAgICB0aGlzLnJlc2V0KCk7XG4gICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICBjYXNlIFNreURyb3Bkb3duTWVzc2FnZVR5cGUuRm9jdXNGaXJzdEl0ZW06XG4gICAgICAgICAgICAgIHRoaXMuZm9jdXNGaXJzdEl0ZW0oKTtcbiAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgIGNhc2UgU2t5RHJvcGRvd25NZXNzYWdlVHlwZS5Gb2N1c05leHRJdGVtOlxuICAgICAgICAgICAgICB0aGlzLmZvY3VzTmV4dEl0ZW0oKTtcbiAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgIGNhc2UgU2t5RHJvcGRvd25NZXNzYWdlVHlwZS5Gb2N1c1ByZXZpb3VzSXRlbTpcbiAgICAgICAgICAgICAgdGhpcy5mb2N1c1ByZXZpb3VzSXRlbSgpO1xuICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgY2FzZSBTa3lEcm9wZG93bk1lc3NhZ2VUeXBlLkZvY3VzTGFzdEl0ZW06XG4gICAgICAgICAgICAgIHRoaXMuZm9jdXNMYXN0SXRlbSgpO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICB0aGlzLm1lbnVDaGFuZ2VzXG4gICAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLm5nVW5zdWJzY3JpYmUpKVxuICAgICAgICAuc3Vic2NyaWJlKChjaGFuZ2U6IFNreURyb3Bkb3duTWVudUNoYW5nZSkgPT4ge1xuICAgICAgICAgIC8vIENsb3NlIHRoZSBkcm9wZG93biB3aGVuIGEgbWVudSBpdGVtIGlzIHNlbGVjdGVkLlxuICAgICAgICAgIGlmIChjaGFuZ2Uuc2VsZWN0ZWRJdGVtKSB7XG4gICAgICAgICAgICB0aGlzLnNlbmRNZXNzYWdlKFNreURyb3Bkb3duTWVzc2FnZVR5cGUuQ2xvc2UpO1xuICAgICAgICAgICAgdGhpcy5zZW5kTWVzc2FnZShTa3lEcm9wZG93bk1lc3NhZ2VUeXBlLkZvY3VzVHJpZ2dlckJ1dHRvbik7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKGNoYW5nZS5pdGVtcykge1xuICAgICAgICAgICAgLy8gVXBkYXRlIHRoZSBwb3BvdmVyIHN0eWxlIGFuZCBwb3NpdGlvbiB3aGVuZXZlciB0aGUgbnVtYmVyIG9mIGl0ZW1zIGNoYW5nZXMuXG4gICAgICAgICAgICB0aGlzLnNlbmRNZXNzYWdlKFNreURyb3Bkb3duTWVzc2FnZVR5cGUuUmVwb3NpdGlvbik7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBSZXNldCBkcm9wZG93biB3aGVuZXZlciB0aGUgbWVudSBpdGVtcyBjaGFuZ2UuXG4gICAgdGhpcy5tZW51SXRlbXMuY2hhbmdlc1xuICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMubmdVbnN1YnNjcmliZSkpXG4gICAgICAuc3Vic2NyaWJlKChpdGVtczogUXVlcnlMaXN0PFNreURyb3Bkb3duSXRlbUNvbXBvbmVudD4pID0+IHtcbiAgICAgICAgdGhpcy5yZXNldCgpO1xuICAgICAgICB0aGlzLm1lbnVDaGFuZ2VzLmVtaXQoe1xuICAgICAgICAgIGl0ZW1zOiBpdGVtcy50b0FycmF5KCksXG4gICAgICAgIH0pO1xuICAgICAgfSk7XG5cbiAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXJzKCk7XG4gIH1cblxuICBwdWJsaWMgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5uZ1Vuc3Vic2NyaWJlLm5leHQoKTtcbiAgICB0aGlzLm5nVW5zdWJzY3JpYmUuY29tcGxldGUoKTtcbiAgICB0aGlzLm5nVW5zdWJzY3JpYmUgPSB1bmRlZmluZWQ7XG4gIH1cblxuICBwdWJsaWMgZm9jdXNGaXJzdEl0ZW0oKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmhhc0ZvY3VzYWJsZUl0ZW1zKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5tZW51SW5kZXggPSAwO1xuXG4gICAgY29uc3QgZmlyc3RJdGVtID0gdGhpcy5nZXRJdGVtQnlJbmRleCh0aGlzLm1lbnVJbmRleCk7XG4gICAgaWYgKGZpcnN0SXRlbSAmJiBmaXJzdEl0ZW0uaXNGb2N1c2FibGUoKSkge1xuICAgICAgdGhpcy5mb2N1c0l0ZW0oZmlyc3RJdGVtKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5mb2N1c05leHRJdGVtKCk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGZvY3VzTGFzdEl0ZW0oKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmhhc0ZvY3VzYWJsZUl0ZW1zKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5tZW51SW5kZXggPSB0aGlzLm1lbnVJdGVtcy5sZW5ndGggLSAxO1xuXG4gICAgY29uc3QgbGFzdEl0ZW0gPSB0aGlzLmdldEl0ZW1CeUluZGV4KHRoaXMubWVudUluZGV4KTtcbiAgICBpZiAobGFzdEl0ZW0gJiYgbGFzdEl0ZW0uaXNGb2N1c2FibGUoKSkge1xuICAgICAgdGhpcy5mb2N1c0l0ZW0obGFzdEl0ZW0pO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmZvY3VzUHJldmlvdXNJdGVtKCk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGZvY3VzUHJldmlvdXNJdGVtKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5oYXNGb2N1c2FibGVJdGVtcykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMubWVudUluZGV4LS07XG5cbiAgICBjb25zdCBwcmV2aW91c0l0ZW0gPSB0aGlzLmdldEl0ZW1CeUluZGV4KHRoaXMubWVudUluZGV4KTtcbiAgICBpZiAocHJldmlvdXNJdGVtICYmIHByZXZpb3VzSXRlbS5pc0ZvY3VzYWJsZSgpKSB7XG4gICAgICB0aGlzLmZvY3VzSXRlbShwcmV2aW91c0l0ZW0pO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmZvY3VzUHJldmlvdXNJdGVtKCk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGZvY3VzTmV4dEl0ZW0oKSB7XG4gICAgaWYgKCF0aGlzLmhhc0ZvY3VzYWJsZUl0ZW1zKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5tZW51SW5kZXgrKztcblxuICAgIGNvbnN0IG5leHRJdGVtID0gdGhpcy5nZXRJdGVtQnlJbmRleCh0aGlzLm1lbnVJbmRleCk7XG4gICAgaWYgKG5leHRJdGVtICYmIG5leHRJdGVtLmlzRm9jdXNhYmxlKCkpIHtcbiAgICAgIHRoaXMuZm9jdXNJdGVtKG5leHRJdGVtKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5mb2N1c05leHRJdGVtKCk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHJlc2V0KCk6IHZvaWQge1xuICAgIHRoaXMuX21lbnVJbmRleCA9IC0xO1xuICAgIHRoaXMucmVzZXRJdGVtc0FjdGl2ZVN0YXRlKCk7XG4gICAgdGhpcy5jaGFuZ2VEZXRlY3Rvci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIHByaXZhdGUgcmVzZXRJdGVtc0FjdGl2ZVN0YXRlKCkge1xuICAgIHRoaXMubWVudUl0ZW1zLmZvckVhY2goKGl0ZW06IFNreURyb3Bkb3duSXRlbUNvbXBvbmVudCkgPT4ge1xuICAgICAgaXRlbS5yZXNldFN0YXRlKCk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGZvY3VzSXRlbShpdGVtOiBTa3lEcm9wZG93bkl0ZW1Db21wb25lbnQpOiB2b2lkIHtcbiAgICB0aGlzLnJlc2V0SXRlbXNBY3RpdmVTdGF0ZSgpO1xuICAgIGl0ZW0uZm9jdXNFbGVtZW50KHRoaXMudXNlTmF0aXZlRm9jdXMpO1xuICAgIHRoaXMubWVudUNoYW5nZXMuZW1pdCh7XG4gICAgICBhY3RpdmVJbmRleDogdGhpcy5tZW51SW5kZXgsXG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGdldEl0ZW1CeUluZGV4KGluZGV4OiBudW1iZXIpOiBTa3lEcm9wZG93bkl0ZW1Db21wb25lbnQge1xuICAgIHJldHVybiB0aGlzLm1lbnVJdGVtcy5maW5kKChpdGVtOiBhbnksIGk6IG51bWJlcikgPT4ge1xuICAgICAgcmV0dXJuIGkgPT09IGluZGV4O1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBzZWxlY3RJdGVtQnlFdmVudFRhcmdldCh0YXJnZXQ6IEV2ZW50VGFyZ2V0KTogdm9pZCB7XG4gICAgY29uc3Qgc2VsZWN0ZWRJdGVtID0gdGhpcy5tZW51SXRlbXMuZmluZChcbiAgICAgIChpdGVtOiBTa3lEcm9wZG93bkl0ZW1Db21wb25lbnQsIGk6IG51bWJlcikgPT4ge1xuICAgICAgICBjb25zdCBmb3VuZCA9IGl0ZW0uZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LmNvbnRhaW5zKHRhcmdldCk7XG5cbiAgICAgICAgaWYgKGZvdW5kKSB7XG4gICAgICAgICAgdGhpcy5tZW51SW5kZXggPSBpO1xuICAgICAgICAgIHRoaXMubWVudUNoYW5nZXMubmV4dCh7XG4gICAgICAgICAgICBhY3RpdmVJbmRleDogdGhpcy5tZW51SW5kZXgsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZm91bmQ7XG4gICAgICB9XG4gICAgKTtcblxuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovXG4gICAgaWYgKHNlbGVjdGVkSXRlbSkge1xuICAgICAgdGhpcy5tZW51Q2hhbmdlcy5uZXh0KHtcbiAgICAgICAgc2VsZWN0ZWRJdGVtLFxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzZW5kTWVzc2FnZSh0eXBlOiBTa3lEcm9wZG93bk1lc3NhZ2VUeXBlKTogdm9pZCB7XG4gICAgdGhpcy5kcm9wZG93bkNvbXBvbmVudC5tZXNzYWdlU3RyZWFtLm5leHQoeyB0eXBlIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBhZGRFdmVudExpc3RlbmVycygpOiB2b2lkIHtcbiAgICBjb25zdCBkcm9wZG93bk1lbnVFbGVtZW50ID0gdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQ7XG5cbiAgICBvYnNlcnZhYmxlRnJvbUV2ZW50KGRyb3Bkb3duTWVudUVsZW1lbnQsICdjbGljaycpXG4gICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5uZ1Vuc3Vic2NyaWJlKSlcbiAgICAgIC5zdWJzY3JpYmUoKGV2ZW50OiBNb3VzZUV2ZW50KSA9PiB7XG4gICAgICAgIHRoaXMuc2VsZWN0SXRlbUJ5RXZlbnRUYXJnZXQoZXZlbnQudGFyZ2V0KTtcbiAgICAgIH0pO1xuXG4gICAgb2JzZXJ2YWJsZUZyb21FdmVudChkcm9wZG93bk1lbnVFbGVtZW50LCAna2V5ZG93bicpXG4gICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5uZ1Vuc3Vic2NyaWJlKSlcbiAgICAgIC5zdWJzY3JpYmUoKGV2ZW50OiBLZXlib2FyZEV2ZW50KSA9PiB7XG4gICAgICAgIGNvbnN0IGtleSA9IGV2ZW50LmtleS50b0xvd2VyQ2FzZSgpO1xuXG4gICAgICAgIC8qdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOnN3aXRjaC1kZWZhdWx0Ki9cbiAgICAgICAgc3dpdGNoIChrZXkpIHtcbiAgICAgICAgICBjYXNlICdlc2NhcGUnOlxuICAgICAgICAgICAgdGhpcy5zZW5kTWVzc2FnZShTa3lEcm9wZG93bk1lc3NhZ2VUeXBlLkNsb3NlKTtcbiAgICAgICAgICAgIHRoaXMuc2VuZE1lc3NhZ2UoU2t5RHJvcGRvd25NZXNzYWdlVHlwZS5Gb2N1c1RyaWdnZXJCdXR0b24pO1xuICAgICAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICBjYXNlICdhcnJvd2Rvd24nOlxuICAgICAgICAgIGNhc2UgJ2Rvd24nOlxuICAgICAgICAgICAgdGhpcy5mb2N1c05leHRJdGVtKCk7XG4gICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICBjYXNlICdhcnJvd3VwJzpcbiAgICAgICAgICBjYXNlICd1cCc6XG4gICAgICAgICAgICB0aGlzLmZvY3VzUHJldmlvdXNJdGVtKCk7XG4gICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICBjYXNlICd0YWInOlxuICAgICAgICAgICAgaWYgKHRoaXMuZHJvcGRvd25Db21wb25lbnQuZGlzbWlzc09uQmx1cikge1xuICAgICAgICAgICAgICB0aGlzLnNlbmRNZXNzYWdlKFNreURyb3Bkb3duTWVzc2FnZVR5cGUuQ2xvc2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5zZW5kTWVzc2FnZShTa3lEcm9wZG93bk1lc3NhZ2VUeXBlLkZvY3VzVHJpZ2dlckJ1dHRvbik7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICBvYnNlcnZhYmxlRnJvbUV2ZW50KGRyb3Bkb3duTWVudUVsZW1lbnQsICdtb3VzZWVudGVyJylcbiAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLm5nVW5zdWJzY3JpYmUpKVxuICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgIHRoaXMuZHJvcGRvd25Db21wb25lbnQuaXNNb3VzZUVudGVyID0gdHJ1ZTtcbiAgICAgIH0pO1xuXG4gICAgb2JzZXJ2YWJsZUZyb21FdmVudChkcm9wZG93bk1lbnVFbGVtZW50LCAnbW91c2VsZWF2ZScpXG4gICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5uZ1Vuc3Vic2NyaWJlKSlcbiAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICB0aGlzLmRyb3Bkb3duQ29tcG9uZW50LmlzTW91c2VFbnRlciA9IGZhbHNlO1xuICAgICAgICAvLyBBbGxvdyB0aGUgZHJvcGRvd24gY29tcG9uZW50IHRvIHNldCBpc01vdXNlRW50ZXIgYmVmb3JlIGNoZWNraW5nIGlmIHRoZSBjbG9zZSBhY3Rpb25cbiAgICAgICAgLy8gc2hvdWxkIGJlIHRha2VuLlxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICB0aGlzLmRyb3Bkb3duQ29tcG9uZW50LnRyaWdnZXIgPT09ICdob3ZlcicgJiZcbiAgICAgICAgICAgIHRoaXMuZHJvcGRvd25Db21wb25lbnQuaXNNb3VzZUVudGVyID09PSBmYWxzZVxuICAgICAgICAgICkge1xuICAgICAgICAgICAgdGhpcy5zZW5kTWVzc2FnZShTa3lEcm9wZG93bk1lc3NhZ2VUeXBlLkNsb3NlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gIH1cbn1cbiIsIjxkaXZcbiAgY2xhc3M9XCJza3ktZHJvcGRvd24tbWVudSBza3ktc2hhZG93IHNreS1lbGV2YXRpb24tNFwiXG4gIFthdHRyLmFyaWEtbGFiZWxsZWRieV09XCJhcmlhTGFiZWxsZWRCeVwiXG4gIFthdHRyLnJvbGVdPVwiYXJpYVJvbGVcIlxuICBbaWRdPVwiZHJvcGRvd25NZW51SWRcIlxuPlxuICA8bmctY29udGVudD4gPC9uZy1jb250ZW50PlxuPC9kaXY+XG4iXX0=