@skyux/popovers 5.7.2 → 6.0.0-beta.2

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 (135) hide show
  1. package/documentation.json +2 -2
  2. package/esm2020/index.mjs +23 -0
  3. package/esm2020/lib/modules/dropdown/dropdown-button.component.mjs +14 -0
  4. package/esm2020/lib/modules/dropdown/dropdown-extensions.mjs +14 -0
  5. package/esm2020/lib/modules/dropdown/dropdown-item.component.mjs +69 -0
  6. package/esm2020/lib/modules/dropdown/dropdown-menu.component.mjs +305 -0
  7. package/esm2020/lib/modules/dropdown/dropdown.component.mjs +359 -0
  8. package/esm2020/lib/modules/dropdown/dropdown.module.mjs +60 -0
  9. package/esm2020/lib/modules/dropdown/types/dropdown-horizontal-alignment.mjs +2 -0
  10. package/esm2020/lib/modules/dropdown/types/dropdown-menu-change.mjs +2 -0
  11. package/esm2020/lib/modules/dropdown/types/dropdown-message-type.mjs +40 -0
  12. package/esm2020/lib/modules/dropdown/types/dropdown-message.mjs +2 -0
  13. package/esm2020/lib/modules/dropdown/types/dropdown-trigger-type.mjs +2 -0
  14. package/esm2020/lib/modules/popover/popover-adapter.service.mjs +74 -0
  15. package/esm2020/lib/modules/popover/popover-animation-state.mjs +2 -0
  16. package/esm2020/lib/modules/popover/popover-animation.mjs +19 -0
  17. package/esm2020/lib/modules/popover/popover-content.component.mjs +261 -0
  18. package/esm2020/lib/modules/popover/popover-context.mjs +10 -0
  19. package/esm2020/lib/modules/popover/popover-extensions.mjs +29 -0
  20. package/esm2020/lib/modules/popover/popover.component.mjs +198 -0
  21. package/esm2020/lib/modules/popover/popover.directive.mjs +176 -0
  22. package/esm2020/lib/modules/popover/popover.module.mjs +55 -0
  23. package/esm2020/lib/modules/popover/types/popover-adapter-arrow-coordinates.mjs +2 -0
  24. package/esm2020/lib/modules/popover/types/popover-adapter-elements.mjs +2 -0
  25. package/esm2020/lib/modules/popover/types/popover-alignment.mjs +2 -0
  26. package/esm2020/lib/modules/popover/types/popover-message-type.mjs +24 -0
  27. package/esm2020/lib/modules/popover/types/popover-message.mjs +2 -0
  28. package/esm2020/lib/modules/popover/types/popover-placement.mjs +2 -0
  29. package/esm2020/lib/modules/popover/types/popover-position.mjs +2 -0
  30. package/esm2020/lib/modules/popover/types/popover-trigger.mjs +2 -0
  31. package/esm2020/lib/modules/shared/sky-popovers-resources.module.mjs +47 -0
  32. package/esm2020/skyux-popovers.mjs +5 -0
  33. package/esm2020/testing/dropdown/dropdown-fixture.mjs +133 -0
  34. package/esm2020/testing/dropdown/dropdown-testing.module.mjs +15 -0
  35. package/esm2020/testing/dropdown/popovers-fixture-dropdown-item.mjs +2 -0
  36. package/esm2020/testing/dropdown/popovers-fixture-dropdown-menu.mjs +2 -0
  37. package/esm2020/testing/dropdown/popovers-fixture-dropdown.mjs +2 -0
  38. package/esm2020/testing/popover/popover-fixture.mjs +86 -0
  39. package/esm2020/testing/popover/popover-testing.module.mjs +29 -0
  40. package/esm2020/testing/public-api.mjs +8 -0
  41. package/esm2020/testing/skyux-popovers-testing.mjs +5 -0
  42. package/fesm2015/{skyux-popovers-testing.js → skyux-popovers-testing.mjs} +9 -9
  43. package/fesm2015/skyux-popovers-testing.mjs.map +1 -0
  44. package/fesm2015/skyux-popovers.mjs +1705 -0
  45. package/fesm2015/skyux-popovers.mjs.map +1 -0
  46. package/fesm2020/skyux-popovers-testing.mjs +266 -0
  47. package/fesm2020/skyux-popovers-testing.mjs.map +1 -0
  48. package/{fesm2015/skyux-popovers.js → fesm2020/skyux-popovers.mjs} +53 -88
  49. package/fesm2020/skyux-popovers.mjs.map +1 -0
  50. package/package.json +40 -16
  51. package/testing/package.json +5 -5
  52. package/bundles/skyux-popovers-testing.umd.js +0 -682
  53. package/bundles/skyux-popovers.umd.js +0 -1889
  54. package/esm2015/index.js +0 -23
  55. package/esm2015/index.js.map +0 -1
  56. package/esm2015/lib/modules/dropdown/dropdown-button.component.js +0 -17
  57. package/esm2015/lib/modules/dropdown/dropdown-button.component.js.map +0 -1
  58. package/esm2015/lib/modules/dropdown/dropdown-extensions.js +0 -14
  59. package/esm2015/lib/modules/dropdown/dropdown-extensions.js.map +0 -1
  60. package/esm2015/lib/modules/dropdown/dropdown-item.component.js +0 -75
  61. package/esm2015/lib/modules/dropdown/dropdown-item.component.js.map +0 -1
  62. package/esm2015/lib/modules/dropdown/dropdown-menu.component.js +0 -311
  63. package/esm2015/lib/modules/dropdown/dropdown-menu.component.js.map +0 -1
  64. package/esm2015/lib/modules/dropdown/dropdown.component.js +0 -363
  65. package/esm2015/lib/modules/dropdown/dropdown.component.js.map +0 -1
  66. package/esm2015/lib/modules/dropdown/dropdown.module.js +0 -60
  67. package/esm2015/lib/modules/dropdown/dropdown.module.js.map +0 -1
  68. package/esm2015/lib/modules/dropdown/types/dropdown-horizontal-alignment.js +0 -2
  69. package/esm2015/lib/modules/dropdown/types/dropdown-horizontal-alignment.js.map +0 -1
  70. package/esm2015/lib/modules/dropdown/types/dropdown-menu-change.js +0 -2
  71. package/esm2015/lib/modules/dropdown/types/dropdown-menu-change.js.map +0 -1
  72. package/esm2015/lib/modules/dropdown/types/dropdown-message-type.js +0 -40
  73. package/esm2015/lib/modules/dropdown/types/dropdown-message-type.js.map +0 -1
  74. package/esm2015/lib/modules/dropdown/types/dropdown-message.js +0 -2
  75. package/esm2015/lib/modules/dropdown/types/dropdown-message.js.map +0 -1
  76. package/esm2015/lib/modules/dropdown/types/dropdown-trigger-type.js +0 -2
  77. package/esm2015/lib/modules/dropdown/types/dropdown-trigger-type.js.map +0 -1
  78. package/esm2015/lib/modules/popover/popover-adapter.service.js +0 -74
  79. package/esm2015/lib/modules/popover/popover-adapter.service.js.map +0 -1
  80. package/esm2015/lib/modules/popover/popover-animation-state.js +0 -2
  81. package/esm2015/lib/modules/popover/popover-animation-state.js.map +0 -1
  82. package/esm2015/lib/modules/popover/popover-animation.js +0 -19
  83. package/esm2015/lib/modules/popover/popover-animation.js.map +0 -1
  84. package/esm2015/lib/modules/popover/popover-content.component.js +0 -271
  85. package/esm2015/lib/modules/popover/popover-content.component.js.map +0 -1
  86. package/esm2015/lib/modules/popover/popover-context.js +0 -10
  87. package/esm2015/lib/modules/popover/popover-context.js.map +0 -1
  88. package/esm2015/lib/modules/popover/popover-extensions.js +0 -29
  89. package/esm2015/lib/modules/popover/popover-extensions.js.map +0 -1
  90. package/esm2015/lib/modules/popover/popover.component.js +0 -203
  91. package/esm2015/lib/modules/popover/popover.component.js.map +0 -1
  92. package/esm2015/lib/modules/popover/popover.directive.js +0 -176
  93. package/esm2015/lib/modules/popover/popover.directive.js.map +0 -1
  94. package/esm2015/lib/modules/popover/popover.module.js +0 -56
  95. package/esm2015/lib/modules/popover/popover.module.js.map +0 -1
  96. package/esm2015/lib/modules/popover/types/popover-adapter-arrow-coordinates.js +0 -2
  97. package/esm2015/lib/modules/popover/types/popover-adapter-arrow-coordinates.js.map +0 -1
  98. package/esm2015/lib/modules/popover/types/popover-adapter-elements.js +0 -2
  99. package/esm2015/lib/modules/popover/types/popover-adapter-elements.js.map +0 -1
  100. package/esm2015/lib/modules/popover/types/popover-alignment.js +0 -2
  101. package/esm2015/lib/modules/popover/types/popover-alignment.js.map +0 -1
  102. package/esm2015/lib/modules/popover/types/popover-message-type.js +0 -24
  103. package/esm2015/lib/modules/popover/types/popover-message-type.js.map +0 -1
  104. package/esm2015/lib/modules/popover/types/popover-message.js +0 -2
  105. package/esm2015/lib/modules/popover/types/popover-message.js.map +0 -1
  106. package/esm2015/lib/modules/popover/types/popover-placement.js +0 -2
  107. package/esm2015/lib/modules/popover/types/popover-placement.js.map +0 -1
  108. package/esm2015/lib/modules/popover/types/popover-position.js +0 -2
  109. package/esm2015/lib/modules/popover/types/popover-position.js.map +0 -1
  110. package/esm2015/lib/modules/popover/types/popover-trigger.js +0 -2
  111. package/esm2015/lib/modules/popover/types/popover-trigger.js.map +0 -1
  112. package/esm2015/lib/modules/shared/sky-popovers-resources.module.js +0 -47
  113. package/esm2015/lib/modules/shared/sky-popovers-resources.module.js.map +0 -1
  114. package/esm2015/skyux-popovers.js +0 -5
  115. package/esm2015/skyux-popovers.js.map +0 -1
  116. package/esm2015/testing/dropdown/dropdown-fixture.js +0 -138
  117. package/esm2015/testing/dropdown/dropdown-fixture.js.map +0 -1
  118. package/esm2015/testing/dropdown/dropdown-testing.module.js +0 -15
  119. package/esm2015/testing/dropdown/dropdown-testing.module.js.map +0 -1
  120. package/esm2015/testing/dropdown/popovers-fixture-dropdown-item.js +0 -2
  121. package/esm2015/testing/dropdown/popovers-fixture-dropdown-item.js.map +0 -1
  122. package/esm2015/testing/dropdown/popovers-fixture-dropdown-menu.js +0 -2
  123. package/esm2015/testing/dropdown/popovers-fixture-dropdown-menu.js.map +0 -1
  124. package/esm2015/testing/dropdown/popovers-fixture-dropdown.js +0 -2
  125. package/esm2015/testing/dropdown/popovers-fixture-dropdown.js.map +0 -1
  126. package/esm2015/testing/popover/popover-fixture.js +0 -86
  127. package/esm2015/testing/popover/popover-fixture.js.map +0 -1
  128. package/esm2015/testing/popover/popover-testing.module.js +0 -29
  129. package/esm2015/testing/popover/popover-testing.module.js.map +0 -1
  130. package/esm2015/testing/public-api.js +0 -8
  131. package/esm2015/testing/public-api.js.map +0 -1
  132. package/esm2015/testing/skyux-popovers-testing.js +0 -5
  133. package/esm2015/testing/skyux-popovers-testing.js.map +0 -1
  134. package/fesm2015/skyux-popovers-testing.js.map +0 -1
  135. package/fesm2015/skyux-popovers.js.map +0 -1
@@ -0,0 +1,1705 @@
1
+ import * as i4 from '@angular/common';
2
+ import { CommonModule } from '@angular/common';
3
+ import * as i0 from '@angular/core';
4
+ import { NgModule, Component, ChangeDetectionStrategy, ViewEncapsulation, Input, ElementRef, TemplateRef, Optional, ViewChild, EventEmitter, Output, ContentChildren, Injectable, ViewContainerRef, Directive } from '@angular/core';
5
+ import * as i1 from '@skyux/core';
6
+ import { SkyAffixAutoFitContext, SkyAffixModule, SkyOverlayModule } from '@skyux/core';
7
+ import * as i3 from '@skyux/indicators';
8
+ import { SkyIconModule } from '@skyux/indicators';
9
+ import * as i2 from '@skyux/theme';
10
+ import { SkyThemeModule } from '@skyux/theme';
11
+ import * as i5 from '@skyux/i18n';
12
+ import { getLibStringForLocale, SkyI18nModule, SKY_LIB_RESOURCES_PROVIDERS } from '@skyux/i18n';
13
+ import { Subject, fromEvent } from 'rxjs';
14
+ import { takeUntil } from 'rxjs/operators';
15
+ import { trigger, state, style, transition, animate } from '@angular/animations';
16
+
17
+ /**
18
+ * Specifies the type of message to send.
19
+ */
20
+ var SkyDropdownMessageType;
21
+ (function (SkyDropdownMessageType) {
22
+ /**
23
+ * Opens the dropdown menu.
24
+ */
25
+ SkyDropdownMessageType[SkyDropdownMessageType["Open"] = 0] = "Open";
26
+ /**
27
+ * Closes the dropdown menu.
28
+ */
29
+ SkyDropdownMessageType[SkyDropdownMessageType["Close"] = 1] = "Close";
30
+ /**
31
+ * Puts focus on the dropdown button.
32
+ */
33
+ SkyDropdownMessageType[SkyDropdownMessageType["FocusTriggerButton"] = 2] = "FocusTriggerButton";
34
+ /**
35
+ * Puts focus on the next item in the dropdown menu.
36
+ */
37
+ SkyDropdownMessageType[SkyDropdownMessageType["FocusNextItem"] = 3] = "FocusNextItem";
38
+ /**
39
+ * Puts focus on the previous item in the dropdown menu.
40
+ */
41
+ SkyDropdownMessageType[SkyDropdownMessageType["FocusPreviousItem"] = 4] = "FocusPreviousItem";
42
+ /**
43
+ * Repositions the dropdown menu next to the dropdown button. This is useful for when the
44
+ * dropdown menu's width and height change while it is open.
45
+ */
46
+ SkyDropdownMessageType[SkyDropdownMessageType["Reposition"] = 5] = "Reposition";
47
+ /**
48
+ * Puts focus on the first item in the dropdown menu.
49
+ */
50
+ SkyDropdownMessageType[SkyDropdownMessageType["FocusFirstItem"] = 6] = "FocusFirstItem";
51
+ /**
52
+ * Puts focus on the last item in the dropdown menu.
53
+ */
54
+ SkyDropdownMessageType[SkyDropdownMessageType["FocusLastItem"] = 7] = "FocusLastItem";
55
+ })(SkyDropdownMessageType || (SkyDropdownMessageType = {}));
56
+
57
+ /**
58
+ * NOTICE: DO NOT MODIFY THIS FILE!
59
+ * The contents of this file were automatically generated by
60
+ * the 'ng generate @skyux/i18n:lib-resources-module lib/modules/shared/sky-popovers' schematic.
61
+ * To update this file, simply rerun the command.
62
+ */
63
+ const RESOURCES = {
64
+ 'EN-US': {
65
+ skyux_dropdown_context_menu_default_label: { message: 'Context menu' },
66
+ },
67
+ };
68
+ class SkyPopoversResourcesProvider {
69
+ getString(localeInfo, name) {
70
+ return getLibStringForLocale(RESOURCES, localeInfo.locale, name);
71
+ }
72
+ }
73
+ /**
74
+ * Import into any component library module that needs to use resource strings.
75
+ */
76
+ class SkyPopoversResourcesModule {
77
+ }
78
+ SkyPopoversResourcesModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: SkyPopoversResourcesModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
79
+ SkyPopoversResourcesModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: SkyPopoversResourcesModule, exports: [SkyI18nModule] });
80
+ SkyPopoversResourcesModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: SkyPopoversResourcesModule, providers: [
81
+ {
82
+ provide: SKY_LIB_RESOURCES_PROVIDERS,
83
+ useClass: SkyPopoversResourcesProvider,
84
+ multi: true,
85
+ },
86
+ ], imports: [SkyI18nModule] });
87
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: SkyPopoversResourcesModule, decorators: [{
88
+ type: NgModule,
89
+ args: [{
90
+ exports: [SkyI18nModule],
91
+ providers: [
92
+ {
93
+ provide: SKY_LIB_RESOURCES_PROVIDERS,
94
+ useClass: SkyPopoversResourcesProvider,
95
+ multi: true,
96
+ },
97
+ ],
98
+ }]
99
+ }] });
100
+
101
+ /**
102
+ * Specifies the button for the dropdown menu.
103
+ */
104
+ class SkyDropdownButtonComponent {
105
+ }
106
+ SkyDropdownButtonComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: SkyDropdownButtonComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
107
+ SkyDropdownButtonComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.2.7", type: SkyDropdownButtonComponent, selector: "sky-dropdown-button", ngImport: i0, template: "<ng-content></ng-content>\n" });
108
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: SkyDropdownButtonComponent, decorators: [{
109
+ type: Component,
110
+ args: [{ selector: 'sky-dropdown-button', template: "<ng-content></ng-content>\n" }]
111
+ }] });
112
+
113
+ /**
114
+ * Specifies the items to display on the dropdown menu.
115
+ */
116
+ class SkyDropdownItemComponent {
117
+ constructor(elementRef, changeDetector, renderer) {
118
+ this.elementRef = elementRef;
119
+ this.changeDetector = changeDetector;
120
+ this.renderer = renderer;
121
+ this.isActive = false;
122
+ this.isDisabled = false;
123
+ }
124
+ /**
125
+ * Specifies an ARIA role for the dropdown menu item
126
+ * [to support accessibility](https://developer.blackbaud.com/skyux/learn/accessibility)
127
+ * by indicating how the item functions and what it controls. For information about
128
+ * how an ARIA role indicates what an item represents on a web page, see the
129
+ * [WAI-ARIA roles model](https://www.w3.org/WAI/PF/aria/roles).
130
+ * @default "menuitem"
131
+ */
132
+ set ariaRole(value) {
133
+ this._ariaRole = value;
134
+ }
135
+ get ariaRole() {
136
+ return this._ariaRole || 'menuitem';
137
+ }
138
+ get buttonElement() {
139
+ return this.elementRef.nativeElement.querySelector('button,a');
140
+ }
141
+ ngAfterViewInit() {
142
+ this.isDisabled = !this.isFocusable();
143
+ // Make sure anchor elements are tab-able.
144
+ const buttonElement = this.buttonElement;
145
+ /* istanbul ignore else */
146
+ if (buttonElement) {
147
+ this.renderer.setAttribute(buttonElement, 'tabIndex', '0');
148
+ }
149
+ this.changeDetector.detectChanges();
150
+ }
151
+ focusElement(enableNativeFocus) {
152
+ this.isActive = true;
153
+ if (enableNativeFocus) {
154
+ this.buttonElement.focus();
155
+ }
156
+ this.changeDetector.detectChanges();
157
+ }
158
+ isFocusable() {
159
+ /*tslint:disable no-null-keyword */
160
+ const isFocusable = this.buttonElement &&
161
+ this.buttonElement.getAttribute('disabled') === null;
162
+ /*tslint:enable */
163
+ return isFocusable;
164
+ }
165
+ resetState() {
166
+ this.isActive = false;
167
+ this.changeDetector.markForCheck();
168
+ }
169
+ }
170
+ SkyDropdownItemComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: SkyDropdownItemComponent, deps: [{ token: i0.ElementRef }, { token: i0.ChangeDetectorRef }, { token: i0.Renderer2 }], target: i0.ɵɵFactoryTarget.Component });
171
+ SkyDropdownItemComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.2.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 '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: i4.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
172
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: SkyDropdownItemComponent, decorators: [{
173
+ type: Component,
174
+ 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 '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"] }]
175
+ }], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i0.ChangeDetectorRef }, { type: i0.Renderer2 }]; }, propDecorators: { ariaRole: [{
176
+ type: Input
177
+ }] } });
178
+
179
+ function parseAffixHorizontalAlignment$1(alignment) {
180
+ switch (alignment) {
181
+ case 'center':
182
+ return 'center';
183
+ case 'left':
184
+ return 'left';
185
+ case 'right':
186
+ return 'right';
187
+ /* istanbul ignore next */
188
+ default:
189
+ throw `SkyAffixHorizontalAlignment does not have a matching value for '${alignment}'!`;
190
+ }
191
+ }
192
+
193
+ /**
194
+ * Creates a dropdown menu that displays menu items that users may select.
195
+ */
196
+ class SkyDropdownComponent {
197
+ constructor(changeDetector, affixService, overlayService, themeSvc) {
198
+ this.changeDetector = changeDetector;
199
+ this.affixService = affixService;
200
+ this.overlayService = overlayService;
201
+ this.themeSvc = themeSvc;
202
+ /**
203
+ * Provides an observable to send commands to the dropdown. The commands should respect
204
+ * the [[SkyDropdownMessage]] type.
205
+ */
206
+ this.messageStream = new Subject();
207
+ this.isMouseEnter = false;
208
+ this.isVisible = false;
209
+ this.ngUnsubscribe = new Subject();
210
+ this._isOpen = false;
211
+ }
212
+ /**
213
+ * Specifies a background color for the dropdown button. Available values are `default` and
214
+ * `primary`. These values set the background color from the
215
+ * [secondary and primary button classes](https://developer.blackbaud.com/skyux/components/button) respectively.
216
+ * @default "default"
217
+ */
218
+ set buttonStyle(value) {
219
+ this._buttonStyle = value;
220
+ }
221
+ get buttonStyle() {
222
+ return this._buttonStyle || 'default';
223
+ }
224
+ /**
225
+ * Specifies the type of button to render as the dropdown's trigger element. To display a button
226
+ * with text and a caret, specify `select` and then enter the button text in a
227
+ * `sky-dropdown-button` element. To display a round button with an ellipsis, specify
228
+ * `context-menu`. And to display a button with a [Font Awesome icon](http://fontawesome.io/icons/), specify the icon's class name.
229
+ * For example, to display the `fa-filter` icon, specify `filter`.
230
+ * @default "select"
231
+ */
232
+ set buttonType(value) {
233
+ this._buttonType = value;
234
+ }
235
+ get buttonType() {
236
+ return this._buttonType || 'select';
237
+ }
238
+ /**
239
+ * Indicates whether to disable the dropdown button.
240
+ * @default false
241
+ */
242
+ set disabled(value) {
243
+ this._disabled = value;
244
+ }
245
+ get disabled() {
246
+ return this._disabled || false;
247
+ }
248
+ /**
249
+ * Indicates whether to close the dropdown when users click away from the menu.
250
+ * @default true
251
+ */
252
+ set dismissOnBlur(value) {
253
+ this._dismissOnBlur = value;
254
+ }
255
+ get dismissOnBlur() {
256
+ if (this._dismissOnBlur === undefined) {
257
+ return true;
258
+ }
259
+ return this._dismissOnBlur;
260
+ }
261
+ /**
262
+ * Specifies the horizontal alignment of the dropdown menu in relation to the dropdown button.
263
+ * @default "left"
264
+ */
265
+ set horizontalAlignment(value) {
266
+ this._horizontalAlignment = value;
267
+ }
268
+ get horizontalAlignment() {
269
+ return this._horizontalAlignment || 'left';
270
+ }
271
+ /**
272
+ * Specifies how users interact with the dropdown button to expose the dropdown menu.
273
+ * We recommend the default `click` value because the `hover` value can pose
274
+ * [accessibility](https://developer.blackbaud.com/skyux/learn/accessibility) issues
275
+ * for users on touch devices such as phones and tablets.
276
+ * @deprecated We recommend against using this property. If you choose to use the deprecated
277
+ * `hover` value anyway, we recommend that you not use it in combination with the `title`
278
+ * property. (This property will be removed in the next major version release.)
279
+ * @default "click"
280
+ */
281
+ set trigger(value) {
282
+ this._trigger = value;
283
+ }
284
+ get trigger() {
285
+ return this._trigger || 'click';
286
+ }
287
+ set isOpen(value) {
288
+ this._isOpen = value;
289
+ this.changeDetector.markForCheck();
290
+ }
291
+ get isOpen() {
292
+ return this._isOpen || false;
293
+ }
294
+ set menuContainerElementRef(value) {
295
+ if (value) {
296
+ this._menuContainerElementRef = value;
297
+ this.destroyAffixer();
298
+ this.createAffixer();
299
+ this.changeDetector.markForCheck();
300
+ }
301
+ }
302
+ get menuContainerElementRef() {
303
+ return this._menuContainerElementRef;
304
+ }
305
+ ngOnInit() {
306
+ var _a;
307
+ this.addEventListeners();
308
+ this.messageStream
309
+ .pipe(takeUntil(this.ngUnsubscribe))
310
+ .subscribe((message) => {
311
+ this.handleIncomingMessages(message);
312
+ });
313
+ // Load proper icons on theme change.
314
+ (_a = this.themeSvc) === null || _a === void 0 ? void 0 : _a.settingsChange.pipe(takeUntil(this.ngUnsubscribe)).subscribe(() => {
315
+ this.changeDetector.markForCheck();
316
+ });
317
+ }
318
+ ngOnDestroy() {
319
+ this.destroyAffixer();
320
+ this.destroyOverlay();
321
+ clearTimeout(this._positionTimeout);
322
+ this.ngUnsubscribe.next();
323
+ this.ngUnsubscribe.complete();
324
+ this.ngUnsubscribe = undefined;
325
+ }
326
+ addEventListeners() {
327
+ const buttonElement = this.triggerButton.nativeElement;
328
+ fromEvent(buttonElement, 'click')
329
+ .pipe(takeUntil(this.ngUnsubscribe))
330
+ .subscribe(() => {
331
+ if (this.isOpen) {
332
+ this.sendMessage(SkyDropdownMessageType.Close);
333
+ }
334
+ else {
335
+ this.sendMessage(SkyDropdownMessageType.Open);
336
+ // Wait for dropdown to open, then set focus on first item.
337
+ setTimeout(() => {
338
+ this.sendMessage(SkyDropdownMessageType.FocusFirstItem);
339
+ });
340
+ }
341
+ });
342
+ fromEvent(buttonElement, 'keydown')
343
+ .pipe(takeUntil(this.ngUnsubscribe))
344
+ .subscribe((event) => {
345
+ const key = event.key.toLowerCase();
346
+ /* tslint:disable-next-line:switch-default */
347
+ switch (key) {
348
+ case 'escape':
349
+ /*istanbul ignore else*/
350
+ if (this.isOpen) {
351
+ this.sendMessage(SkyDropdownMessageType.Close);
352
+ this.sendMessage(SkyDropdownMessageType.FocusTriggerButton);
353
+ event.stopPropagation();
354
+ }
355
+ break;
356
+ case 'tab':
357
+ if (this.isOpen && this.dismissOnBlur) {
358
+ this.sendMessage(SkyDropdownMessageType.Close);
359
+ }
360
+ break;
361
+ case 'arrowup':
362
+ case 'up':
363
+ if (!this.isOpen) {
364
+ this.sendMessage(SkyDropdownMessageType.Open);
365
+ this.sendMessage(SkyDropdownMessageType.FocusLastItem);
366
+ event.preventDefault();
367
+ event.stopPropagation();
368
+ }
369
+ break;
370
+ case 'enter':
371
+ case 'arrowdown':
372
+ case 'down':
373
+ case ' ': // Spacebar.
374
+ /*istanbul ignore else*/
375
+ if (!this.isOpen) {
376
+ this.sendMessage(SkyDropdownMessageType.Open);
377
+ this.sendMessage(SkyDropdownMessageType.FocusFirstItem);
378
+ event.preventDefault();
379
+ event.stopPropagation();
380
+ }
381
+ break;
382
+ }
383
+ });
384
+ fromEvent(buttonElement, 'mouseenter')
385
+ .pipe(takeUntil(this.ngUnsubscribe))
386
+ .subscribe(() => {
387
+ this.isMouseEnter = true;
388
+ if (this.trigger === 'hover') {
389
+ this.sendMessage(SkyDropdownMessageType.Open);
390
+ }
391
+ });
392
+ fromEvent(buttonElement, 'mouseleave')
393
+ .pipe(takeUntil(this.ngUnsubscribe))
394
+ .subscribe(() => {
395
+ this.isMouseEnter = false;
396
+ if (this.trigger === 'hover') {
397
+ // Allow the dropdown menu to set isMouseEnter before checking if the close action
398
+ // should be taken.
399
+ setTimeout(() => {
400
+ if (!this.isMouseEnter) {
401
+ this.sendMessage(SkyDropdownMessageType.Close);
402
+ }
403
+ });
404
+ }
405
+ });
406
+ }
407
+ createOverlay() {
408
+ if (this.overlay) {
409
+ return;
410
+ }
411
+ const overlay = this.overlayService.create({
412
+ enableScroll: true,
413
+ enablePointerEvents: true,
414
+ });
415
+ overlay.attachTemplate(this.menuContainerTemplateRef);
416
+ overlay.backdropClick.pipe(takeUntil(this.ngUnsubscribe)).subscribe(() => {
417
+ if (this.dismissOnBlur) {
418
+ this.sendMessage(SkyDropdownMessageType.Close);
419
+ }
420
+ });
421
+ this.overlay = overlay;
422
+ }
423
+ destroyAffixer() {
424
+ /*istanbul ignore else*/
425
+ if (this.affixer) {
426
+ this.affixer.destroy();
427
+ this.affixer = undefined;
428
+ }
429
+ }
430
+ destroyOverlay() {
431
+ /*istanbul ignore else*/
432
+ if (this.overlay) {
433
+ this.overlayService.close(this.overlay);
434
+ this.overlay = undefined;
435
+ }
436
+ }
437
+ createAffixer() {
438
+ const affixer = this.affixService.createAffixer(this.menuContainerElementRef);
439
+ affixer.placementChange
440
+ .pipe(takeUntil(this.ngUnsubscribe))
441
+ .subscribe((change) => {
442
+ this.isVisible = change.placement !== null;
443
+ this.changeDetector.markForCheck();
444
+ });
445
+ this.affixer = affixer;
446
+ }
447
+ handleIncomingMessages(message) {
448
+ if (!this.disabled) {
449
+ /* tslint:disable-next-line:switch-default */
450
+ switch (message.type) {
451
+ case SkyDropdownMessageType.Open:
452
+ this.isOpen = true;
453
+ this.positionDropdownMenu();
454
+ break;
455
+ case SkyDropdownMessageType.Close:
456
+ this.isOpen = false;
457
+ this.destroyOverlay();
458
+ break;
459
+ case SkyDropdownMessageType.Reposition:
460
+ // Only reposition the dropdown if it is already open.
461
+ /* istanbul ignore else */
462
+ if (this.isOpen && this.affixer) {
463
+ this.affixer.reaffix();
464
+ }
465
+ break;
466
+ case SkyDropdownMessageType.FocusTriggerButton:
467
+ this.triggerButton.nativeElement.focus();
468
+ break;
469
+ }
470
+ }
471
+ }
472
+ sendMessage(type) {
473
+ this.messageStream.next({ type });
474
+ }
475
+ positionDropdownMenu() {
476
+ this.isVisible = false;
477
+ this.createOverlay();
478
+ this.changeDetector.markForCheck();
479
+ // Explicitly declare the `setTimeout` from the `window` object in order to use the DOM typings
480
+ // during a unit test (instead of confusing this with Node's `setTimeout`).
481
+ this._positionTimeout = window.setTimeout(() => {
482
+ this.affixer.affixTo(this.triggerButton.nativeElement, {
483
+ autoFitContext: SkyAffixAutoFitContext.Viewport,
484
+ enableAutoFit: true,
485
+ horizontalAlignment: parseAffixHorizontalAlignment$1(this.horizontalAlignment),
486
+ isSticky: true,
487
+ placement: 'below',
488
+ });
489
+ this.isVisible = true;
490
+ this.changeDetector.markForCheck();
491
+ });
492
+ }
493
+ }
494
+ SkyDropdownComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: SkyDropdownComponent, deps: [{ token: i0.ChangeDetectorRef }, { token: i1.SkyAffixService }, { token: i1.SkyOverlayService }, { token: i2.SkyThemeService, optional: true }], target: i0.ɵɵFactoryTarget.Component });
495
+ SkyDropdownComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.2.7", type: SkyDropdownComponent, selector: "sky-dropdown", inputs: { buttonStyle: "buttonStyle", buttonType: "buttonType", disabled: "disabled", dismissOnBlur: "dismissOnBlur", label: "label", horizontalAlignment: "horizontalAlignment", messageStream: "messageStream", title: "title", trigger: "trigger" }, viewQueries: [{ propertyName: "menuContainerElementRef", first: true, predicate: ["menuContainerElementRef"], descendants: true, read: ElementRef }, { propertyName: "menuContainerTemplateRef", first: true, predicate: ["menuContainerTemplateRef"], descendants: true, read: TemplateRef, static: true }, { propertyName: "triggerButton", first: true, predicate: ["triggerButton"], descendants: true, read: ElementRef, static: true }], ngImport: i0, template: "<div class=\"sky-dropdown\">\n <button\n class=\"sky-btn sky-dropdown-button\"\n type=\"button\"\n [attr.aria-expanded]=\"isOpen\"\n [attr.aria-controls]=\"isOpen ? menuId : null\"\n [attr.aria-haspopup]=\"menuAriaRole\"\n [attr.aria-label]=\"\n label || ('skyux_dropdown_context_menu_default_label' | skyLibResources)\n \"\n [attr.title]=\"title\"\n [disabled]=\"disabled\"\n [ngClass]=\"[\n 'sky-dropdown-button-type-' + buttonType,\n 'sky-btn-' + buttonStyle\n ]\"\n #triggerButton\n >\n <ng-container [ngSwitch]=\"buttonType\">\n <ng-template ngSwitchCase=\"context-menu\">\n <sky-icon *skyThemeIf=\"'default'\" icon=\"ellipsis-h\"></sky-icon>\n <sky-icon\n *skyThemeIf=\"'modern'\"\n icon=\"ellipsis\"\n iconType=\"skyux\"\n ></sky-icon>\n </ng-template>\n\n <ng-template ngSwitchDefault>\n <div\n *ngIf=\"buttonType === 'select' || buttonType === 'tab' || !buttonType\"\n class=\"sky-dropdown-button-container\"\n >\n <div class=\"sky-dropdown-button-content-container\">\n <ng-content select=\"sky-dropdown-button\"> </ng-content>\n </div>\n <div class=\"sky-dropdown-button-icon-container\">\n <sky-icon\n *skyThemeIf=\"'default'\"\n class=\"sky-dropdown-caret\"\n icon=\"caret-down\"\n >\n </sky-icon>\n <sky-icon\n *skyThemeIf=\"'modern'\"\n class=\"sky-dropdown-caret\"\n icon=\"chevron-down\"\n iconType=\"skyux\"\n >\n </sky-icon>\n </div>\n </div>\n <div\n *ngIf=\"buttonType !== 'select' && buttonType !== 'tab' && buttonType\"\n >\n <sky-icon [icon]=\"buttonType\" size=\"lg\"></sky-icon>\n </div>\n </ng-template>\n </ng-container>\n </button>\n</div>\n\n<ng-template #menuContainerTemplateRef>\n <div\n class=\"sky-dropdown-menu-container\"\n [class.hidden]=\"!isVisible\"\n #menuContainerElementRef\n >\n <ng-content select=\"sky-dropdown-menu\"></ng-content>\n </div>\n</ng-template>\n", styles: [".sky-dropdown-button-type-tab{background-color:transparent;border:none;border-radius:4px 4px 0 0;color:#686c73;cursor:pointer;display:inline-block;font-weight:600;line-height:1.8;padding:8px 16px;background-color:#0974a1;color:#fff;max-width:100%;text-align:left}.sky-dropdown-button-type-tab:hover:not(.sky-btn-tab-disabled){background-color:#eeeeef;color:#212327;text-decoration:none}.sky-dropdown-button-type-tab.sky-btn-tab-disabled{background-color:#cdcfd2;cursor:default;outline:none;text-decoration:none}.sky-dropdown-button-type-tab.sky-btn-tab-disabled:hover{color:#686c73;cursor:default;text-decoration:none}.sky-dropdown-button-type-tab:hover:not(.sky-btn-tab-disabled){background-color:#0974a1;color:#fff}.sky-dropdown-button-type-context-menu{border-radius:50%;padding:3px 8px}.sky-dropdown-caret{margin-left:10px}.sky-dropdown-button-container{display:flex}.sky-dropdown-button-content-container{flex-shrink:1;overflow:hidden;text-overflow:ellipsis}.sky-dropdown-button-icon-container{flex-grow:1}.sky-dropdown-menu-container{position:fixed}.hidden{visibility:hidden}:host-context(.sky-theme-modern) .sky-dropdown-button-type-tab{border:none;border-radius:0;font-weight:400;padding:10px 15px;transition:box-shadow .15s;background-color:transparent;color:#212327}:host-context(.sky-theme-modern) .sky-dropdown-button-type-tab:hover:not(.sky-btn-tab-disabled):not(.sky-btn-tab-selected):not(.sky-dropdown-button-type-tab):not(:focus){background-color:transparent;border-bottom:solid 1px #00b4f1;padding-bottom:9px}:host-context(.sky-theme-modern) .sky-dropdown-button-type-tab:focus{background-color:transparent;outline:none}:host-context(.sky-theme-modern) .sky-dropdown-button-type-tab:focus:not(:active){outline:solid 2px #1870B8;outline-offset:-2px;box-shadow:0 1px 8px #0000004d}:host-context(.sky-theme-modern) .sky-dropdown-button-type-tab:active{border-bottom:solid 3px #00b4f1;padding-bottom:7px}:host-context(.sky-theme-modern) .sky-dropdown-button-type-tab:not(:active){border-bottom:solid 3px #1870B8;padding-bottom:7px}:host-context(.sky-theme-modern) .sky-dropdown-button-type-tab:hover:not(.sky-btn-tab-disabled){background-color:transparent;color:#212327}:host-context(.sky-theme-modern) .sky-dropdown-button-type-tab .sky-btn-tab-close,:host-context(.sky-theme-modern) .sky-dropdown-button-type-tab .sky-tab-header-count{color:#686c73}:host-context(.sky-theme-modern) .sky-dropdown-caret{margin-left:10px}.sky-theme-modern .sky-dropdown-button-type-tab{border:none;border-radius:0;font-weight:400;padding:10px 15px;transition:box-shadow .15s;background-color:transparent;color:#212327}.sky-theme-modern .sky-dropdown-button-type-tab:hover:not(.sky-btn-tab-disabled):not(.sky-btn-tab-selected):not(.sky-dropdown-button-type-tab):not(:focus){background-color:transparent;border-bottom:solid 1px #00b4f1;padding-bottom:9px}.sky-theme-modern .sky-dropdown-button-type-tab:focus{background-color:transparent;outline:none}.sky-theme-modern .sky-dropdown-button-type-tab:focus:not(:active){outline:solid 2px #1870B8;outline-offset:-2px;box-shadow:0 1px 8px #0000004d}.sky-theme-modern .sky-dropdown-button-type-tab:active{border-bottom:solid 3px #00b4f1;padding-bottom:7px}.sky-theme-modern .sky-dropdown-button-type-tab:not(:active){border-bottom:solid 3px #1870B8;padding-bottom:7px}.sky-theme-modern .sky-dropdown-button-type-tab:hover:not(.sky-btn-tab-disabled){background-color:transparent;color:#212327}.sky-theme-modern .sky-dropdown-button-type-tab .sky-btn-tab-close,.sky-theme-modern .sky-dropdown-button-type-tab .sky-tab-header-count{color:#686c73}.sky-theme-modern .sky-dropdown-caret{margin-left:10px}:host-context(.sky-theme-modern.sky-theme-mode-dark) .sky-dropdown-button-type-tab{color:#fff}:host-context(.sky-theme-modern.sky-theme-mode-dark) .sky-dropdown-button-type-tab:hover{color:#fff}:host-context(.sky-theme-modern.sky-theme-mode-dark) .sky-dropdown-button-type-tab .sky-btn-tab-close,:host-context(.sky-theme-modern.sky-theme-mode-dark) .sky-dropdown-button-type-tab .sky-tab-header-count{color:#efefef}.sky-theme-modern.sky-theme-mode-dark .sky-dropdown-button-type-tab,.sky-theme-modern.sky-theme-mode-dark .sky-dropdown-button-type-tab:hover{color:#fff}.sky-theme-modern.sky-theme-mode-dark .sky-dropdown-button-type-tab .sky-btn-tab-close,.sky-theme-modern.sky-theme-mode-dark .sky-dropdown-button-type-tab .sky-tab-header-count{color:#efefef}\n"], components: [{ type: i3.λ4, selector: "sky-icon", inputs: ["icon", "iconType", "size", "fixedWidth", "variant"] }], directives: [{ type: i4.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: i4.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { type: i4.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { type: i2.λ3, selector: "[skyThemeIf]", inputs: ["skyThemeIf"] }, { type: i4.NgSwitchDefault, selector: "[ngSwitchDefault]" }, { type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }], pipes: { "skyLibResources": i5.SkyLibResourcesPipe }, changeDetection: i0.ChangeDetectionStrategy.OnPush });
496
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: SkyDropdownComponent, decorators: [{
497
+ type: Component,
498
+ args: [{ selector: 'sky-dropdown', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"sky-dropdown\">\n <button\n class=\"sky-btn sky-dropdown-button\"\n type=\"button\"\n [attr.aria-expanded]=\"isOpen\"\n [attr.aria-controls]=\"isOpen ? menuId : null\"\n [attr.aria-haspopup]=\"menuAriaRole\"\n [attr.aria-label]=\"\n label || ('skyux_dropdown_context_menu_default_label' | skyLibResources)\n \"\n [attr.title]=\"title\"\n [disabled]=\"disabled\"\n [ngClass]=\"[\n 'sky-dropdown-button-type-' + buttonType,\n 'sky-btn-' + buttonStyle\n ]\"\n #triggerButton\n >\n <ng-container [ngSwitch]=\"buttonType\">\n <ng-template ngSwitchCase=\"context-menu\">\n <sky-icon *skyThemeIf=\"'default'\" icon=\"ellipsis-h\"></sky-icon>\n <sky-icon\n *skyThemeIf=\"'modern'\"\n icon=\"ellipsis\"\n iconType=\"skyux\"\n ></sky-icon>\n </ng-template>\n\n <ng-template ngSwitchDefault>\n <div\n *ngIf=\"buttonType === 'select' || buttonType === 'tab' || !buttonType\"\n class=\"sky-dropdown-button-container\"\n >\n <div class=\"sky-dropdown-button-content-container\">\n <ng-content select=\"sky-dropdown-button\"> </ng-content>\n </div>\n <div class=\"sky-dropdown-button-icon-container\">\n <sky-icon\n *skyThemeIf=\"'default'\"\n class=\"sky-dropdown-caret\"\n icon=\"caret-down\"\n >\n </sky-icon>\n <sky-icon\n *skyThemeIf=\"'modern'\"\n class=\"sky-dropdown-caret\"\n icon=\"chevron-down\"\n iconType=\"skyux\"\n >\n </sky-icon>\n </div>\n </div>\n <div\n *ngIf=\"buttonType !== 'select' && buttonType !== 'tab' && buttonType\"\n >\n <sky-icon [icon]=\"buttonType\" size=\"lg\"></sky-icon>\n </div>\n </ng-template>\n </ng-container>\n </button>\n</div>\n\n<ng-template #menuContainerTemplateRef>\n <div\n class=\"sky-dropdown-menu-container\"\n [class.hidden]=\"!isVisible\"\n #menuContainerElementRef\n >\n <ng-content select=\"sky-dropdown-menu\"></ng-content>\n </div>\n</ng-template>\n", styles: [".sky-dropdown-button-type-tab{background-color:transparent;border:none;border-radius:4px 4px 0 0;color:#686c73;cursor:pointer;display:inline-block;font-weight:600;line-height:1.8;padding:8px 16px;background-color:#0974a1;color:#fff;max-width:100%;text-align:left}.sky-dropdown-button-type-tab:hover:not(.sky-btn-tab-disabled){background-color:#eeeeef;color:#212327;text-decoration:none}.sky-dropdown-button-type-tab.sky-btn-tab-disabled{background-color:#cdcfd2;cursor:default;outline:none;text-decoration:none}.sky-dropdown-button-type-tab.sky-btn-tab-disabled:hover{color:#686c73;cursor:default;text-decoration:none}.sky-dropdown-button-type-tab:hover:not(.sky-btn-tab-disabled){background-color:#0974a1;color:#fff}.sky-dropdown-button-type-context-menu{border-radius:50%;padding:3px 8px}.sky-dropdown-caret{margin-left:10px}.sky-dropdown-button-container{display:flex}.sky-dropdown-button-content-container{flex-shrink:1;overflow:hidden;text-overflow:ellipsis}.sky-dropdown-button-icon-container{flex-grow:1}.sky-dropdown-menu-container{position:fixed}.hidden{visibility:hidden}:host-context(.sky-theme-modern) .sky-dropdown-button-type-tab{border:none;border-radius:0;font-weight:400;padding:10px 15px;transition:box-shadow .15s;background-color:transparent;color:#212327}:host-context(.sky-theme-modern) .sky-dropdown-button-type-tab:hover:not(.sky-btn-tab-disabled):not(.sky-btn-tab-selected):not(.sky-dropdown-button-type-tab):not(:focus){background-color:transparent;border-bottom:solid 1px #00b4f1;padding-bottom:9px}:host-context(.sky-theme-modern) .sky-dropdown-button-type-tab:focus{background-color:transparent;outline:none}:host-context(.sky-theme-modern) .sky-dropdown-button-type-tab:focus:not(:active){outline:solid 2px #1870B8;outline-offset:-2px;box-shadow:0 1px 8px #0000004d}:host-context(.sky-theme-modern) .sky-dropdown-button-type-tab:active{border-bottom:solid 3px #00b4f1;padding-bottom:7px}:host-context(.sky-theme-modern) .sky-dropdown-button-type-tab:not(:active){border-bottom:solid 3px #1870B8;padding-bottom:7px}:host-context(.sky-theme-modern) .sky-dropdown-button-type-tab:hover:not(.sky-btn-tab-disabled){background-color:transparent;color:#212327}:host-context(.sky-theme-modern) .sky-dropdown-button-type-tab .sky-btn-tab-close,:host-context(.sky-theme-modern) .sky-dropdown-button-type-tab .sky-tab-header-count{color:#686c73}:host-context(.sky-theme-modern) .sky-dropdown-caret{margin-left:10px}.sky-theme-modern .sky-dropdown-button-type-tab{border:none;border-radius:0;font-weight:400;padding:10px 15px;transition:box-shadow .15s;background-color:transparent;color:#212327}.sky-theme-modern .sky-dropdown-button-type-tab:hover:not(.sky-btn-tab-disabled):not(.sky-btn-tab-selected):not(.sky-dropdown-button-type-tab):not(:focus){background-color:transparent;border-bottom:solid 1px #00b4f1;padding-bottom:9px}.sky-theme-modern .sky-dropdown-button-type-tab:focus{background-color:transparent;outline:none}.sky-theme-modern .sky-dropdown-button-type-tab:focus:not(:active){outline:solid 2px #1870B8;outline-offset:-2px;box-shadow:0 1px 8px #0000004d}.sky-theme-modern .sky-dropdown-button-type-tab:active{border-bottom:solid 3px #00b4f1;padding-bottom:7px}.sky-theme-modern .sky-dropdown-button-type-tab:not(:active){border-bottom:solid 3px #1870B8;padding-bottom:7px}.sky-theme-modern .sky-dropdown-button-type-tab:hover:not(.sky-btn-tab-disabled){background-color:transparent;color:#212327}.sky-theme-modern .sky-dropdown-button-type-tab .sky-btn-tab-close,.sky-theme-modern .sky-dropdown-button-type-tab .sky-tab-header-count{color:#686c73}.sky-theme-modern .sky-dropdown-caret{margin-left:10px}:host-context(.sky-theme-modern.sky-theme-mode-dark) .sky-dropdown-button-type-tab{color:#fff}:host-context(.sky-theme-modern.sky-theme-mode-dark) .sky-dropdown-button-type-tab:hover{color:#fff}:host-context(.sky-theme-modern.sky-theme-mode-dark) .sky-dropdown-button-type-tab .sky-btn-tab-close,:host-context(.sky-theme-modern.sky-theme-mode-dark) .sky-dropdown-button-type-tab .sky-tab-header-count{color:#efefef}.sky-theme-modern.sky-theme-mode-dark .sky-dropdown-button-type-tab,.sky-theme-modern.sky-theme-mode-dark .sky-dropdown-button-type-tab:hover{color:#fff}.sky-theme-modern.sky-theme-mode-dark .sky-dropdown-button-type-tab .sky-btn-tab-close,.sky-theme-modern.sky-theme-mode-dark .sky-dropdown-button-type-tab .sky-tab-header-count{color:#efefef}\n"] }]
499
+ }], ctorParameters: function () {
500
+ return [{ type: i0.ChangeDetectorRef }, { type: i1.SkyAffixService }, { type: i1.SkyOverlayService }, { type: i2.SkyThemeService, decorators: [{
501
+ type: Optional
502
+ }] }];
503
+ }, propDecorators: { buttonStyle: [{
504
+ type: Input
505
+ }], buttonType: [{
506
+ type: Input
507
+ }], disabled: [{
508
+ type: Input
509
+ }], dismissOnBlur: [{
510
+ type: Input
511
+ }], label: [{
512
+ type: Input
513
+ }], horizontalAlignment: [{
514
+ type: Input
515
+ }], messageStream: [{
516
+ type: Input
517
+ }], title: [{
518
+ type: Input
519
+ }], trigger: [{
520
+ type: Input
521
+ }], menuContainerElementRef: [{
522
+ type: ViewChild,
523
+ args: ['menuContainerElementRef', {
524
+ read: ElementRef,
525
+ }]
526
+ }], menuContainerTemplateRef: [{
527
+ type: ViewChild,
528
+ args: ['menuContainerTemplateRef', {
529
+ read: TemplateRef,
530
+ static: true,
531
+ }]
532
+ }], triggerButton: [{
533
+ type: ViewChild,
534
+ args: ['triggerButton', {
535
+ read: ElementRef,
536
+ static: true,
537
+ }]
538
+ }] } });
539
+
540
+ let nextId = 0;
541
+ /**
542
+ * Creates a menu that contains dropdown menu items.
543
+ *
544
+ */
545
+ class SkyDropdownMenuComponent {
546
+ constructor(changeDetector, elementRef, dropdownComponent) {
547
+ this.changeDetector = changeDetector;
548
+ this.elementRef = elementRef;
549
+ this.dropdownComponent = dropdownComponent;
550
+ /**
551
+ * Fires when the dropdown menu's active index or selected item changes. This event provides an
552
+ * observable to emit changes, and the response is of
553
+ * the SkyDropdownMenuChange type.
554
+ */
555
+ this.menuChanges = new EventEmitter();
556
+ this.dropdownMenuId = `sky-dropdown-menu-${++nextId}`;
557
+ this.ngUnsubscribe = new Subject();
558
+ this._menuIndex = 0;
559
+ }
560
+ /**
561
+ * Specifies an ARIA role for the dropdown menu
562
+ * [to support accessibility](https://developer.blackbaud.com/skyux/learn/accessibility)
563
+ * by indicating how the dropdown menu functions and what it controls. The dropdown button
564
+ * inherits this value to set its `aria-haspopup` property. For information
565
+ * about how an ARIA role indicates what an item represents on a web page, see the
566
+ * [WAI-ARIA roles model](https://www.w3.org/WAI/PF/aria/roles).
567
+ * @default "menu"
568
+ */
569
+ set ariaRole(value) {
570
+ this._ariaRole = value;
571
+ }
572
+ get ariaRole() {
573
+ return this._ariaRole || 'menu';
574
+ }
575
+ /**
576
+ * Indicates whether to use the browser's native focus function when users navigate through menu
577
+ * items with the keyboard. To disable the native focus function, set this property to `false`.
578
+ * For example, to let users interact with the dropdown menu but keep the keyboard focus on a
579
+ * different element, set this property to `false`.
580
+ * @default true
581
+ */
582
+ set useNativeFocus(value) {
583
+ this._useNativeFocus = value;
584
+ }
585
+ get useNativeFocus() {
586
+ if (this._useNativeFocus === undefined) {
587
+ return true;
588
+ }
589
+ return this._useNativeFocus;
590
+ }
591
+ get hasFocusableItems() {
592
+ const found = this.menuItems.find((item) => item.isFocusable());
593
+ return found !== undefined;
594
+ }
595
+ set menuIndex(value) {
596
+ if (value < 0) {
597
+ value = this.menuItems.length - 1;
598
+ }
599
+ if (value >= this.menuItems.length) {
600
+ value = 0;
601
+ }
602
+ this._menuIndex = value;
603
+ }
604
+ get menuIndex() {
605
+ return this._menuIndex;
606
+ }
607
+ ngAfterContentInit() {
608
+ /* istanbul ignore else */
609
+ if (this.dropdownComponent) {
610
+ this.dropdownComponent.menuId = this.dropdownMenuId;
611
+ this.dropdownComponent.menuAriaRole = this.ariaRole;
612
+ this.dropdownComponent.messageStream
613
+ .pipe(takeUntil(this.ngUnsubscribe))
614
+ .subscribe((message) => {
615
+ /* tslint:disable-next-line:switch-default */
616
+ switch (message.type) {
617
+ case SkyDropdownMessageType.Open:
618
+ case SkyDropdownMessageType.Close:
619
+ this.reset();
620
+ break;
621
+ case SkyDropdownMessageType.FocusFirstItem:
622
+ this.focusFirstItem();
623
+ break;
624
+ case SkyDropdownMessageType.FocusNextItem:
625
+ this.focusNextItem();
626
+ break;
627
+ case SkyDropdownMessageType.FocusPreviousItem:
628
+ this.focusPreviousItem();
629
+ break;
630
+ case SkyDropdownMessageType.FocusLastItem:
631
+ this.focusLastItem();
632
+ break;
633
+ }
634
+ });
635
+ this.menuChanges
636
+ .pipe(takeUntil(this.ngUnsubscribe))
637
+ .subscribe((change) => {
638
+ // Close the dropdown when a menu item is selected.
639
+ if (change.selectedItem) {
640
+ this.sendMessage(SkyDropdownMessageType.Close);
641
+ this.sendMessage(SkyDropdownMessageType.FocusTriggerButton);
642
+ }
643
+ if (change.items) {
644
+ // Update the popover style and position whenever the number of items changes.
645
+ this.sendMessage(SkyDropdownMessageType.Reposition);
646
+ }
647
+ });
648
+ }
649
+ // Reset dropdown whenever the menu items change.
650
+ this.menuItems.changes
651
+ .pipe(takeUntil(this.ngUnsubscribe))
652
+ .subscribe((items) => {
653
+ this.reset();
654
+ this.menuChanges.emit({
655
+ items: items.toArray(),
656
+ });
657
+ });
658
+ this.addEventListeners();
659
+ }
660
+ ngOnDestroy() {
661
+ this.ngUnsubscribe.next();
662
+ this.ngUnsubscribe.complete();
663
+ this.ngUnsubscribe = undefined;
664
+ }
665
+ focusFirstItem() {
666
+ if (!this.hasFocusableItems) {
667
+ return;
668
+ }
669
+ this.menuIndex = 0;
670
+ const firstItem = this.getItemByIndex(this.menuIndex);
671
+ if (firstItem && firstItem.isFocusable()) {
672
+ this.focusItem(firstItem);
673
+ }
674
+ else {
675
+ this.focusNextItem();
676
+ }
677
+ }
678
+ focusLastItem() {
679
+ if (!this.hasFocusableItems) {
680
+ return;
681
+ }
682
+ this.menuIndex = this.menuItems.length - 1;
683
+ const lastItem = this.getItemByIndex(this.menuIndex);
684
+ if (lastItem && lastItem.isFocusable()) {
685
+ this.focusItem(lastItem);
686
+ }
687
+ else {
688
+ this.focusPreviousItem();
689
+ }
690
+ }
691
+ focusPreviousItem() {
692
+ if (!this.hasFocusableItems) {
693
+ return;
694
+ }
695
+ this.menuIndex--;
696
+ const previousItem = this.getItemByIndex(this.menuIndex);
697
+ if (previousItem && previousItem.isFocusable()) {
698
+ this.focusItem(previousItem);
699
+ }
700
+ else {
701
+ this.focusPreviousItem();
702
+ }
703
+ }
704
+ focusNextItem() {
705
+ if (!this.hasFocusableItems) {
706
+ return;
707
+ }
708
+ this.menuIndex++;
709
+ const nextItem = this.getItemByIndex(this.menuIndex);
710
+ if (nextItem && nextItem.isFocusable()) {
711
+ this.focusItem(nextItem);
712
+ }
713
+ else {
714
+ this.focusNextItem();
715
+ }
716
+ }
717
+ reset() {
718
+ this._menuIndex = -1;
719
+ this.resetItemsActiveState();
720
+ this.changeDetector.markForCheck();
721
+ }
722
+ resetItemsActiveState() {
723
+ this.menuItems.forEach((item) => {
724
+ item.resetState();
725
+ });
726
+ }
727
+ focusItem(item) {
728
+ this.resetItemsActiveState();
729
+ item.focusElement(this.useNativeFocus);
730
+ this.menuChanges.emit({
731
+ activeIndex: this.menuIndex,
732
+ });
733
+ }
734
+ getItemByIndex(index) {
735
+ return this.menuItems.find((item, i) => {
736
+ return i === index;
737
+ });
738
+ }
739
+ selectItemByEventTarget(target) {
740
+ const selectedItem = this.menuItems.find((item, i) => {
741
+ const found = item.elementRef.nativeElement.contains(target);
742
+ if (found) {
743
+ this.menuIndex = i;
744
+ this.menuChanges.next({
745
+ activeIndex: this.menuIndex,
746
+ });
747
+ }
748
+ return found;
749
+ });
750
+ /* istanbul ignore else */
751
+ if (selectedItem) {
752
+ this.menuChanges.next({
753
+ selectedItem,
754
+ });
755
+ }
756
+ }
757
+ sendMessage(type) {
758
+ this.dropdownComponent.messageStream.next({ type });
759
+ }
760
+ addEventListeners() {
761
+ const dropdownMenuElement = this.elementRef.nativeElement;
762
+ fromEvent(dropdownMenuElement, 'click')
763
+ .pipe(takeUntil(this.ngUnsubscribe))
764
+ .subscribe((event) => {
765
+ this.selectItemByEventTarget(event.target);
766
+ });
767
+ fromEvent(dropdownMenuElement, 'keydown')
768
+ .pipe(takeUntil(this.ngUnsubscribe))
769
+ .subscribe((event) => {
770
+ const key = event.key.toLowerCase();
771
+ /*tslint:disable-next-line:switch-default*/
772
+ switch (key) {
773
+ case 'escape':
774
+ this.sendMessage(SkyDropdownMessageType.Close);
775
+ this.sendMessage(SkyDropdownMessageType.FocusTriggerButton);
776
+ event.stopPropagation();
777
+ event.preventDefault();
778
+ break;
779
+ case 'arrowdown':
780
+ case 'down':
781
+ this.focusNextItem();
782
+ event.preventDefault();
783
+ break;
784
+ case 'arrowup':
785
+ case 'up':
786
+ this.focusPreviousItem();
787
+ event.preventDefault();
788
+ break;
789
+ case 'tab':
790
+ if (this.dropdownComponent.dismissOnBlur) {
791
+ this.sendMessage(SkyDropdownMessageType.Close);
792
+ }
793
+ this.sendMessage(SkyDropdownMessageType.FocusTriggerButton);
794
+ break;
795
+ }
796
+ });
797
+ fromEvent(dropdownMenuElement, 'mouseenter')
798
+ .pipe(takeUntil(this.ngUnsubscribe))
799
+ .subscribe(() => {
800
+ this.dropdownComponent.isMouseEnter = true;
801
+ });
802
+ fromEvent(dropdownMenuElement, 'mouseleave')
803
+ .pipe(takeUntil(this.ngUnsubscribe))
804
+ .subscribe(() => {
805
+ this.dropdownComponent.isMouseEnter = false;
806
+ // Allow the dropdown component to set isMouseEnter before checking if the close action
807
+ // should be taken.
808
+ setTimeout(() => {
809
+ if (this.dropdownComponent.trigger === 'hover' &&
810
+ this.dropdownComponent.isMouseEnter === false) {
811
+ this.sendMessage(SkyDropdownMessageType.Close);
812
+ }
813
+ });
814
+ });
815
+ }
816
+ }
817
+ SkyDropdownMenuComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: SkyDropdownMenuComponent, deps: [{ token: i0.ChangeDetectorRef }, { token: i0.ElementRef }, { token: SkyDropdownComponent, optional: true }], target: i0.ɵɵFactoryTarget.Component });
818
+ SkyDropdownMenuComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.2.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-theme-mode-dark .sky-dropdown-menu{background-color:#252a2e;color:#fff}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
819
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: SkyDropdownMenuComponent, decorators: [{
820
+ type: Component,
821
+ 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-theme-mode-dark .sky-dropdown-menu{background-color:#252a2e;color:#fff}\n"] }]
822
+ }], ctorParameters: function () {
823
+ return [{ type: i0.ChangeDetectorRef }, { type: i0.ElementRef }, { type: SkyDropdownComponent, decorators: [{
824
+ type: Optional
825
+ }] }];
826
+ }, propDecorators: { ariaLabelledBy: [{
827
+ type: Input
828
+ }], ariaRole: [{
829
+ type: Input
830
+ }], useNativeFocus: [{
831
+ type: Input
832
+ }], menuChanges: [{
833
+ type: Output
834
+ }], menuItems: [{
835
+ type: ContentChildren,
836
+ args: [SkyDropdownItemComponent, { descendants: true }]
837
+ }] } });
838
+
839
+ class SkyDropdownModule {
840
+ }
841
+ SkyDropdownModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: SkyDropdownModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
842
+ SkyDropdownModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: SkyDropdownModule, declarations: [SkyDropdownButtonComponent,
843
+ SkyDropdownComponent,
844
+ SkyDropdownItemComponent,
845
+ SkyDropdownMenuComponent], imports: [CommonModule,
846
+ SkyAffixModule,
847
+ SkyIconModule,
848
+ SkyOverlayModule,
849
+ SkyPopoversResourcesModule,
850
+ SkyThemeModule], exports: [SkyDropdownButtonComponent,
851
+ SkyDropdownComponent,
852
+ SkyDropdownItemComponent,
853
+ SkyDropdownMenuComponent] });
854
+ SkyDropdownModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: SkyDropdownModule, imports: [[
855
+ CommonModule,
856
+ SkyAffixModule,
857
+ SkyIconModule,
858
+ SkyOverlayModule,
859
+ SkyPopoversResourcesModule,
860
+ SkyThemeModule,
861
+ ]] });
862
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: SkyDropdownModule, decorators: [{
863
+ type: NgModule,
864
+ args: [{
865
+ declarations: [
866
+ SkyDropdownButtonComponent,
867
+ SkyDropdownComponent,
868
+ SkyDropdownItemComponent,
869
+ SkyDropdownMenuComponent,
870
+ ],
871
+ imports: [
872
+ CommonModule,
873
+ SkyAffixModule,
874
+ SkyIconModule,
875
+ SkyOverlayModule,
876
+ SkyPopoversResourcesModule,
877
+ SkyThemeModule,
878
+ ],
879
+ exports: [
880
+ SkyDropdownButtonComponent,
881
+ SkyDropdownComponent,
882
+ SkyDropdownItemComponent,
883
+ SkyDropdownMenuComponent,
884
+ ],
885
+ }]
886
+ }] });
887
+
888
+ /**
889
+ * @internal
890
+ */
891
+ class SkyPopoverAdapterService {
892
+ getArrowCoordinates(elements, placement, themeName) {
893
+ const callerRect = elements.caller.nativeElement.getBoundingClientRect();
894
+ const popoverRect = elements.popover.nativeElement.getBoundingClientRect();
895
+ const arrowRect = elements.popoverArrow.nativeElement.getBoundingClientRect();
896
+ const pixelTolerance = 20;
897
+ let top;
898
+ let left;
899
+ if (placement === 'above' || placement === 'below') {
900
+ left = callerRect.left + callerRect.width * 0.5;
901
+ // Make sure the arrow never detaches from the popover.
902
+ if (left - pixelTolerance < popoverRect.left) {
903
+ left = popoverRect.left + pixelTolerance;
904
+ }
905
+ else if (left + pixelTolerance > popoverRect.right) {
906
+ left = popoverRect.right - pixelTolerance;
907
+ }
908
+ if (placement === 'above') {
909
+ if (themeName !== 'modern') {
910
+ top = callerRect.top - arrowRect.height;
911
+ }
912
+ else {
913
+ top = callerRect.top - arrowRect.height + 5;
914
+ }
915
+ }
916
+ else {
917
+ if (themeName !== 'modern') {
918
+ top = callerRect.bottom;
919
+ }
920
+ else {
921
+ top = callerRect.bottom + 4;
922
+ }
923
+ }
924
+ }
925
+ else {
926
+ top = callerRect.top + callerRect.height * 0.5;
927
+ // Make sure the arrow never detaches from the popover.
928
+ if (top - pixelTolerance < popoverRect.top) {
929
+ top = popoverRect.top + pixelTolerance;
930
+ }
931
+ else if (top + pixelTolerance > popoverRect.bottom) {
932
+ top = popoverRect.bottom - pixelTolerance;
933
+ }
934
+ if (placement === 'left') {
935
+ if (themeName !== 'modern') {
936
+ left = callerRect.left - arrowRect.width;
937
+ }
938
+ else {
939
+ left = callerRect.left - arrowRect.width + 5;
940
+ }
941
+ }
942
+ else {
943
+ if (themeName !== 'modern') {
944
+ left = callerRect.right;
945
+ }
946
+ else {
947
+ left = callerRect.right + 4;
948
+ }
949
+ }
950
+ }
951
+ return { top, left };
952
+ }
953
+ }
954
+ SkyPopoverAdapterService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: SkyPopoverAdapterService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
955
+ SkyPopoverAdapterService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: SkyPopoverAdapterService });
956
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: SkyPopoverAdapterService, decorators: [{
957
+ type: Injectable
958
+ }] });
959
+
960
+ /**
961
+ * @internal
962
+ */
963
+ const skyPopoverAnimation = trigger('skyPopoverAnimation', [
964
+ state('void', style({
965
+ opacity: 0,
966
+ })),
967
+ state('open', style({
968
+ opacity: 1,
969
+ })),
970
+ state('closed', style({
971
+ opacity: 0,
972
+ })),
973
+ transition('void => *', [animate('250ms')]),
974
+ transition('open => closed', [animate('150ms')]),
975
+ transition('closed => open', [animate('150ms')]),
976
+ ]);
977
+
978
+ function parseAffixPlacement(placement) {
979
+ switch (placement) {
980
+ case 'above':
981
+ return 'above';
982
+ case 'below':
983
+ return 'below';
984
+ case 'right':
985
+ return 'right';
986
+ case 'left':
987
+ return 'left';
988
+ /* istanbul ignore next */
989
+ default:
990
+ throw `SkyAffixPlacement does not have a matching value for '${placement}'!`;
991
+ }
992
+ }
993
+ function parseAffixHorizontalAlignment(alignment) {
994
+ switch (alignment) {
995
+ case 'center':
996
+ return 'center';
997
+ case 'left':
998
+ return 'left';
999
+ case 'right':
1000
+ return 'right';
1001
+ /* istanbul ignore next */
1002
+ default:
1003
+ throw `SkyAffixHorizontalAlignment does not have a matching value for '${alignment}'!`;
1004
+ }
1005
+ }
1006
+
1007
+ /**
1008
+ * @dynamic
1009
+ * @internal
1010
+ */
1011
+ class SkyPopoverContext {
1012
+ constructor(args) {
1013
+ this.contentTemplateRef = args.contentTemplateRef;
1014
+ }
1015
+ }
1016
+
1017
+ /**
1018
+ * @internal
1019
+ */
1020
+ class SkyPopoverContentComponent {
1021
+ constructor(changeDetector, elementRef, affixService, coreAdapterService, adapterService, context, themeSvc) {
1022
+ this.changeDetector = changeDetector;
1023
+ this.elementRef = elementRef;
1024
+ this.affixService = affixService;
1025
+ this.coreAdapterService = coreAdapterService;
1026
+ this.adapterService = adapterService;
1027
+ this.context = context;
1028
+ this.themeSvc = themeSvc;
1029
+ this.dismissOnBlur = true;
1030
+ this.enableAnimations = true;
1031
+ this.isOpen = false;
1032
+ this.popoverType = 'info';
1033
+ this.ngUnsubscribe = new Subject();
1034
+ this._closed = new Subject();
1035
+ this._isMouseEnter = new Subject();
1036
+ this._opened = new Subject();
1037
+ }
1038
+ get animationState() {
1039
+ return this.isOpen ? 'open' : 'closed';
1040
+ }
1041
+ get closed() {
1042
+ return this._closed.asObservable();
1043
+ }
1044
+ get opened() {
1045
+ return this._opened.asObservable();
1046
+ }
1047
+ get isMouseEnter() {
1048
+ return this._isMouseEnter.asObservable();
1049
+ }
1050
+ ngOnInit() {
1051
+ var _a;
1052
+ /*istanbul ignore next*/
1053
+ this.contentTarget.createEmbeddedView((_a = this.context) === null || _a === void 0 ? void 0 : _a.contentTemplateRef);
1054
+ this.addEventListeners();
1055
+ /*istanbul ignore else*/
1056
+ if (this.themeSvc) {
1057
+ this.themeSvc.settingsChange
1058
+ .pipe(takeUntil(this.ngUnsubscribe))
1059
+ .subscribe((themeSettings) => {
1060
+ var _a, _b;
1061
+ /*istanbul ignore next*/
1062
+ this.themeName = (_b = (_a = themeSettings.currentSettings) === null || _a === void 0 ? void 0 : _a.theme) === null || _b === void 0 ? void 0 : _b.name;
1063
+ });
1064
+ }
1065
+ }
1066
+ ngOnDestroy() {
1067
+ this.ngUnsubscribe.next();
1068
+ this.ngUnsubscribe.complete();
1069
+ this._closed.complete();
1070
+ this._isMouseEnter.complete();
1071
+ this._opened.complete();
1072
+ /* istanbul ignore else */
1073
+ if (this.affixer) {
1074
+ this.affixer.destroy();
1075
+ }
1076
+ this._closed =
1077
+ this._isMouseEnter =
1078
+ this._opened =
1079
+ this.affixer =
1080
+ this.ngUnsubscribe =
1081
+ undefined;
1082
+ }
1083
+ onAnimationEvent(event) {
1084
+ var _a, _b;
1085
+ if (event.fromState === 'void') {
1086
+ return;
1087
+ }
1088
+ if (event.phaseName === 'done') {
1089
+ if (event.toState === 'open') {
1090
+ /*istanbul ignore next*/
1091
+ (_a = this._opened) === null || _a === void 0 ? void 0 : _a.next();
1092
+ }
1093
+ else {
1094
+ /*istanbul ignore next*/
1095
+ (_b = this._closed) === null || _b === void 0 ? void 0 : _b.next();
1096
+ }
1097
+ }
1098
+ }
1099
+ open(caller, config) {
1100
+ this.caller = caller;
1101
+ this.dismissOnBlur = config.dismissOnBlur;
1102
+ this.enableAnimations = config.enableAnimations;
1103
+ this.horizontalAlignment = config.horizontalAlignment;
1104
+ this.placement = config.placement;
1105
+ this.popoverTitle = config.popoverTitle;
1106
+ if (config.popoverType) {
1107
+ this.popoverType = config.popoverType;
1108
+ }
1109
+ this.changeDetector.markForCheck();
1110
+ // Indicates if the popover should be displayed statically.
1111
+ // Please note: This feature is internal-only and used by the visual tests to capture multiple
1112
+ // states simultaneously without the overhead of event listeners.
1113
+ /* istanbul ignore if */
1114
+ if (config.isStatic) {
1115
+ this.isOpen = true;
1116
+ this.changeDetector.markForCheck();
1117
+ return;
1118
+ }
1119
+ // Let the styles render before gauging the affix dimensions.
1120
+ setTimeout(() => {
1121
+ var _a;
1122
+ /*istanbul ignore next*/
1123
+ if (!((_a = this.popoverRef) === null || _a === void 0 ? void 0 : _a.nativeElement) ||
1124
+ !this.ngUnsubscribe ||
1125
+ this.ngUnsubscribe.isStopped) {
1126
+ return;
1127
+ }
1128
+ if (!this.affixer) {
1129
+ this.setupAffixer();
1130
+ }
1131
+ const affixOptions = {
1132
+ autoFitContext: SkyAffixAutoFitContext.Viewport,
1133
+ enableAutoFit: true,
1134
+ horizontalAlignment: parseAffixHorizontalAlignment(this.horizontalAlignment),
1135
+ isSticky: true,
1136
+ placement: parseAffixPlacement(this.placement),
1137
+ };
1138
+ // Ensure that we are positioning the vertical alginment correctly. These
1139
+ // are the default alignments for all popovers but ensure that we are future proof here.
1140
+ if (affixOptions.placement === 'left' ||
1141
+ affixOptions.placement === 'right') {
1142
+ affixOptions.verticalAlignment = 'middle';
1143
+ }
1144
+ else if (affixOptions.placement === 'above') {
1145
+ affixOptions.verticalAlignment = 'bottom';
1146
+ }
1147
+ else {
1148
+ affixOptions.verticalAlignment = 'top';
1149
+ }
1150
+ this.affixer.affixTo(this.caller.nativeElement, affixOptions);
1151
+ this.updateArrowOffset();
1152
+ this.isOpen = true;
1153
+ this.changeDetector.markForCheck();
1154
+ });
1155
+ }
1156
+ close() {
1157
+ this.isOpen = false;
1158
+ this.changeDetector.markForCheck();
1159
+ }
1160
+ applyFocus() {
1161
+ if (this.isOpen) {
1162
+ this.coreAdapterService.getFocusableChildrenAndApplyFocus(this.popoverRef, '.sky-popover', true);
1163
+ }
1164
+ }
1165
+ setupAffixer() {
1166
+ const affixer = this.affixService.createAffixer(this.popoverRef);
1167
+ affixer.offsetChange.pipe(takeUntil(this.ngUnsubscribe)).subscribe(() => {
1168
+ this.updateArrowOffset();
1169
+ this.changeDetector.markForCheck();
1170
+ });
1171
+ affixer.overflowScroll.pipe(takeUntil(this.ngUnsubscribe)).subscribe(() => {
1172
+ this.updateArrowOffset();
1173
+ this.changeDetector.markForCheck();
1174
+ });
1175
+ affixer.placementChange
1176
+ .pipe(takeUntil(this.ngUnsubscribe))
1177
+ .subscribe((change) => {
1178
+ this.placement = change.placement;
1179
+ this.changeDetector.markForCheck();
1180
+ });
1181
+ this.affixer = affixer;
1182
+ }
1183
+ updateArrowOffset() {
1184
+ const { top, left } = this.adapterService.getArrowCoordinates({
1185
+ caller: this.caller,
1186
+ popover: this.popoverRef,
1187
+ popoverArrow: this.arrowRef,
1188
+ }, this.placement, this.themeName);
1189
+ this.arrowTop = top;
1190
+ this.arrowLeft = left;
1191
+ }
1192
+ isFocusLeavingElement(event) {
1193
+ const focusableItems = this.coreAdapterService.getFocusableChildren(this.elementRef.nativeElement);
1194
+ const isFirstItem = focusableItems[0] === event.target && event.shiftKey;
1195
+ const isLastItem = focusableItems[focusableItems.length - 1] === event.target &&
1196
+ !event.shiftKey;
1197
+ return focusableItems.length === 0 || isFirstItem || isLastItem;
1198
+ }
1199
+ addEventListeners() {
1200
+ const hostElement = this.elementRef.nativeElement;
1201
+ fromEvent(hostElement, 'mouseenter')
1202
+ .pipe(takeUntil(this.ngUnsubscribe))
1203
+ .subscribe(() => this._isMouseEnter.next(true));
1204
+ fromEvent(hostElement, 'mouseleave')
1205
+ .pipe(takeUntil(this.ngUnsubscribe))
1206
+ .subscribe(() => this._isMouseEnter.next(false));
1207
+ fromEvent(hostElement, 'keydown')
1208
+ .pipe(takeUntil(this.ngUnsubscribe))
1209
+ .subscribe((event) => {
1210
+ const key = event.key.toLowerCase();
1211
+ /* tslint:disable-next-line:switch-default */
1212
+ switch (key) {
1213
+ case 'escape':
1214
+ this.close();
1215
+ this.caller.nativeElement.focus();
1216
+ event.preventDefault();
1217
+ event.stopPropagation();
1218
+ break;
1219
+ // Since the popover now lives in an overlay at the bottom of the document body, we need
1220
+ // to handle the tab key ourselves. Otherwise, focus would be moved to the browser's
1221
+ // search bar.
1222
+ case 'tab':
1223
+ if (!this.dismissOnBlur) {
1224
+ return;
1225
+ }
1226
+ /*istanbul ignore else*/
1227
+ if (this.isFocusLeavingElement(event)) {
1228
+ this.close();
1229
+ this.caller.nativeElement.focus();
1230
+ event.preventDefault();
1231
+ event.stopPropagation();
1232
+ }
1233
+ break;
1234
+ }
1235
+ });
1236
+ }
1237
+ }
1238
+ SkyPopoverContentComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: SkyPopoverContentComponent, deps: [{ token: i0.ChangeDetectorRef }, { token: i0.ElementRef }, { token: i1.SkyAffixService }, { token: i1.SkyCoreAdapterService }, { token: SkyPopoverAdapterService }, { token: SkyPopoverContext, optional: true }, { token: i2.SkyThemeService, optional: true }], target: i0.ɵɵFactoryTarget.Component });
1239
+ SkyPopoverContentComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.2.7", type: SkyPopoverContentComponent, selector: "sky-popover-content", providers: [SkyPopoverAdapterService], viewQueries: [{ propertyName: "arrowRef", first: true, predicate: ["arrowRef"], descendants: true, read: ElementRef, static: true }, { propertyName: "popoverRef", first: true, predicate: ["popoverRef"], descendants: true, read: ElementRef, static: true }, { propertyName: "contentTarget", first: true, predicate: ["contentTarget"], descendants: true, read: ViewContainerRef, static: true }], ngImport: i0, template: "<div\n class=\"sky-popover-container sky-popover-max-height\"\n [@.disabled]=\"!enableAnimations\"\n [@skyPopoverAnimation]=\"animationState\"\n [class.sky-popover-hidden]=\"!placement\"\n [ngClass]=\"[\n 'sky-popover-alignment-' + horizontalAlignment,\n 'sky-popover-placement-' + placement,\n 'sky-popover-' + popoverType\n ]\"\n (@skyPopoverAnimation.done)=\"onAnimationEvent($event)\"\n (@skyPopoverAnimation.start)=\"onAnimationEvent($event)\"\n #popoverRef\n>\n <div\n class=\"sky-popover\"\n tabindex=\"-1\"\n [skyThemeClass]=\"{\n 'sky-rounded-corners sky-shadow': 'default',\n 'sky-elevation-4': 'modern'\n }\"\n >\n <header\n *ngIf=\"popoverTitle\"\n class=\"sky-popover-header\"\n [skyThemeClass]=\"{\n 'sky-padding-even-default': 'default',\n 'sky-padding-even-lg sky-margin-stacked-lg': 'modern'\n }\"\n >\n <h1\n *ngIf=\"popoverTitle\"\n class=\"sky-popover-title\"\n [skyThemeClass]=\"{\n 'sky-emphasized': 'default',\n 'sky-font-emphasized': 'modern'\n }\"\n >\n {{ popoverTitle }}\n </h1>\n </header>\n <div\n class=\"sky-popover-body\"\n [skyThemeClass]=\"{\n 'sky-padding-even-default': 'default',\n 'sky-padding-even-lg': 'modern'\n }\"\n >\n <ng-container #contentTarget></ng-container>\n </div>\n <span\n aria-hidden=\"true\"\n class=\"sky-popover-arrow\"\n [style.left.px]=\"arrowLeft\"\n [style.top.px]=\"arrowTop\"\n #arrowRef\n ></span>\n </div>\n</div>\n", styles: [".sky-popover-container{position:fixed;min-width:276px;max-width:276px}.sky-popover-container.sky-popover-hidden{visibility:hidden;opacity:0;pointer-events:none!important}.sky-popover-container.sky-popover-hidden *{pointer-events:none!important}.sky-popover-container.sky-popover-static .sky-popover-arrow{position:absolute}.sky-popover-container:focus{outline:none}@media (max-width: 276px){.sky-popover-container{max-width:100%;min-width:auto}}.sky-popover{background-color:#fff}.sky-popover-header{padding-bottom:0}.sky-popover-header+.sky-popover-body{padding-top:2px}.sky-popover-title{margin:0}.sky-popover-arrow{width:0;height:0;position:fixed;border:10px solid transparent}.sky-popover-placement-above{padding-bottom:10px}.sky-popover-placement-above .sky-popover{border-bottom:10px solid #00b4f1}.sky-popover-placement-above .sky-popover-arrow{border-bottom:0;border-top-color:#00b4f1;bottom:0;left:50%;margin-left:-10px}.sky-popover-placement-above.sky-popover-danger .sky-popover{border-bottom-color:#ef4044}.sky-popover-placement-above.sky-popover-danger .sky-popover-arrow{border-top-color:#ef4044}.sky-popover-placement-below{padding-top:10px}.sky-popover-placement-below .sky-popover{border-top:10px solid #00b4f1}.sky-popover-placement-below .sky-popover-arrow{border-top:0;border-bottom-color:#00b4f1;top:0;left:50%;margin-left:-10px}.sky-popover-placement-below.sky-popover-danger .sky-popover{border-top-color:#ef4044}.sky-popover-placement-below.sky-popover-danger .sky-popover-arrow{border-bottom-color:#ef4044}.sky-popover-placement-right{padding-left:10px}.sky-popover-placement-right .sky-popover{border-left:10px solid #00b4f1}.sky-popover-placement-right .sky-popover-arrow{border-left:0;border-right-color:#00b4f1;left:0;top:50%;margin-top:-10px}.sky-popover-placement-right.sky-popover-danger .sky-popover{border-left-color:#ef4044}.sky-popover-placement-right.sky-popover-danger .sky-popover-arrow{border-right-color:#ef4044}.sky-popover-placement-left{padding-right:10px}.sky-popover-placement-left .sky-popover{border-right:10px solid #00b4f1}.sky-popover-placement-left .sky-popover-arrow{border-right:0;border-left-color:#00b4f1;right:0;top:50%;margin-top:-10px}.sky-popover-placement-left.sky-popover-danger .sky-popover{border-right-color:#ef4044}.sky-popover-placement-left.sky-popover-danger .sky-popover-arrow{border-left-color:#ef4044}.sky-popover-placement-above.sky-popover-alignment-left .sky-popover-arrow,.sky-popover-placement-below.sky-popover-alignment-left .sky-popover-arrow{left:40px;right:auto}.sky-popover-placement-above.sky-popover-alignment-right .sky-popover-arrow,.sky-popover-placement-below.sky-popover-alignment-right .sky-popover-arrow{left:auto;right:40px}.sky-popover-max-height .sky-popover{overflow-y:auto;overflow-x:hidden;min-height:35px;max-height:calc(50vh - 50px)}:host-context(.sky-theme-modern) .sky-popover{border-radius:6px}:host-context(.sky-theme-modern) .sky-popover-arrow{transform:rotate(45deg);border-color:transparent}:host-context(.sky-theme-modern) .sky-popover-placement-above{padding-bottom:10px}:host-context(.sky-theme-modern) .sky-popover-placement-above .sky-popover{border-bottom:6px solid #00b4f1}:host-context(.sky-theme-modern) .sky-popover-placement-above .sky-popover-arrow{bottom:1px;border-radius:0 0 3px;border-bottom:solid 10px #00b4f1;border-right:solid 10px #00b4f1}:host-context(.sky-theme-modern) .sky-popover-placement-above.sky-popover-danger .sky-popover{border-bottom-color:#ef4044}:host-context(.sky-theme-modern) .sky-popover-placement-above.sky-popover-danger .sky-popover-arrow{border-bottom-color:#ef4044;border-right-color:#ef4044;border-top-color:transparent;border-left-color:transparent}:host-context(.sky-theme-modern) .sky-popover-placement-below{padding-top:10px}:host-context(.sky-theme-modern) .sky-popover-placement-below .sky-popover{border-top:6px solid #00b4f1}:host-context(.sky-theme-modern) .sky-popover-placement-below .sky-popover-arrow{top:1px;border-radius:3px 0 0;border-top:solid 10px #00b4f1;border-left:solid 10px #00b4f1}:host-context(.sky-theme-modern) .sky-popover-placement-below.sky-popover-danger .sky-popover{border-top-color:#ef4044}:host-context(.sky-theme-modern) .sky-popover-placement-below.sky-popover-danger .sky-popover-arrow{border-top-color:#ef4044;border-left-color:#ef4044;border-bottom-color:transparent;border-right-color:transparent}:host-context(.sky-theme-modern) .sky-popover-placement-right{padding-left:10px}:host-context(.sky-theme-modern) .sky-popover-placement-right .sky-popover{border-left:6px solid #00b4f1}:host-context(.sky-theme-modern) .sky-popover-placement-right .sky-popover-arrow{left:1px;border-radius:0 0 0 3px;border-bottom:solid 10px #00b4f1;border-left:solid 10px #00b4f1}:host-context(.sky-theme-modern) .sky-popover-placement-right.sky-popover-danger .sky-popover{border-left-color:#ef4044}:host-context(.sky-theme-modern) .sky-popover-placement-right.sky-popover-danger .sky-popover-arrow{border-bottom-color:#ef4044;border-left-color:#ef4044;border-top-color:transparent;border-right-color:transparent}:host-context(.sky-theme-modern) .sky-popover-placement-left{padding-right:10px}:host-context(.sky-theme-modern) .sky-popover-placement-left .sky-popover{border-right:6px solid #00b4f1}:host-context(.sky-theme-modern) .sky-popover-placement-left .sky-popover-arrow{right:1px;border-radius:0 3px 0 0;border-top:solid 10px #00b4f1;border-right:solid 10px #00b4f1}:host-context(.sky-theme-modern) .sky-popover-placement-left.sky-popover-danger .sky-popover{border-right-color:#ef4044}:host-context(.sky-theme-modern) .sky-popover-placement-left.sky-popover-danger .sky-popover-arrow{border-top-color:#ef4044;border-right-color:#ef4044;border-bottom-color:transparent;border-left-color:transparent}.sky-theme-modern .sky-popover{border-radius:6px}.sky-theme-modern .sky-popover-arrow{transform:rotate(45deg);border-color:transparent}.sky-theme-modern .sky-popover-placement-above{padding-bottom:10px}.sky-theme-modern .sky-popover-placement-above .sky-popover{border-bottom:6px solid #00b4f1}.sky-theme-modern .sky-popover-placement-above .sky-popover-arrow{bottom:1px;border-radius:0 0 3px;border-bottom:solid 10px #00b4f1;border-right:solid 10px #00b4f1}.sky-theme-modern .sky-popover-placement-above.sky-popover-danger .sky-popover{border-bottom-color:#ef4044}.sky-theme-modern .sky-popover-placement-above.sky-popover-danger .sky-popover-arrow{border-bottom-color:#ef4044;border-right-color:#ef4044;border-top-color:transparent;border-left-color:transparent}.sky-theme-modern .sky-popover-placement-below{padding-top:10px}.sky-theme-modern .sky-popover-placement-below .sky-popover{border-top:6px solid #00b4f1}.sky-theme-modern .sky-popover-placement-below .sky-popover-arrow{top:1px;border-radius:3px 0 0;border-top:solid 10px #00b4f1;border-left:solid 10px #00b4f1}.sky-theme-modern .sky-popover-placement-below.sky-popover-danger .sky-popover{border-top-color:#ef4044}.sky-theme-modern .sky-popover-placement-below.sky-popover-danger .sky-popover-arrow{border-top-color:#ef4044;border-left-color:#ef4044;border-bottom-color:transparent;border-right-color:transparent}.sky-theme-modern .sky-popover-placement-right{padding-left:10px}.sky-theme-modern .sky-popover-placement-right .sky-popover{border-left:6px solid #00b4f1}.sky-theme-modern .sky-popover-placement-right .sky-popover-arrow{left:1px;border-radius:0 0 0 3px;border-bottom:solid 10px #00b4f1;border-left:solid 10px #00b4f1}.sky-theme-modern .sky-popover-placement-right.sky-popover-danger .sky-popover{border-left-color:#ef4044}.sky-theme-modern .sky-popover-placement-right.sky-popover-danger .sky-popover-arrow{border-bottom-color:#ef4044;border-left-color:#ef4044;border-top-color:transparent;border-right-color:transparent}.sky-theme-modern .sky-popover-placement-left{padding-right:10px}.sky-theme-modern .sky-popover-placement-left .sky-popover{border-right:6px solid #00b4f1}.sky-theme-modern .sky-popover-placement-left .sky-popover-arrow{right:1px;border-radius:0 3px 0 0;border-top:solid 10px #00b4f1;border-right:solid 10px #00b4f1}.sky-theme-modern .sky-popover-placement-left.sky-popover-danger .sky-popover{border-right-color:#ef4044}.sky-theme-modern .sky-popover-placement-left.sky-popover-danger .sky-popover-arrow{border-top-color:#ef4044;border-right-color:#ef4044;border-bottom-color:transparent;border-left-color:transparent}\n"], directives: [{ type: i4.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: i2.λ2, selector: "[skyThemeClass]", inputs: ["class", "skyThemeClass"] }, { type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }], animations: [skyPopoverAnimation] });
1240
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: SkyPopoverContentComponent, decorators: [{
1241
+ type: Component,
1242
+ args: [{ selector: 'sky-popover-content', animations: [skyPopoverAnimation], providers: [SkyPopoverAdapterService], template: "<div\n class=\"sky-popover-container sky-popover-max-height\"\n [@.disabled]=\"!enableAnimations\"\n [@skyPopoverAnimation]=\"animationState\"\n [class.sky-popover-hidden]=\"!placement\"\n [ngClass]=\"[\n 'sky-popover-alignment-' + horizontalAlignment,\n 'sky-popover-placement-' + placement,\n 'sky-popover-' + popoverType\n ]\"\n (@skyPopoverAnimation.done)=\"onAnimationEvent($event)\"\n (@skyPopoverAnimation.start)=\"onAnimationEvent($event)\"\n #popoverRef\n>\n <div\n class=\"sky-popover\"\n tabindex=\"-1\"\n [skyThemeClass]=\"{\n 'sky-rounded-corners sky-shadow': 'default',\n 'sky-elevation-4': 'modern'\n }\"\n >\n <header\n *ngIf=\"popoverTitle\"\n class=\"sky-popover-header\"\n [skyThemeClass]=\"{\n 'sky-padding-even-default': 'default',\n 'sky-padding-even-lg sky-margin-stacked-lg': 'modern'\n }\"\n >\n <h1\n *ngIf=\"popoverTitle\"\n class=\"sky-popover-title\"\n [skyThemeClass]=\"{\n 'sky-emphasized': 'default',\n 'sky-font-emphasized': 'modern'\n }\"\n >\n {{ popoverTitle }}\n </h1>\n </header>\n <div\n class=\"sky-popover-body\"\n [skyThemeClass]=\"{\n 'sky-padding-even-default': 'default',\n 'sky-padding-even-lg': 'modern'\n }\"\n >\n <ng-container #contentTarget></ng-container>\n </div>\n <span\n aria-hidden=\"true\"\n class=\"sky-popover-arrow\"\n [style.left.px]=\"arrowLeft\"\n [style.top.px]=\"arrowTop\"\n #arrowRef\n ></span>\n </div>\n</div>\n", styles: [".sky-popover-container{position:fixed;min-width:276px;max-width:276px}.sky-popover-container.sky-popover-hidden{visibility:hidden;opacity:0;pointer-events:none!important}.sky-popover-container.sky-popover-hidden *{pointer-events:none!important}.sky-popover-container.sky-popover-static .sky-popover-arrow{position:absolute}.sky-popover-container:focus{outline:none}@media (max-width: 276px){.sky-popover-container{max-width:100%;min-width:auto}}.sky-popover{background-color:#fff}.sky-popover-header{padding-bottom:0}.sky-popover-header+.sky-popover-body{padding-top:2px}.sky-popover-title{margin:0}.sky-popover-arrow{width:0;height:0;position:fixed;border:10px solid transparent}.sky-popover-placement-above{padding-bottom:10px}.sky-popover-placement-above .sky-popover{border-bottom:10px solid #00b4f1}.sky-popover-placement-above .sky-popover-arrow{border-bottom:0;border-top-color:#00b4f1;bottom:0;left:50%;margin-left:-10px}.sky-popover-placement-above.sky-popover-danger .sky-popover{border-bottom-color:#ef4044}.sky-popover-placement-above.sky-popover-danger .sky-popover-arrow{border-top-color:#ef4044}.sky-popover-placement-below{padding-top:10px}.sky-popover-placement-below .sky-popover{border-top:10px solid #00b4f1}.sky-popover-placement-below .sky-popover-arrow{border-top:0;border-bottom-color:#00b4f1;top:0;left:50%;margin-left:-10px}.sky-popover-placement-below.sky-popover-danger .sky-popover{border-top-color:#ef4044}.sky-popover-placement-below.sky-popover-danger .sky-popover-arrow{border-bottom-color:#ef4044}.sky-popover-placement-right{padding-left:10px}.sky-popover-placement-right .sky-popover{border-left:10px solid #00b4f1}.sky-popover-placement-right .sky-popover-arrow{border-left:0;border-right-color:#00b4f1;left:0;top:50%;margin-top:-10px}.sky-popover-placement-right.sky-popover-danger .sky-popover{border-left-color:#ef4044}.sky-popover-placement-right.sky-popover-danger .sky-popover-arrow{border-right-color:#ef4044}.sky-popover-placement-left{padding-right:10px}.sky-popover-placement-left .sky-popover{border-right:10px solid #00b4f1}.sky-popover-placement-left .sky-popover-arrow{border-right:0;border-left-color:#00b4f1;right:0;top:50%;margin-top:-10px}.sky-popover-placement-left.sky-popover-danger .sky-popover{border-right-color:#ef4044}.sky-popover-placement-left.sky-popover-danger .sky-popover-arrow{border-left-color:#ef4044}.sky-popover-placement-above.sky-popover-alignment-left .sky-popover-arrow,.sky-popover-placement-below.sky-popover-alignment-left .sky-popover-arrow{left:40px;right:auto}.sky-popover-placement-above.sky-popover-alignment-right .sky-popover-arrow,.sky-popover-placement-below.sky-popover-alignment-right .sky-popover-arrow{left:auto;right:40px}.sky-popover-max-height .sky-popover{overflow-y:auto;overflow-x:hidden;min-height:35px;max-height:calc(50vh - 50px)}:host-context(.sky-theme-modern) .sky-popover{border-radius:6px}:host-context(.sky-theme-modern) .sky-popover-arrow{transform:rotate(45deg);border-color:transparent}:host-context(.sky-theme-modern) .sky-popover-placement-above{padding-bottom:10px}:host-context(.sky-theme-modern) .sky-popover-placement-above .sky-popover{border-bottom:6px solid #00b4f1}:host-context(.sky-theme-modern) .sky-popover-placement-above .sky-popover-arrow{bottom:1px;border-radius:0 0 3px;border-bottom:solid 10px #00b4f1;border-right:solid 10px #00b4f1}:host-context(.sky-theme-modern) .sky-popover-placement-above.sky-popover-danger .sky-popover{border-bottom-color:#ef4044}:host-context(.sky-theme-modern) .sky-popover-placement-above.sky-popover-danger .sky-popover-arrow{border-bottom-color:#ef4044;border-right-color:#ef4044;border-top-color:transparent;border-left-color:transparent}:host-context(.sky-theme-modern) .sky-popover-placement-below{padding-top:10px}:host-context(.sky-theme-modern) .sky-popover-placement-below .sky-popover{border-top:6px solid #00b4f1}:host-context(.sky-theme-modern) .sky-popover-placement-below .sky-popover-arrow{top:1px;border-radius:3px 0 0;border-top:solid 10px #00b4f1;border-left:solid 10px #00b4f1}:host-context(.sky-theme-modern) .sky-popover-placement-below.sky-popover-danger .sky-popover{border-top-color:#ef4044}:host-context(.sky-theme-modern) .sky-popover-placement-below.sky-popover-danger .sky-popover-arrow{border-top-color:#ef4044;border-left-color:#ef4044;border-bottom-color:transparent;border-right-color:transparent}:host-context(.sky-theme-modern) .sky-popover-placement-right{padding-left:10px}:host-context(.sky-theme-modern) .sky-popover-placement-right .sky-popover{border-left:6px solid #00b4f1}:host-context(.sky-theme-modern) .sky-popover-placement-right .sky-popover-arrow{left:1px;border-radius:0 0 0 3px;border-bottom:solid 10px #00b4f1;border-left:solid 10px #00b4f1}:host-context(.sky-theme-modern) .sky-popover-placement-right.sky-popover-danger .sky-popover{border-left-color:#ef4044}:host-context(.sky-theme-modern) .sky-popover-placement-right.sky-popover-danger .sky-popover-arrow{border-bottom-color:#ef4044;border-left-color:#ef4044;border-top-color:transparent;border-right-color:transparent}:host-context(.sky-theme-modern) .sky-popover-placement-left{padding-right:10px}:host-context(.sky-theme-modern) .sky-popover-placement-left .sky-popover{border-right:6px solid #00b4f1}:host-context(.sky-theme-modern) .sky-popover-placement-left .sky-popover-arrow{right:1px;border-radius:0 3px 0 0;border-top:solid 10px #00b4f1;border-right:solid 10px #00b4f1}:host-context(.sky-theme-modern) .sky-popover-placement-left.sky-popover-danger .sky-popover{border-right-color:#ef4044}:host-context(.sky-theme-modern) .sky-popover-placement-left.sky-popover-danger .sky-popover-arrow{border-top-color:#ef4044;border-right-color:#ef4044;border-bottom-color:transparent;border-left-color:transparent}.sky-theme-modern .sky-popover{border-radius:6px}.sky-theme-modern .sky-popover-arrow{transform:rotate(45deg);border-color:transparent}.sky-theme-modern .sky-popover-placement-above{padding-bottom:10px}.sky-theme-modern .sky-popover-placement-above .sky-popover{border-bottom:6px solid #00b4f1}.sky-theme-modern .sky-popover-placement-above .sky-popover-arrow{bottom:1px;border-radius:0 0 3px;border-bottom:solid 10px #00b4f1;border-right:solid 10px #00b4f1}.sky-theme-modern .sky-popover-placement-above.sky-popover-danger .sky-popover{border-bottom-color:#ef4044}.sky-theme-modern .sky-popover-placement-above.sky-popover-danger .sky-popover-arrow{border-bottom-color:#ef4044;border-right-color:#ef4044;border-top-color:transparent;border-left-color:transparent}.sky-theme-modern .sky-popover-placement-below{padding-top:10px}.sky-theme-modern .sky-popover-placement-below .sky-popover{border-top:6px solid #00b4f1}.sky-theme-modern .sky-popover-placement-below .sky-popover-arrow{top:1px;border-radius:3px 0 0;border-top:solid 10px #00b4f1;border-left:solid 10px #00b4f1}.sky-theme-modern .sky-popover-placement-below.sky-popover-danger .sky-popover{border-top-color:#ef4044}.sky-theme-modern .sky-popover-placement-below.sky-popover-danger .sky-popover-arrow{border-top-color:#ef4044;border-left-color:#ef4044;border-bottom-color:transparent;border-right-color:transparent}.sky-theme-modern .sky-popover-placement-right{padding-left:10px}.sky-theme-modern .sky-popover-placement-right .sky-popover{border-left:6px solid #00b4f1}.sky-theme-modern .sky-popover-placement-right .sky-popover-arrow{left:1px;border-radius:0 0 0 3px;border-bottom:solid 10px #00b4f1;border-left:solid 10px #00b4f1}.sky-theme-modern .sky-popover-placement-right.sky-popover-danger .sky-popover{border-left-color:#ef4044}.sky-theme-modern .sky-popover-placement-right.sky-popover-danger .sky-popover-arrow{border-bottom-color:#ef4044;border-left-color:#ef4044;border-top-color:transparent;border-right-color:transparent}.sky-theme-modern .sky-popover-placement-left{padding-right:10px}.sky-theme-modern .sky-popover-placement-left .sky-popover{border-right:6px solid #00b4f1}.sky-theme-modern .sky-popover-placement-left .sky-popover-arrow{right:1px;border-radius:0 3px 0 0;border-top:solid 10px #00b4f1;border-right:solid 10px #00b4f1}.sky-theme-modern .sky-popover-placement-left.sky-popover-danger .sky-popover{border-right-color:#ef4044}.sky-theme-modern .sky-popover-placement-left.sky-popover-danger .sky-popover-arrow{border-top-color:#ef4044;border-right-color:#ef4044;border-bottom-color:transparent;border-left-color:transparent}\n"] }]
1243
+ }], ctorParameters: function () {
1244
+ return [{ type: i0.ChangeDetectorRef }, { type: i0.ElementRef }, { type: i1.SkyAffixService }, { type: i1.SkyCoreAdapterService }, { type: SkyPopoverAdapterService }, { type: SkyPopoverContext, decorators: [{
1245
+ type: Optional
1246
+ }] }, { type: i2.SkyThemeService, decorators: [{
1247
+ type: Optional
1248
+ }] }];
1249
+ }, propDecorators: { arrowRef: [{
1250
+ type: ViewChild,
1251
+ args: ['arrowRef', {
1252
+ read: ElementRef,
1253
+ static: true,
1254
+ }]
1255
+ }], popoverRef: [{
1256
+ type: ViewChild,
1257
+ args: ['popoverRef', {
1258
+ read: ElementRef,
1259
+ static: true,
1260
+ }]
1261
+ }], contentTarget: [{
1262
+ type: ViewChild,
1263
+ args: ['contentTarget', {
1264
+ read: ViewContainerRef,
1265
+ static: true,
1266
+ }]
1267
+ }] } });
1268
+
1269
+ class SkyPopoverComponent {
1270
+ constructor(overlayService) {
1271
+ this.overlayService = overlayService;
1272
+ /**
1273
+ * Fires when users close the popover.
1274
+ */
1275
+ this.popoverClosed = new EventEmitter();
1276
+ /**
1277
+ * Fires when users open the popover.
1278
+ */
1279
+ this.popoverOpened = new EventEmitter();
1280
+ /**
1281
+ * Indicates that the popover is in the process of being opened or closed.
1282
+ * @internal
1283
+ */
1284
+ this.isActive = false;
1285
+ /**
1286
+ * Used by unit tests to disable animations since the component is injected at the bottom of the
1287
+ * document body.
1288
+ * @internal
1289
+ */
1290
+ this.enableAnimations = true;
1291
+ this.isMouseEnter = false;
1292
+ this.isMarkedForCloseOnMouseLeave = false;
1293
+ this.ngUnsubscribe = new Subject();
1294
+ }
1295
+ /**
1296
+ * Specifies the horizontal alignment of the popover in relation to the trigger element.
1297
+ * The `skyPopoverAlignment` property on the popover directive overwrites this property.
1298
+ * Options include:`"center"`, `"right"`, and `'"left"`.
1299
+ * @default "center"
1300
+ */
1301
+ set alignment(value) {
1302
+ this._alignment = value;
1303
+ }
1304
+ get alignment() {
1305
+ return this._alignment || 'center';
1306
+ }
1307
+ /**
1308
+ * Indicates whether to close the popover when it loses focus.
1309
+ * To require users to click a trigger button to close the popover, set this input to false.
1310
+ * @default true
1311
+ */
1312
+ set dismissOnBlur(value) {
1313
+ this._dismissOnBlur = value;
1314
+ }
1315
+ get dismissOnBlur() {
1316
+ if (this._dismissOnBlur === undefined) {
1317
+ return true;
1318
+ }
1319
+ return this._dismissOnBlur;
1320
+ }
1321
+ /**
1322
+ * Specifies the placement of the popover in relation to the trigger element.
1323
+ * The `skyPopoverPlacement` property on the popover directive overwrites this property.
1324
+ * Options include:`"above"`, `"below"`, `"right"`, and `"left"`.
1325
+ * @default "above"
1326
+ */
1327
+ set placement(value) {
1328
+ this._placement = value;
1329
+ }
1330
+ get placement() {
1331
+ return this._placement || 'above';
1332
+ }
1333
+ ngOnDestroy() {
1334
+ this.ngUnsubscribe.next();
1335
+ this.ngUnsubscribe.complete();
1336
+ this.ngUnsubscribe = undefined;
1337
+ if (this.overlay) {
1338
+ this.overlayService.close(this.overlay);
1339
+ this.overlay = undefined;
1340
+ }
1341
+ }
1342
+ /**
1343
+ * Positions the popover next to a given caller element.
1344
+ * @param caller The element that opened the popover.
1345
+ * @param placement The placement of the popover.
1346
+ * @param alignment The horizontal alignment of the popover.
1347
+ * @internal
1348
+ */
1349
+ positionNextTo(caller, placement, alignment) {
1350
+ if (!this.overlay) {
1351
+ this.setupOverlay();
1352
+ }
1353
+ this.placement = placement;
1354
+ this.alignment = alignment;
1355
+ this.isActive = true;
1356
+ this.contentRef.open(caller, {
1357
+ dismissOnBlur: this.dismissOnBlur,
1358
+ enableAnimations: this.enableAnimations,
1359
+ horizontalAlignment: this.alignment,
1360
+ isStatic: false,
1361
+ placement: this.placement,
1362
+ popoverTitle: this.popoverTitle,
1363
+ popoverType: this.popoverType,
1364
+ });
1365
+ }
1366
+ /**
1367
+ * Closes the popover.
1368
+ * @internal
1369
+ */
1370
+ close() {
1371
+ var _a;
1372
+ /*istanbul ignore next*/
1373
+ (_a = this.contentRef) === null || _a === void 0 ? void 0 : _a.close();
1374
+ }
1375
+ /**
1376
+ * Brings focus to the popover element if its open.
1377
+ * @internal
1378
+ */
1379
+ applyFocus() {
1380
+ var _a;
1381
+ /*istanbul ignore next*/
1382
+ (_a = this.contentRef) === null || _a === void 0 ? void 0 : _a.applyFocus();
1383
+ }
1384
+ /**
1385
+ * Adds a flag to the popover to close when the mouse leaves the popover's bounds.
1386
+ * @internal
1387
+ */
1388
+ markForCloseOnMouseLeave() {
1389
+ this.isMarkedForCloseOnMouseLeave = true;
1390
+ }
1391
+ setupOverlay() {
1392
+ const overlay = this.overlayService.create({
1393
+ enableScroll: true,
1394
+ enablePointerEvents: true,
1395
+ });
1396
+ overlay.backdropClick.pipe(takeUntil(this.ngUnsubscribe)).subscribe(() => {
1397
+ if (this.dismissOnBlur) {
1398
+ this.close();
1399
+ }
1400
+ });
1401
+ const contentRef = overlay.attachComponent(SkyPopoverContentComponent, [
1402
+ {
1403
+ provide: SkyPopoverContext,
1404
+ useValue: new SkyPopoverContext({
1405
+ contentTemplateRef: this.templateRef,
1406
+ }),
1407
+ },
1408
+ ]);
1409
+ contentRef.opened.pipe(takeUntil(this.ngUnsubscribe)).subscribe(() => {
1410
+ this.popoverOpened.emit(this);
1411
+ });
1412
+ contentRef.closed.pipe(takeUntil(this.ngUnsubscribe)).subscribe(() => {
1413
+ /*istanbul ignore else*/
1414
+ if (this.isActive) {
1415
+ this.overlayService.close(this.overlay);
1416
+ this.overlay = undefined;
1417
+ this.isActive = false;
1418
+ this.popoverClosed.emit(this);
1419
+ }
1420
+ });
1421
+ contentRef.isMouseEnter
1422
+ .pipe(takeUntil(this.ngUnsubscribe))
1423
+ .subscribe((isMouseEnter) => {
1424
+ this.isMouseEnter = isMouseEnter;
1425
+ if (this.isMarkedForCloseOnMouseLeave) {
1426
+ this.isMarkedForCloseOnMouseLeave = false;
1427
+ this.close();
1428
+ }
1429
+ });
1430
+ this.overlay = overlay;
1431
+ this.contentRef = contentRef;
1432
+ }
1433
+ }
1434
+ SkyPopoverComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: SkyPopoverComponent, deps: [{ token: i1.SkyOverlayService }], target: i0.ɵɵFactoryTarget.Component });
1435
+ SkyPopoverComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.2.7", type: SkyPopoverComponent, selector: "sky-popover", inputs: { alignment: "alignment", dismissOnBlur: "dismissOnBlur", placement: "placement", popoverTitle: "popoverTitle", popoverType: "popoverType" }, outputs: { popoverClosed: "popoverClosed", popoverOpened: "popoverOpened" }, viewQueries: [{ propertyName: "templateRef", first: true, predicate: ["templateRef"], descendants: true, read: TemplateRef, static: true }], ngImport: i0, template: "<ng-template #templateRef>\n <ng-content></ng-content>\n</ng-template>\n" });
1436
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: SkyPopoverComponent, decorators: [{
1437
+ type: Component,
1438
+ args: [{ selector: 'sky-popover', template: "<ng-template #templateRef>\n <ng-content></ng-content>\n</ng-template>\n" }]
1439
+ }], ctorParameters: function () { return [{ type: i1.SkyOverlayService }]; }, propDecorators: { alignment: [{
1440
+ type: Input
1441
+ }], dismissOnBlur: [{
1442
+ type: Input
1443
+ }], placement: [{
1444
+ type: Input
1445
+ }], popoverTitle: [{
1446
+ type: Input
1447
+ }], popoverType: [{
1448
+ type: Input
1449
+ }], popoverClosed: [{
1450
+ type: Output
1451
+ }], popoverOpened: [{
1452
+ type: Output
1453
+ }], templateRef: [{
1454
+ type: ViewChild,
1455
+ args: ['templateRef', {
1456
+ read: TemplateRef,
1457
+ static: true,
1458
+ }]
1459
+ }] } });
1460
+
1461
+ /**
1462
+ * Specifies the type of message to send to the popover component.
1463
+ */
1464
+ var SkyPopoverMessageType;
1465
+ (function (SkyPopoverMessageType) {
1466
+ /**
1467
+ * Opens the popover.
1468
+ */
1469
+ SkyPopoverMessageType[SkyPopoverMessageType["Open"] = 0] = "Open";
1470
+ /**
1471
+ * Closes the popover.
1472
+ */
1473
+ SkyPopoverMessageType[SkyPopoverMessageType["Close"] = 1] = "Close";
1474
+ /**
1475
+ * Repositions the popover to the appropriate position.
1476
+ * This is useful for when the popover's width and height change while it is open.
1477
+ */
1478
+ SkyPopoverMessageType[SkyPopoverMessageType["Reposition"] = 2] = "Reposition";
1479
+ /**
1480
+ * Brings focus to the popover element.
1481
+ */
1482
+ SkyPopoverMessageType[SkyPopoverMessageType["Focus"] = 3] = "Focus";
1483
+ })(SkyPopoverMessageType || (SkyPopoverMessageType = {}));
1484
+
1485
+ class SkyPopoverDirective {
1486
+ constructor(elementRef) {
1487
+ this.elementRef = elementRef;
1488
+ /**
1489
+ * Provides an observable to send commands to the popover that respect the `SkyPopoverMessage` type.
1490
+ */
1491
+ this.skyPopoverMessageStream = new Subject();
1492
+ this.ngUnsubscribe = new Subject();
1493
+ }
1494
+ /**
1495
+ * Specifies the user action that displays the popover.
1496
+ */
1497
+ set skyPopoverTrigger(value) {
1498
+ this._trigger = value;
1499
+ }
1500
+ get skyPopoverTrigger() {
1501
+ return this._trigger || 'click';
1502
+ }
1503
+ ngOnInit() {
1504
+ this.addEventListeners();
1505
+ }
1506
+ ngOnDestroy() {
1507
+ this.removeEventListeners();
1508
+ }
1509
+ togglePopover() {
1510
+ if (this.skyPopover.isActive) {
1511
+ this.sendMessage(SkyPopoverMessageType.Close);
1512
+ return;
1513
+ }
1514
+ this.sendMessage(SkyPopoverMessageType.Open);
1515
+ }
1516
+ positionPopover() {
1517
+ this.skyPopover.positionNextTo(this.elementRef, this.skyPopoverPlacement, this.skyPopoverAlignment);
1518
+ }
1519
+ closePopover() {
1520
+ this.skyPopover.close();
1521
+ }
1522
+ closePopoverOrMarkForClose() {
1523
+ if (this.skyPopover.isMouseEnter) {
1524
+ this.skyPopover.markForCloseOnMouseLeave();
1525
+ }
1526
+ else {
1527
+ this.sendMessage(SkyPopoverMessageType.Close);
1528
+ }
1529
+ }
1530
+ addEventListeners() {
1531
+ const element = this.elementRef.nativeElement;
1532
+ this.skyPopoverMessageStream
1533
+ .pipe(takeUntil(this.ngUnsubscribe))
1534
+ .subscribe((message) => {
1535
+ this.handleIncomingMessages(message);
1536
+ });
1537
+ fromEvent(element, 'keydown')
1538
+ .pipe(takeUntil(this.ngUnsubscribe))
1539
+ .subscribe((event) => {
1540
+ if (!this.skyPopover.isActive) {
1541
+ return;
1542
+ }
1543
+ const key = event.key.toLowerCase();
1544
+ /* tslint:disable-next-line:switch-default */
1545
+ switch (key) {
1546
+ case 'escape':
1547
+ this.sendMessage(SkyPopoverMessageType.Close);
1548
+ event.preventDefault();
1549
+ event.stopPropagation();
1550
+ break;
1551
+ case 'tab':
1552
+ if (this.skyPopover.dismissOnBlur) {
1553
+ this.sendMessage(SkyPopoverMessageType.Close);
1554
+ }
1555
+ break;
1556
+ case 'arrowdown':
1557
+ case 'arrowleft':
1558
+ case 'arrowright':
1559
+ case 'arrowup':
1560
+ case 'down':
1561
+ case 'left':
1562
+ case 'right':
1563
+ case 'up':
1564
+ this.sendMessage(SkyPopoverMessageType.Focus);
1565
+ event.stopPropagation();
1566
+ event.preventDefault();
1567
+ break;
1568
+ }
1569
+ });
1570
+ fromEvent(element, 'click')
1571
+ .pipe(takeUntil(this.ngUnsubscribe))
1572
+ .subscribe(() => {
1573
+ if (this.skyPopover) {
1574
+ this.togglePopover();
1575
+ }
1576
+ });
1577
+ fromEvent(element, 'mouseenter')
1578
+ .pipe(takeUntil(this.ngUnsubscribe))
1579
+ .subscribe(() => {
1580
+ if (this.skyPopover) {
1581
+ this.skyPopover.isMouseEnter = true;
1582
+ if (!this.skyPopover.isActive &&
1583
+ this.skyPopoverTrigger === 'mouseenter') {
1584
+ this.sendMessage(SkyPopoverMessageType.Open);
1585
+ }
1586
+ }
1587
+ });
1588
+ fromEvent(element, 'mouseleave')
1589
+ .pipe(takeUntil(this.ngUnsubscribe))
1590
+ .subscribe(() => {
1591
+ if (this.skyPopover) {
1592
+ this.skyPopover.isMouseEnter = false;
1593
+ if (this.skyPopover.isActive &&
1594
+ this.skyPopoverTrigger === 'mouseenter') {
1595
+ // Give the popover a chance to set its isMouseEnter flag before checking to see
1596
+ // if it should be closed.
1597
+ setTimeout(() => {
1598
+ this.closePopoverOrMarkForClose();
1599
+ });
1600
+ }
1601
+ }
1602
+ });
1603
+ }
1604
+ removeEventListeners() {
1605
+ this.ngUnsubscribe.next();
1606
+ this.ngUnsubscribe.complete();
1607
+ this.ngUnsubscribe = undefined;
1608
+ }
1609
+ handleIncomingMessages(message) {
1610
+ /* tslint:disable-next-line:switch-default */
1611
+ switch (message.type) {
1612
+ case SkyPopoverMessageType.Open:
1613
+ this.positionPopover();
1614
+ break;
1615
+ case SkyPopoverMessageType.Close:
1616
+ /*istanbul ignore else*/
1617
+ if (this.skyPopover.isActive) {
1618
+ this.closePopover();
1619
+ }
1620
+ break;
1621
+ case SkyPopoverMessageType.Reposition:
1622
+ // Only reposition the popover if it is already open.
1623
+ if (this.skyPopover.isActive) {
1624
+ this.positionPopover();
1625
+ }
1626
+ break;
1627
+ case SkyPopoverMessageType.Focus:
1628
+ this.skyPopover.applyFocus();
1629
+ break;
1630
+ }
1631
+ }
1632
+ sendMessage(messageType) {
1633
+ this.skyPopoverMessageStream.next({ type: messageType });
1634
+ }
1635
+ }
1636
+ SkyPopoverDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: SkyPopoverDirective, deps: [{ token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Directive });
1637
+ SkyPopoverDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "12.0.0", version: "13.2.7", type: SkyPopoverDirective, selector: "[skyPopover]", inputs: { skyPopover: "skyPopover", skyPopoverAlignment: "skyPopoverAlignment", skyPopoverMessageStream: "skyPopoverMessageStream", skyPopoverPlacement: "skyPopoverPlacement", skyPopoverTrigger: "skyPopoverTrigger" }, ngImport: i0 });
1638
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: SkyPopoverDirective, decorators: [{
1639
+ type: Directive,
1640
+ args: [{
1641
+ selector: '[skyPopover]',
1642
+ }]
1643
+ }], ctorParameters: function () { return [{ type: i0.ElementRef }]; }, propDecorators: { skyPopover: [{
1644
+ type: Input
1645
+ }], skyPopoverAlignment: [{
1646
+ type: Input
1647
+ }], skyPopoverMessageStream: [{
1648
+ type: Input
1649
+ }], skyPopoverPlacement: [{
1650
+ type: Input
1651
+ }], skyPopoverTrigger: [{
1652
+ type: Input
1653
+ }] } });
1654
+
1655
+ class SkyPopoverModule {
1656
+ }
1657
+ SkyPopoverModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: SkyPopoverModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
1658
+ SkyPopoverModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: SkyPopoverModule, declarations: [SkyPopoverComponent,
1659
+ SkyPopoverContentComponent,
1660
+ SkyPopoverDirective], imports: [CommonModule,
1661
+ SkyAffixModule,
1662
+ SkyIconModule,
1663
+ SkyOverlayModule,
1664
+ SkyPopoversResourcesModule,
1665
+ SkyThemeModule], exports: [SkyPopoverComponent,
1666
+ SkyPopoverContentComponent,
1667
+ SkyPopoverDirective] });
1668
+ SkyPopoverModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: SkyPopoverModule, imports: [[
1669
+ CommonModule,
1670
+ SkyAffixModule,
1671
+ SkyIconModule,
1672
+ SkyOverlayModule,
1673
+ SkyPopoversResourcesModule,
1674
+ SkyThemeModule,
1675
+ ]] });
1676
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: SkyPopoverModule, decorators: [{
1677
+ type: NgModule,
1678
+ args: [{
1679
+ declarations: [
1680
+ SkyPopoverComponent,
1681
+ SkyPopoverContentComponent,
1682
+ SkyPopoverDirective,
1683
+ ],
1684
+ imports: [
1685
+ CommonModule,
1686
+ SkyAffixModule,
1687
+ SkyIconModule,
1688
+ SkyOverlayModule,
1689
+ SkyPopoversResourcesModule,
1690
+ SkyThemeModule,
1691
+ ],
1692
+ exports: [
1693
+ SkyPopoverComponent,
1694
+ SkyPopoverContentComponent,
1695
+ SkyPopoverDirective,
1696
+ ],
1697
+ }]
1698
+ }] });
1699
+
1700
+ /**
1701
+ * Generated bundle index. Do not edit.
1702
+ */
1703
+
1704
+ export { SkyDropdownMessageType, SkyDropdownModule, SkyPopoverMessageType, SkyPopoverModule, SkyDropdownItemComponent as λ1, SkyDropdownButtonComponent as λ2, SkyDropdownComponent as λ3, SkyDropdownMenuComponent as λ4, SkyPopoverContentComponent as λ5, SkyPopoverComponent as λ6, SkyPopoverDirective as λ7 };
1705
+ //# sourceMappingURL=skyux-popovers.mjs.map