@skyux/popovers 5.9.2 → 5.9.5

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 (33) hide show
  1. package/bundles/skyux-popovers-testing.umd.js +12 -6
  2. package/bundles/skyux-popovers.umd.js +1531 -1536
  3. package/documentation.json +317 -284
  4. package/esm2015/lib/modules/dropdown/dropdown-item.component.js.map +1 -1
  5. package/esm2015/lib/modules/dropdown/dropdown-menu.component.js +1 -4
  6. package/esm2015/lib/modules/dropdown/dropdown-menu.component.js.map +1 -1
  7. package/esm2015/lib/modules/dropdown/dropdown.component.js +10 -7
  8. package/esm2015/lib/modules/dropdown/dropdown.component.js.map +1 -1
  9. package/esm2015/lib/modules/popover/popover-content.component.js +18 -34
  10. package/esm2015/lib/modules/popover/popover-content.component.js.map +1 -1
  11. package/esm2015/lib/modules/popover/popover.component.js +11 -2
  12. package/esm2015/lib/modules/popover/popover.component.js.map +1 -1
  13. package/esm2015/lib/modules/popover/popover.directive.js +0 -1
  14. package/esm2015/lib/modules/popover/popover.directive.js.map +1 -1
  15. package/esm2015/testing/dropdown/dropdown-fixture.js +7 -1
  16. package/esm2015/testing/dropdown/dropdown-fixture.js.map +1 -1
  17. package/esm2015/testing/dropdown/popovers-fixture-dropdown.js.map +1 -1
  18. package/esm2015/testing/popover/popover-fixture.js +8 -8
  19. package/esm2015/testing/popover/popover-fixture.js.map +1 -1
  20. package/fesm2015/skyux-popovers-testing.js +15 -9
  21. package/fesm2015/skyux-popovers-testing.js.map +1 -1
  22. package/fesm2015/skyux-popovers.js +40 -49
  23. package/fesm2015/skyux-popovers.js.map +1 -1
  24. package/lib/modules/dropdown/dropdown-item.component.d.ts +1 -1
  25. package/lib/modules/dropdown/dropdown-menu.component.d.ts +3 -3
  26. package/lib/modules/dropdown/dropdown.component.d.ts +12 -12
  27. package/lib/modules/popover/popover-content.component.d.ts +13 -12
  28. package/lib/modules/popover/popover.component.d.ts +6 -4
  29. package/lib/modules/popover/popover.directive.d.ts +3 -5
  30. package/package.json +6 -6
  31. package/testing/dropdown/dropdown-fixture.d.ts +7 -7
  32. package/testing/dropdown/popovers-fixture-dropdown.d.ts +2 -2
  33. package/testing/popover/popover-fixture.d.ts +6 -6
@@ -218,896 +218,325 @@
218
218
  type: i0.Input
219
219
  }] } });
220
220
 
221
- function parseAffixHorizontalAlignment$1(alignment) {
222
- switch (alignment) {
223
- case 'center':
224
- return 'center';
225
- case 'left':
226
- return 'left';
227
- case 'right':
228
- return 'right';
229
- /* istanbul ignore next */
230
- default:
231
- throw "SkyAffixHorizontalAlignment does not have a matching value for '" + alignment + "'!";
232
- }
233
- }
234
-
235
- /**
236
- * Creates a dropdown menu that displays menu items that users may select.
237
- */
238
- var SkyDropdownComponent = /** @class */ (function () {
239
- function SkyDropdownComponent(changeDetector, affixService, overlayService, themeSvc) {
240
- this.changeDetector = changeDetector;
241
- this.affixService = affixService;
242
- this.overlayService = overlayService;
243
- this.themeSvc = themeSvc;
244
- /**
245
- * Provides an observable to send commands to the dropdown. The commands should respect
246
- * the [[SkyDropdownMessage]] type.
247
- */
248
- this.messageStream = new rxjs.Subject();
249
- this.isMouseEnter = false;
250
- this.isVisible = false;
251
- this.ngUnsubscribe = new rxjs.Subject();
252
- this._isOpen = false;
253
- }
254
- Object.defineProperty(SkyDropdownComponent.prototype, "buttonStyle", {
255
- get: function () {
256
- return this._buttonStyle || 'default';
257
- },
258
- /**
259
- * Specifies a background color for the dropdown button. Available values are `default` and
260
- * `primary`. These values set the background color from the
261
- * [secondary and primary button classes](https://developer.blackbaud.com/skyux/components/button) respectively.
262
- * @default "default"
263
- */
264
- set: function (value) {
265
- this._buttonStyle = value;
266
- },
267
- enumerable: false,
268
- configurable: true
269
- });
270
- Object.defineProperty(SkyDropdownComponent.prototype, "buttonType", {
271
- get: function () {
272
- return this._buttonType || 'select';
273
- },
274
- /**
275
- * Specifies the type of button to render as the dropdown's trigger element. To display a button
276
- * with text and a caret, specify `select` and then enter the button text in a
277
- * `sky-dropdown-button` element. To display a round button with an ellipsis, specify
278
- * `context-menu`. And to display a button with a [Font Awesome icon](http://fontawesome.io/icons/), specify the icon's class name.
279
- * For example, to display the `fa-filter` icon, specify `filter`.
280
- * @default "select"
281
- */
282
- set: function (value) {
283
- this._buttonType = value;
284
- },
285
- enumerable: false,
286
- configurable: true
287
- });
288
- Object.defineProperty(SkyDropdownComponent.prototype, "disabled", {
289
- get: function () {
290
- return this._disabled || false;
291
- },
292
- /**
293
- * Indicates whether to disable the dropdown button.
294
- * @default false
295
- */
296
- set: function (value) {
297
- this._disabled = value;
298
- },
299
- enumerable: false,
300
- configurable: true
301
- });
302
- Object.defineProperty(SkyDropdownComponent.prototype, "dismissOnBlur", {
303
- get: function () {
304
- if (this._dismissOnBlur === undefined) {
305
- return true;
306
- }
307
- return this._dismissOnBlur;
308
- },
309
- /**
310
- * Indicates whether to close the dropdown when users click away from the menu.
311
- * @default true
312
- */
313
- set: function (value) {
314
- this._dismissOnBlur = value;
315
- },
316
- enumerable: false,
317
- configurable: true
318
- });
319
- Object.defineProperty(SkyDropdownComponent.prototype, "horizontalAlignment", {
320
- get: function () {
321
- return this._horizontalAlignment || 'left';
322
- },
323
- /**
324
- * Specifies the horizontal alignment of the dropdown menu in relation to the dropdown button.
325
- * @default "left"
326
- */
327
- set: function (value) {
328
- this._horizontalAlignment = value;
329
- },
330
- enumerable: false,
331
- configurable: true
332
- });
333
- Object.defineProperty(SkyDropdownComponent.prototype, "trigger", {
334
- get: function () {
335
- return this._trigger || 'click';
336
- },
337
- /**
338
- * Specifies how users interact with the dropdown button to expose the dropdown menu.
339
- * We recommend the default `click` value because the `hover` value can pose
340
- * [accessibility](https://developer.blackbaud.com/skyux/learn/accessibility) issues
341
- * for users on touch devices such as phones and tablets.
342
- * @deprecated We recommend against using this property. If you choose to use the deprecated
343
- * `hover` value anyway, we recommend that you not use it in combination with the `title`
344
- * property. (This property will be removed in the next major version release.)
345
- * @default "click"
346
- */
347
- set: function (value) {
348
- this._trigger = value;
349
- },
350
- enumerable: false,
351
- configurable: true
352
- });
353
- Object.defineProperty(SkyDropdownComponent.prototype, "isOpen", {
354
- get: function () {
355
- return this._isOpen || false;
356
- },
357
- set: function (value) {
358
- this._isOpen = value;
359
- this.changeDetector.markForCheck();
360
- },
361
- enumerable: false,
362
- configurable: true
363
- });
364
- Object.defineProperty(SkyDropdownComponent.prototype, "menuContainerElementRef", {
365
- get: function () {
366
- return this._menuContainerElementRef;
367
- },
368
- set: function (value) {
369
- if (value) {
370
- this._menuContainerElementRef = value;
371
- this.destroyAffixer();
372
- this.createAffixer();
373
- this.changeDetector.markForCheck();
374
- }
375
- },
376
- enumerable: false,
377
- configurable: true
378
- });
379
- SkyDropdownComponent.prototype.ngOnInit = function () {
380
- var _this = this;
381
- var _a;
382
- this.addEventListeners();
383
- this.messageStream
384
- .pipe(operators.takeUntil(this.ngUnsubscribe))
385
- .subscribe(function (message) {
386
- _this.handleIncomingMessages(message);
387
- });
388
- // Load proper icons on theme change.
389
- (_a = this.themeSvc) === null || _a === void 0 ? void 0 : _a.settingsChange.pipe(operators.takeUntil(this.ngUnsubscribe)).subscribe(function () {
390
- _this.changeDetector.markForCheck();
391
- });
392
- };
393
- SkyDropdownComponent.prototype.ngOnDestroy = function () {
394
- this.destroyAffixer();
395
- this.destroyOverlay();
396
- clearTimeout(this._positionTimeout);
397
- this.ngUnsubscribe.next();
398
- this.ngUnsubscribe.complete();
399
- this.ngUnsubscribe = undefined;
400
- };
401
- SkyDropdownComponent.prototype.addEventListeners = function () {
402
- var _this = this;
403
- var buttonElement = this.triggerButton.nativeElement;
404
- rxjs.fromEvent(buttonElement, 'click')
405
- .pipe(operators.takeUntil(this.ngUnsubscribe))
406
- .subscribe(function () {
407
- if (_this.isOpen) {
408
- _this.sendMessage(exports.SkyDropdownMessageType.Close);
409
- }
410
- else {
411
- _this.sendMessage(exports.SkyDropdownMessageType.Open);
412
- // Wait for dropdown to open, then set focus on first item.
413
- setTimeout(function () {
414
- _this.sendMessage(exports.SkyDropdownMessageType.FocusFirstItem);
415
- });
416
- }
417
- });
418
- rxjs.fromEvent(buttonElement, 'keydown')
419
- .pipe(operators.takeUntil(this.ngUnsubscribe))
420
- .subscribe(function (event) {
421
- var key = event.key.toLowerCase();
422
- /* tslint:disable-next-line:switch-default */
423
- switch (key) {
424
- case 'escape':
425
- /*istanbul ignore else*/
426
- if (_this.isOpen) {
427
- _this.sendMessage(exports.SkyDropdownMessageType.Close);
428
- _this.sendMessage(exports.SkyDropdownMessageType.FocusTriggerButton);
429
- event.stopPropagation();
430
- }
431
- break;
432
- case 'tab':
433
- if (_this.isOpen && _this.dismissOnBlur) {
434
- _this.sendMessage(exports.SkyDropdownMessageType.Close);
435
- }
436
- break;
437
- case 'arrowup':
438
- case 'up':
439
- if (!_this.isOpen) {
440
- _this.sendMessage(exports.SkyDropdownMessageType.Open);
441
- _this.sendMessage(exports.SkyDropdownMessageType.FocusLastItem);
442
- event.preventDefault();
443
- event.stopPropagation();
444
- }
445
- break;
446
- case 'enter':
447
- case 'arrowdown':
448
- case 'down':
449
- case ' ': // Spacebar.
450
- /*istanbul ignore else*/
451
- if (!_this.isOpen) {
452
- _this.sendMessage(exports.SkyDropdownMessageType.Open);
453
- _this.sendMessage(exports.SkyDropdownMessageType.FocusFirstItem);
454
- event.preventDefault();
455
- event.stopPropagation();
456
- }
457
- break;
458
- }
459
- });
460
- rxjs.fromEvent(buttonElement, 'mouseenter')
461
- .pipe(operators.takeUntil(this.ngUnsubscribe))
462
- .subscribe(function () {
463
- _this.isMouseEnter = true;
464
- if (_this.trigger === 'hover') {
465
- _this.sendMessage(exports.SkyDropdownMessageType.Open);
466
- }
467
- });
468
- rxjs.fromEvent(buttonElement, 'mouseleave')
469
- .pipe(operators.takeUntil(this.ngUnsubscribe))
470
- .subscribe(function () {
471
- _this.isMouseEnter = false;
472
- if (_this.trigger === 'hover') {
473
- // Allow the dropdown menu to set isMouseEnter before checking if the close action
474
- // should be taken.
475
- setTimeout(function () {
476
- if (!_this.isMouseEnter) {
477
- _this.sendMessage(exports.SkyDropdownMessageType.Close);
478
- }
479
- });
480
- }
481
- });
482
- };
483
- SkyDropdownComponent.prototype.createOverlay = function () {
484
- var _this = this;
485
- if (this.overlay) {
486
- return;
487
- }
488
- var overlay = this.overlayService.create({
489
- enableScroll: true,
490
- enablePointerEvents: true,
491
- });
492
- overlay.attachTemplate(this.menuContainerTemplateRef);
493
- overlay.backdropClick.pipe(operators.takeUntil(this.ngUnsubscribe)).subscribe(function () {
494
- if (_this.dismissOnBlur) {
495
- _this.sendMessage(exports.SkyDropdownMessageType.Close);
496
- }
497
- });
498
- this.overlay = overlay;
499
- };
500
- SkyDropdownComponent.prototype.destroyAffixer = function () {
501
- /*istanbul ignore else*/
502
- if (this.affixer) {
503
- this.affixer.destroy();
504
- this.affixer = undefined;
505
- }
506
- };
507
- SkyDropdownComponent.prototype.destroyOverlay = function () {
508
- /*istanbul ignore else*/
509
- if (this.overlay) {
510
- this.overlayService.close(this.overlay);
511
- this.overlay = undefined;
512
- }
513
- };
514
- SkyDropdownComponent.prototype.createAffixer = function () {
515
- var _this = this;
516
- var affixer = this.affixService.createAffixer(this.menuContainerElementRef);
517
- affixer.placementChange
518
- .pipe(operators.takeUntil(this.ngUnsubscribe))
519
- .subscribe(function (change) {
520
- _this.isVisible = change.placement !== null;
521
- _this.changeDetector.markForCheck();
522
- });
523
- this.affixer = affixer;
524
- };
525
- SkyDropdownComponent.prototype.handleIncomingMessages = function (message) {
526
- if (!this.disabled) {
527
- /* tslint:disable-next-line:switch-default */
528
- switch (message.type) {
529
- case exports.SkyDropdownMessageType.Open:
530
- this.isOpen = true;
531
- this.positionDropdownMenu();
532
- break;
533
- case exports.SkyDropdownMessageType.Close:
534
- this.isOpen = false;
535
- this.destroyOverlay();
536
- break;
537
- case exports.SkyDropdownMessageType.Reposition:
538
- // Only reposition the dropdown if it is already open.
539
- /* istanbul ignore else */
540
- if (this.isOpen && this.affixer) {
541
- this.affixer.reaffix();
542
- }
543
- break;
544
- case exports.SkyDropdownMessageType.FocusTriggerButton:
545
- this.triggerButton.nativeElement.focus();
546
- break;
547
- }
548
- }
549
- };
550
- SkyDropdownComponent.prototype.sendMessage = function (type) {
551
- this.messageStream.next({ type: type });
552
- };
553
- SkyDropdownComponent.prototype.positionDropdownMenu = function () {
554
- var _this = this;
555
- this.isVisible = false;
556
- this.createOverlay();
557
- this.changeDetector.markForCheck();
558
- // Explicitly declare the `setTimeout` from the `window` object in order to use the DOM typings
559
- // during a unit test (instead of confusing this with Node's `setTimeout`).
560
- this._positionTimeout = window.setTimeout(function () {
561
- _this.affixer.affixTo(_this.triggerButton.nativeElement, {
562
- autoFitContext: i1.SkyAffixAutoFitContext.Viewport,
563
- enableAutoFit: true,
564
- horizontalAlignment: parseAffixHorizontalAlignment$1(_this.horizontalAlignment),
565
- isSticky: true,
566
- placement: 'below',
567
- });
568
- _this.isVisible = true;
569
- _this.changeDetector.markForCheck();
570
- });
571
- };
572
- return SkyDropdownComponent;
573
- }());
574
- SkyDropdownComponent.ɵfac = i0__namespace.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.16", ngImport: i0__namespace, type: SkyDropdownComponent, deps: [{ token: i0__namespace.ChangeDetectorRef }, { token: i1__namespace.SkyAffixService }, { token: i1__namespace.SkyOverlayService }, { token: i2__namespace.SkyThemeService, optional: true }], target: i0__namespace.ɵɵFactoryTarget.Component });
575
- SkyDropdownComponent.ɵcmp = i0__namespace.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.16", 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: i0.ElementRef }, { propertyName: "menuContainerTemplateRef", first: true, predicate: ["menuContainerTemplateRef"], descendants: true, read: i0.TemplateRef, static: true }, { propertyName: "triggerButton", first: true, predicate: ["triggerButton"], descendants: true, read: i0.ElementRef, static: true }], ngImport: i0__namespace, 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{color:#fff}.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__namespace.λ4, selector: "sky-icon", inputs: ["icon", "iconType", "size", "fixedWidth", "variant"] }], directives: [{ type: i4__namespace.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: i4__namespace.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { type: i4__namespace.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { type: i2__namespace.λ3, selector: "[skyThemeIf]", inputs: ["skyThemeIf"] }, { type: i4__namespace.NgSwitchDefault, selector: "[ngSwitchDefault]" }, { type: i4__namespace.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }], pipes: { "skyLibResources": i5__namespace.SkyLibResourcesPipe }, changeDetection: i0__namespace.ChangeDetectionStrategy.OnPush });
576
- i0__namespace.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.16", ngImport: i0__namespace, type: SkyDropdownComponent, decorators: [{
577
- type: i0.Component,
578
- args: [{
579
- selector: 'sky-dropdown',
580
- 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",
581
- 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{color:#fff}.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"],
582
- changeDetection: i0.ChangeDetectionStrategy.OnPush,
583
- }]
584
- }], ctorParameters: function () {
585
- return [{ type: i0__namespace.ChangeDetectorRef }, { type: i1__namespace.SkyAffixService }, { type: i1__namespace.SkyOverlayService }, { type: i2__namespace.SkyThemeService, decorators: [{
586
- type: i0.Optional
587
- }] }];
588
- }, propDecorators: { buttonStyle: [{
589
- type: i0.Input
590
- }], buttonType: [{
591
- type: i0.Input
592
- }], disabled: [{
593
- type: i0.Input
594
- }], dismissOnBlur: [{
595
- type: i0.Input
596
- }], label: [{
597
- type: i0.Input
598
- }], horizontalAlignment: [{
599
- type: i0.Input
600
- }], messageStream: [{
601
- type: i0.Input
602
- }], title: [{
603
- type: i0.Input
604
- }], trigger: [{
605
- type: i0.Input
606
- }], menuContainerElementRef: [{
607
- type: i0.ViewChild,
608
- args: ['menuContainerElementRef', {
609
- read: i0.ElementRef,
610
- }]
611
- }], menuContainerTemplateRef: [{
612
- type: i0.ViewChild,
613
- args: ['menuContainerTemplateRef', {
614
- read: i0.TemplateRef,
615
- static: true,
616
- }]
617
- }], triggerButton: [{
618
- type: i0.ViewChild,
619
- args: ['triggerButton', {
620
- read: i0.ElementRef,
621
- static: true,
622
- }]
623
- }] } });
624
-
625
- var nextId = 0;
626
- /**
627
- * Creates a menu that contains dropdown menu items.
628
- *
629
- */
630
- var SkyDropdownMenuComponent = /** @class */ (function () {
631
- function SkyDropdownMenuComponent(changeDetector, elementRef, dropdownComponent) {
632
- this.changeDetector = changeDetector;
633
- this.elementRef = elementRef;
634
- this.dropdownComponent = dropdownComponent;
635
- /**
636
- * Fires when the dropdown menu's active index or selected item changes. This event provides an
637
- * observable to emit changes, and the response is of
638
- * the SkyDropdownMenuChange type.
639
- */
640
- this.menuChanges = new i0.EventEmitter();
641
- this.dropdownMenuId = "sky-dropdown-menu-" + ++nextId;
642
- this.ngUnsubscribe = new rxjs.Subject();
643
- this._menuIndex = 0;
644
- }
645
- Object.defineProperty(SkyDropdownMenuComponent.prototype, "ariaRole", {
646
- get: function () {
647
- return this._ariaRole || 'menu';
648
- },
649
- /**
650
- * Specifies an ARIA role for the dropdown menu
651
- * [to support accessibility](https://developer.blackbaud.com/skyux/learn/accessibility)
652
- * by indicating how the dropdown menu functions and what it controls. The dropdown button
653
- * inherits this value to set its `aria-haspopup` property. For information
654
- * about how an ARIA role indicates what an item represents on a web page, see the
655
- * [WAI-ARIA roles model](https://www.w3.org/WAI/PF/aria/roles).
656
- * @default "menu"
657
- */
658
- set: function (value) {
659
- this._ariaRole = value;
660
- },
661
- enumerable: false,
662
- configurable: true
663
- });
664
- Object.defineProperty(SkyDropdownMenuComponent.prototype, "useNativeFocus", {
665
- get: function () {
666
- if (this._useNativeFocus === undefined) {
667
- return true;
668
- }
669
- return this._useNativeFocus;
670
- },
671
- /**
672
- * Indicates whether to use the browser's native focus function when users navigate through menu
673
- * items with the keyboard. To disable the native focus function, set this property to `false`.
674
- * For example, to let users interact with the dropdown menu but keep the keyboard focus on a
675
- * different element, set this property to `false`.
676
- * @default true
677
- */
678
- set: function (value) {
679
- this._useNativeFocus = value;
680
- },
681
- enumerable: false,
682
- configurable: true
683
- });
684
- Object.defineProperty(SkyDropdownMenuComponent.prototype, "hasFocusableItems", {
685
- get: function () {
686
- var found = this.menuItems.find(function (item) { return item.isFocusable(); });
687
- return found !== undefined;
688
- },
689
- enumerable: false,
690
- configurable: true
691
- });
692
- Object.defineProperty(SkyDropdownMenuComponent.prototype, "menuIndex", {
693
- get: function () {
694
- return this._menuIndex;
695
- },
696
- set: function (value) {
697
- if (value < 0) {
698
- value = this.menuItems.length - 1;
699
- }
700
- if (value >= this.menuItems.length) {
701
- value = 0;
702
- }
703
- this._menuIndex = value;
704
- },
705
- enumerable: false,
706
- configurable: true
707
- });
708
- SkyDropdownMenuComponent.prototype.ngAfterContentInit = function () {
709
- var _this = this;
710
- /* istanbul ignore else */
711
- if (this.dropdownComponent) {
712
- this.dropdownComponent.menuId = this.dropdownMenuId;
713
- this.dropdownComponent.menuAriaRole = this.ariaRole;
714
- this.dropdownComponent.messageStream
715
- .pipe(operators.takeUntil(this.ngUnsubscribe))
716
- .subscribe(function (message) {
717
- /* tslint:disable-next-line:switch-default */
718
- switch (message.type) {
719
- case exports.SkyDropdownMessageType.Open:
720
- case exports.SkyDropdownMessageType.Close:
721
- _this.reset();
722
- break;
723
- case exports.SkyDropdownMessageType.FocusFirstItem:
724
- _this.focusFirstItem();
725
- break;
726
- case exports.SkyDropdownMessageType.FocusNextItem:
727
- _this.focusNextItem();
728
- break;
729
- case exports.SkyDropdownMessageType.FocusPreviousItem:
730
- _this.focusPreviousItem();
731
- break;
732
- case exports.SkyDropdownMessageType.FocusLastItem:
733
- _this.focusLastItem();
734
- break;
735
- }
736
- });
737
- this.menuChanges
738
- .pipe(operators.takeUntil(this.ngUnsubscribe))
739
- .subscribe(function (change) {
740
- // Close the dropdown when a menu item is selected.
741
- if (change.selectedItem) {
742
- _this.sendMessage(exports.SkyDropdownMessageType.Close);
743
- _this.sendMessage(exports.SkyDropdownMessageType.FocusTriggerButton);
744
- }
745
- if (change.items) {
746
- // Update the popover style and position whenever the number of items changes.
747
- _this.sendMessage(exports.SkyDropdownMessageType.Reposition);
748
- }
749
- });
750
- }
751
- // Reset dropdown whenever the menu items change.
752
- this.menuItems.changes
753
- .pipe(operators.takeUntil(this.ngUnsubscribe))
754
- .subscribe(function (items) {
755
- _this.reset();
756
- _this.menuChanges.emit({
757
- items: items.toArray(),
758
- });
759
- });
760
- this.addEventListeners();
761
- };
762
- SkyDropdownMenuComponent.prototype.ngOnDestroy = function () {
763
- this.ngUnsubscribe.next();
764
- this.ngUnsubscribe.complete();
765
- this.ngUnsubscribe = undefined;
766
- };
767
- SkyDropdownMenuComponent.prototype.focusFirstItem = function () {
768
- if (!this.hasFocusableItems) {
769
- return;
770
- }
771
- this.menuIndex = 0;
772
- var firstItem = this.getItemByIndex(this.menuIndex);
773
- if (firstItem && firstItem.isFocusable()) {
774
- this.focusItem(firstItem);
775
- }
776
- else {
777
- this.focusNextItem();
778
- }
779
- };
780
- SkyDropdownMenuComponent.prototype.focusLastItem = function () {
781
- if (!this.hasFocusableItems) {
782
- return;
783
- }
784
- this.menuIndex = this.menuItems.length - 1;
785
- var lastItem = this.getItemByIndex(this.menuIndex);
786
- if (lastItem && lastItem.isFocusable()) {
787
- this.focusItem(lastItem);
788
- }
789
- else {
790
- this.focusPreviousItem();
791
- }
792
- };
793
- SkyDropdownMenuComponent.prototype.focusPreviousItem = function () {
794
- if (!this.hasFocusableItems) {
795
- return;
796
- }
797
- this.menuIndex--;
798
- var previousItem = this.getItemByIndex(this.menuIndex);
799
- if (previousItem && previousItem.isFocusable()) {
800
- this.focusItem(previousItem);
801
- }
802
- else {
803
- this.focusPreviousItem();
804
- }
805
- };
806
- SkyDropdownMenuComponent.prototype.focusNextItem = function () {
807
- if (!this.hasFocusableItems) {
808
- return;
809
- }
810
- this.menuIndex++;
811
- var nextItem = this.getItemByIndex(this.menuIndex);
812
- if (nextItem && nextItem.isFocusable()) {
813
- this.focusItem(nextItem);
814
- }
815
- else {
816
- this.focusNextItem();
817
- }
818
- };
819
- SkyDropdownMenuComponent.prototype.reset = function () {
820
- this._menuIndex = -1;
821
- this.resetItemsActiveState();
822
- this.changeDetector.markForCheck();
823
- };
824
- SkyDropdownMenuComponent.prototype.resetItemsActiveState = function () {
825
- this.menuItems.forEach(function (item) {
826
- item.resetState();
827
- });
828
- };
829
- SkyDropdownMenuComponent.prototype.focusItem = function (item) {
830
- this.resetItemsActiveState();
831
- item.focusElement(this.useNativeFocus);
832
- this.menuChanges.emit({
833
- activeIndex: this.menuIndex,
834
- });
835
- };
836
- SkyDropdownMenuComponent.prototype.getItemByIndex = function (index) {
837
- return this.menuItems.find(function (item, i) {
838
- return i === index;
839
- });
840
- };
841
- SkyDropdownMenuComponent.prototype.selectItemByEventTarget = function (target) {
842
- var _this = this;
843
- var selectedItem = this.menuItems.find(function (item, i) {
844
- var found = item.elementRef.nativeElement.contains(target);
845
- if (found) {
846
- _this.menuIndex = i;
847
- _this.menuChanges.next({
848
- activeIndex: _this.menuIndex,
849
- });
850
- }
851
- return found;
852
- });
853
- /* istanbul ignore else */
854
- if (selectedItem) {
855
- this.menuChanges.next({
856
- selectedItem: selectedItem,
857
- });
858
- }
859
- };
860
- SkyDropdownMenuComponent.prototype.sendMessage = function (type) {
861
- this.dropdownComponent.messageStream.next({ type: type });
862
- };
863
- SkyDropdownMenuComponent.prototype.addEventListeners = function () {
864
- var _this = this;
865
- var dropdownMenuElement = this.elementRef.nativeElement;
866
- rxjs.fromEvent(dropdownMenuElement, 'click')
867
- .pipe(operators.takeUntil(this.ngUnsubscribe))
868
- .subscribe(function (event) {
869
- _this.selectItemByEventTarget(event.target);
870
- });
871
- rxjs.fromEvent(dropdownMenuElement, 'keydown')
872
- .pipe(operators.takeUntil(this.ngUnsubscribe))
873
- .subscribe(function (event) {
874
- var key = event.key.toLowerCase();
875
- /*tslint:disable-next-line:switch-default*/
876
- switch (key) {
877
- case 'escape':
878
- _this.sendMessage(exports.SkyDropdownMessageType.Close);
879
- _this.sendMessage(exports.SkyDropdownMessageType.FocusTriggerButton);
880
- event.stopPropagation();
881
- event.preventDefault();
882
- break;
883
- case 'arrowdown':
884
- case 'down':
885
- _this.focusNextItem();
886
- event.preventDefault();
887
- break;
888
- case 'arrowup':
889
- case 'up':
890
- _this.focusPreviousItem();
891
- event.preventDefault();
892
- break;
893
- case 'tab':
894
- if (_this.dropdownComponent.dismissOnBlur) {
895
- _this.sendMessage(exports.SkyDropdownMessageType.Close);
896
- }
897
- _this.sendMessage(exports.SkyDropdownMessageType.FocusTriggerButton);
898
- break;
899
- }
900
- });
901
- rxjs.fromEvent(dropdownMenuElement, 'mouseenter')
902
- .pipe(operators.takeUntil(this.ngUnsubscribe))
903
- .subscribe(function () {
904
- _this.dropdownComponent.isMouseEnter = true;
905
- });
906
- rxjs.fromEvent(dropdownMenuElement, 'mouseleave')
907
- .pipe(operators.takeUntil(this.ngUnsubscribe))
908
- .subscribe(function () {
909
- _this.dropdownComponent.isMouseEnter = false;
910
- // Allow the dropdown component to set isMouseEnter before checking if the close action
911
- // should be taken.
912
- setTimeout(function () {
913
- if (_this.dropdownComponent.trigger === 'hover' &&
914
- _this.dropdownComponent.isMouseEnter === false) {
915
- _this.sendMessage(exports.SkyDropdownMessageType.Close);
916
- }
917
- });
918
- });
919
- };
920
- return SkyDropdownMenuComponent;
921
- }());
922
- SkyDropdownMenuComponent.ɵfac = i0__namespace.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.16", ngImport: i0__namespace, type: SkyDropdownMenuComponent, deps: [{ token: i0__namespace.ChangeDetectorRef }, { token: i0__namespace.ElementRef }, { token: SkyDropdownComponent, optional: true }], target: i0__namespace.ɵɵFactoryTarget.Component });
923
- SkyDropdownMenuComponent.ɵcmp = i0__namespace.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.16", 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__namespace, 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__namespace.ChangeDetectionStrategy.OnPush, encapsulation: i0__namespace.ViewEncapsulation.None });
924
- i0__namespace.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.16", ngImport: i0__namespace, type: SkyDropdownMenuComponent, decorators: [{
925
- type: i0.Component,
926
- args: [{
927
- selector: 'sky-dropdown-menu',
928
- 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",
929
- 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"],
930
- changeDetection: i0.ChangeDetectionStrategy.OnPush,
931
- encapsulation: i0.ViewEncapsulation.None,
932
- }]
933
- }], ctorParameters: function () {
934
- return [{ type: i0__namespace.ChangeDetectorRef }, { type: i0__namespace.ElementRef }, { type: SkyDropdownComponent, decorators: [{
935
- type: i0.Optional
936
- }] }];
937
- }, propDecorators: { ariaLabelledBy: [{
938
- type: i0.Input
939
- }], ariaRole: [{
940
- type: i0.Input
941
- }], useNativeFocus: [{
942
- type: i0.Input
943
- }], menuChanges: [{
944
- type: i0.Output
945
- }], menuItems: [{
946
- type: i0.ContentChildren,
947
- args: [SkyDropdownItemComponent, { descendants: true }]
948
- }] } });
221
+ /*! *****************************************************************************
222
+ Copyright (c) Microsoft Corporation.
949
223
 
950
- var SkyDropdownModule = /** @class */ (function () {
951
- function SkyDropdownModule() {
952
- }
953
- return SkyDropdownModule;
954
- }());
955
- SkyDropdownModule.ɵfac = i0__namespace.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.16", ngImport: i0__namespace, type: SkyDropdownModule, deps: [], target: i0__namespace.ɵɵFactoryTarget.NgModule });
956
- SkyDropdownModule.ɵmod = i0__namespace.ɵɵngDeclareNgModule({ minVersion: "12.0.0", version: "12.2.16", ngImport: i0__namespace, type: SkyDropdownModule, declarations: [SkyDropdownButtonComponent,
957
- SkyDropdownComponent,
958
- SkyDropdownItemComponent,
959
- SkyDropdownMenuComponent], imports: [i4.CommonModule,
960
- i1.SkyAffixModule,
961
- i3.SkyIconModule,
962
- i1.SkyOverlayModule,
963
- SkyPopoversResourcesModule,
964
- i2.SkyThemeModule], exports: [SkyDropdownButtonComponent,
965
- SkyDropdownComponent,
966
- SkyDropdownItemComponent,
967
- SkyDropdownMenuComponent] });
968
- SkyDropdownModule.ɵinj = i0__namespace.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "12.2.16", ngImport: i0__namespace, type: SkyDropdownModule, imports: [[
969
- i4.CommonModule,
970
- i1.SkyAffixModule,
971
- i3.SkyIconModule,
972
- i1.SkyOverlayModule,
973
- SkyPopoversResourcesModule,
974
- i2.SkyThemeModule,
975
- ]] });
976
- i0__namespace.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.16", ngImport: i0__namespace, type: SkyDropdownModule, decorators: [{
977
- type: i0.NgModule,
978
- args: [{
979
- declarations: [
980
- SkyDropdownButtonComponent,
981
- SkyDropdownComponent,
982
- SkyDropdownItemComponent,
983
- SkyDropdownMenuComponent,
984
- ],
985
- imports: [
986
- i4.CommonModule,
987
- i1.SkyAffixModule,
988
- i3.SkyIconModule,
989
- i1.SkyOverlayModule,
990
- SkyPopoversResourcesModule,
991
- i2.SkyThemeModule,
992
- ],
993
- exports: [
994
- SkyDropdownButtonComponent,
995
- SkyDropdownComponent,
996
- SkyDropdownItemComponent,
997
- SkyDropdownMenuComponent,
998
- ],
999
- }]
1000
- }] });
224
+ Permission to use, copy, modify, and/or distribute this software for any
225
+ purpose with or without fee is hereby granted.
1001
226
 
1002
- /**
1003
- * @internal
1004
- */
1005
- var SkyPopoverAdapterService = /** @class */ (function () {
1006
- function SkyPopoverAdapterService() {
1007
- }
1008
- SkyPopoverAdapterService.prototype.getArrowCoordinates = function (elements, placement, themeName) {
1009
- var callerRect = elements.caller.nativeElement.getBoundingClientRect();
1010
- var popoverRect = elements.popover.nativeElement.getBoundingClientRect();
1011
- var arrowRect = elements.popoverArrow.nativeElement.getBoundingClientRect();
1012
- var pixelTolerance = 20;
1013
- var top;
1014
- var left;
1015
- if (placement === 'above' || placement === 'below') {
1016
- left = callerRect.left + callerRect.width * 0.5;
1017
- // Make sure the arrow never detaches from the popover.
1018
- if (left - pixelTolerance < popoverRect.left) {
1019
- left = popoverRect.left + pixelTolerance;
1020
- }
1021
- else if (left + pixelTolerance > popoverRect.right) {
1022
- left = popoverRect.right - pixelTolerance;
1023
- }
1024
- if (placement === 'above') {
1025
- if (themeName !== 'modern') {
1026
- top = callerRect.top - arrowRect.height;
1027
- }
1028
- else {
1029
- top = callerRect.top - arrowRect.height + 5;
1030
- }
1031
- }
1032
- else {
1033
- if (themeName !== 'modern') {
1034
- top = callerRect.bottom;
1035
- }
1036
- else {
1037
- top = callerRect.bottom + 4;
227
+ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
228
+ REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
229
+ AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
230
+ INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
231
+ LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
232
+ OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
233
+ PERFORMANCE OF THIS SOFTWARE.
234
+ ***************************************************************************** */
235
+ /* global Reflect, Promise */
236
+ var extendStatics = function (d, b) {
237
+ extendStatics = Object.setPrototypeOf ||
238
+ ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
239
+ function (d, b) { for (var p in b)
240
+ if (Object.prototype.hasOwnProperty.call(b, p))
241
+ d[p] = b[p]; };
242
+ return extendStatics(d, b);
243
+ };
244
+ function __extends(d, b) {
245
+ if (typeof b !== "function" && b !== null)
246
+ throw new TypeError("Class extends value " + String(b) + " is not a constructor or null");
247
+ extendStatics(d, b);
248
+ function __() { this.constructor = d; }
249
+ d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
250
+ }
251
+ var __assign = function () {
252
+ __assign = Object.assign || function __assign(t) {
253
+ for (var s, i = 1, n = arguments.length; i < n; i++) {
254
+ s = arguments[i];
255
+ for (var p in s)
256
+ if (Object.prototype.hasOwnProperty.call(s, p))
257
+ t[p] = s[p];
258
+ }
259
+ return t;
260
+ };
261
+ return __assign.apply(this, arguments);
262
+ };
263
+ function __rest(s, e) {
264
+ var t = {};
265
+ for (var p in s)
266
+ if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
267
+ t[p] = s[p];
268
+ if (s != null && typeof Object.getOwnPropertySymbols === "function")
269
+ for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
270
+ if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
271
+ t[p[i]] = s[p[i]];
272
+ }
273
+ return t;
274
+ }
275
+ function __decorate(decorators, target, key, desc) {
276
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
277
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function")
278
+ r = Reflect.decorate(decorators, target, key, desc);
279
+ else
280
+ for (var i = decorators.length - 1; i >= 0; i--)
281
+ if (d = decorators[i])
282
+ r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
283
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
284
+ }
285
+ function __param(paramIndex, decorator) {
286
+ return function (target, key) { decorator(target, key, paramIndex); };
287
+ }
288
+ function __metadata(metadataKey, metadataValue) {
289
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function")
290
+ return Reflect.metadata(metadataKey, metadataValue);
291
+ }
292
+ function __awaiter(thisArg, _arguments, P, generator) {
293
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
294
+ return new (P || (P = Promise))(function (resolve, reject) {
295
+ function fulfilled(value) { try {
296
+ step(generator.next(value));
297
+ }
298
+ catch (e) {
299
+ reject(e);
300
+ } }
301
+ function rejected(value) { try {
302
+ step(generator["throw"](value));
303
+ }
304
+ catch (e) {
305
+ reject(e);
306
+ } }
307
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
308
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
309
+ });
310
+ }
311
+ function __generator(thisArg, body) {
312
+ var _ = { label: 0, sent: function () { if (t[0] & 1)
313
+ throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
314
+ return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function () { return this; }), g;
315
+ function verb(n) { return function (v) { return step([n, v]); }; }
316
+ function step(op) {
317
+ if (f)
318
+ throw new TypeError("Generator is already executing.");
319
+ while (_)
320
+ try {
321
+ if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done)
322
+ return t;
323
+ if (y = 0, t)
324
+ op = [op[0] & 2, t.value];
325
+ switch (op[0]) {
326
+ case 0:
327
+ case 1:
328
+ t = op;
329
+ break;
330
+ case 4:
331
+ _.label++;
332
+ return { value: op[1], done: false };
333
+ case 5:
334
+ _.label++;
335
+ y = op[1];
336
+ op = [0];
337
+ continue;
338
+ case 7:
339
+ op = _.ops.pop();
340
+ _.trys.pop();
341
+ continue;
342
+ default:
343
+ if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) {
344
+ _ = 0;
345
+ continue;
346
+ }
347
+ if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) {
348
+ _.label = op[1];
349
+ break;
350
+ }
351
+ if (op[0] === 6 && _.label < t[1]) {
352
+ _.label = t[1];
353
+ t = op;
354
+ break;
355
+ }
356
+ if (t && _.label < t[2]) {
357
+ _.label = t[2];
358
+ _.ops.push(op);
359
+ break;
360
+ }
361
+ if (t[2])
362
+ _.ops.pop();
363
+ _.trys.pop();
364
+ continue;
1038
365
  }
366
+ op = body.call(thisArg, _);
1039
367
  }
1040
- }
1041
- else {
1042
- top = callerRect.top + callerRect.height * 0.5;
1043
- // Make sure the arrow never detaches from the popover.
1044
- if (top - pixelTolerance < popoverRect.top) {
1045
- top = popoverRect.top + pixelTolerance;
368
+ catch (e) {
369
+ op = [6, e];
370
+ y = 0;
1046
371
  }
1047
- else if (top + pixelTolerance > popoverRect.bottom) {
1048
- top = popoverRect.bottom - pixelTolerance;
372
+ finally {
373
+ f = t = 0;
1049
374
  }
1050
- if (placement === 'left') {
1051
- if (themeName !== 'modern') {
1052
- left = callerRect.left - arrowRect.width;
1053
- }
1054
- else {
1055
- left = callerRect.left - arrowRect.width + 5;
1056
- }
375
+ if (op[0] & 5)
376
+ throw op[1];
377
+ return { value: op[0] ? op[1] : void 0, done: true };
378
+ }
379
+ }
380
+ var __createBinding = Object.create ? (function (o, m, k, k2) {
381
+ if (k2 === undefined)
382
+ k2 = k;
383
+ Object.defineProperty(o, k2, { enumerable: true, get: function () { return m[k]; } });
384
+ }) : (function (o, m, k, k2) {
385
+ if (k2 === undefined)
386
+ k2 = k;
387
+ o[k2] = m[k];
388
+ });
389
+ function __exportStar(m, o) {
390
+ for (var p in m)
391
+ if (p !== "default" && !Object.prototype.hasOwnProperty.call(o, p))
392
+ __createBinding(o, m, p);
393
+ }
394
+ function __values(o) {
395
+ var s = typeof Symbol === "function" && Symbol.iterator, m = s && o[s], i = 0;
396
+ if (m)
397
+ return m.call(o);
398
+ if (o && typeof o.length === "number")
399
+ return {
400
+ next: function () {
401
+ if (o && i >= o.length)
402
+ o = void 0;
403
+ return { value: o && o[i++], done: !o };
1057
404
  }
1058
- else {
1059
- if (themeName !== 'modern') {
1060
- left = callerRect.right;
1061
- }
1062
- else {
1063
- left = callerRect.right + 4;
1064
- }
405
+ };
406
+ throw new TypeError(s ? "Object is not iterable." : "Symbol.iterator is not defined.");
407
+ }
408
+ function __read(o, n) {
409
+ var m = typeof Symbol === "function" && o[Symbol.iterator];
410
+ if (!m)
411
+ return o;
412
+ var i = m.call(o), r, ar = [], e;
413
+ try {
414
+ while ((n === void 0 || n-- > 0) && !(r = i.next()).done)
415
+ ar.push(r.value);
416
+ }
417
+ catch (error) {
418
+ e = { error: error };
419
+ }
420
+ finally {
421
+ try {
422
+ if (r && !r.done && (m = i["return"]))
423
+ m.call(i);
424
+ }
425
+ finally {
426
+ if (e)
427
+ throw e.error;
428
+ }
429
+ }
430
+ return ar;
431
+ }
432
+ /** @deprecated */
433
+ function __spread() {
434
+ for (var ar = [], i = 0; i < arguments.length; i++)
435
+ ar = ar.concat(__read(arguments[i]));
436
+ return ar;
437
+ }
438
+ /** @deprecated */
439
+ function __spreadArrays() {
440
+ for (var s = 0, i = 0, il = arguments.length; i < il; i++)
441
+ s += arguments[i].length;
442
+ for (var r = Array(s), k = 0, i = 0; i < il; i++)
443
+ for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)
444
+ r[k] = a[j];
445
+ return r;
446
+ }
447
+ function __spreadArray(to, from, pack) {
448
+ if (pack || arguments.length === 2)
449
+ for (var i = 0, l = from.length, ar; i < l; i++) {
450
+ if (ar || !(i in from)) {
451
+ if (!ar)
452
+ ar = Array.prototype.slice.call(from, 0, i);
453
+ ar[i] = from[i];
1065
454
  }
1066
455
  }
1067
- return { top: top, left: left };
1068
- };
1069
- return SkyPopoverAdapterService;
1070
- }());
1071
- SkyPopoverAdapterService.ɵfac = i0__namespace.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.16", ngImport: i0__namespace, type: SkyPopoverAdapterService, deps: [], target: i0__namespace.ɵɵFactoryTarget.Injectable });
1072
- SkyPopoverAdapterService.ɵprov = i0__namespace.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "12.2.16", ngImport: i0__namespace, type: SkyPopoverAdapterService });
1073
- i0__namespace.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.16", ngImport: i0__namespace, type: SkyPopoverAdapterService, decorators: [{
1074
- type: i0.Injectable
1075
- }] });
1076
-
1077
- /**
1078
- * @internal
1079
- */
1080
- var skyPopoverAnimation = animations.trigger('skyPopoverAnimation', [
1081
- animations.state('void', animations.style({
1082
- opacity: 0,
1083
- })),
1084
- animations.state('open', animations.style({
1085
- opacity: 1,
1086
- })),
1087
- animations.state('closed', animations.style({
1088
- opacity: 0,
1089
- })),
1090
- animations.transition('void => *', [animations.animate('250ms')]),
1091
- animations.transition('open => closed', [animations.animate('150ms')]),
1092
- animations.transition('closed => open', [animations.animate('150ms')]),
1093
- ]);
1094
-
1095
- function parseAffixPlacement(placement) {
1096
- switch (placement) {
1097
- case 'above':
1098
- return 'above';
1099
- case 'below':
1100
- return 'below';
1101
- case 'right':
1102
- return 'right';
1103
- case 'left':
1104
- return 'left';
1105
- /* istanbul ignore next */
1106
- default:
1107
- throw "SkyAffixPlacement does not have a matching value for '" + placement + "'!";
456
+ return to.concat(ar || Array.prototype.slice.call(from));
457
+ }
458
+ function __await(v) {
459
+ return this instanceof __await ? (this.v = v, this) : new __await(v);
460
+ }
461
+ function __asyncGenerator(thisArg, _arguments, generator) {
462
+ if (!Symbol.asyncIterator)
463
+ throw new TypeError("Symbol.asyncIterator is not defined.");
464
+ var g = generator.apply(thisArg, _arguments || []), i, q = [];
465
+ return i = {}, verb("next"), verb("throw"), verb("return"), i[Symbol.asyncIterator] = function () { return this; }, i;
466
+ function verb(n) { if (g[n])
467
+ i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }
468
+ function resume(n, v) { try {
469
+ step(g[n](v));
1108
470
  }
471
+ catch (e) {
472
+ settle(q[0][3], e);
473
+ } }
474
+ function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }
475
+ function fulfill(value) { resume("next", value); }
476
+ function reject(value) { resume("throw", value); }
477
+ function settle(f, v) { if (f(v), q.shift(), q.length)
478
+ resume(q[0][0], q[0][1]); }
1109
479
  }
1110
- function parseAffixHorizontalAlignment(alignment) {
480
+ function __asyncDelegator(o) {
481
+ var i, p;
482
+ return i = {}, verb("next"), verb("throw", function (e) { throw e; }), verb("return"), i[Symbol.iterator] = function () { return this; }, i;
483
+ function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: n === "return" } : f ? f(v) : v; } : f; }
484
+ }
485
+ function __asyncValues(o) {
486
+ if (!Symbol.asyncIterator)
487
+ throw new TypeError("Symbol.asyncIterator is not defined.");
488
+ var m = o[Symbol.asyncIterator], i;
489
+ return m ? m.call(o) : (o = typeof __values === "function" ? __values(o) : o[Symbol.iterator](), i = {}, verb("next"), verb("throw"), verb("return"), i[Symbol.asyncIterator] = function () { return this; }, i);
490
+ function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }
491
+ function settle(resolve, reject, d, v) { Promise.resolve(v).then(function (v) { resolve({ value: v, done: d }); }, reject); }
492
+ }
493
+ function __makeTemplateObject(cooked, raw) {
494
+ if (Object.defineProperty) {
495
+ Object.defineProperty(cooked, "raw", { value: raw });
496
+ }
497
+ else {
498
+ cooked.raw = raw;
499
+ }
500
+ return cooked;
501
+ }
502
+ ;
503
+ var __setModuleDefault = Object.create ? (function (o, v) {
504
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
505
+ }) : function (o, v) {
506
+ o["default"] = v;
507
+ };
508
+ function __importStar(mod) {
509
+ if (mod && mod.__esModule)
510
+ return mod;
511
+ var result = {};
512
+ if (mod != null)
513
+ for (var k in mod)
514
+ if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k))
515
+ __createBinding(result, mod, k);
516
+ __setModuleDefault(result, mod);
517
+ return result;
518
+ }
519
+ function __importDefault(mod) {
520
+ return (mod && mod.__esModule) ? mod : { default: mod };
521
+ }
522
+ function __classPrivateFieldGet(receiver, state, kind, f) {
523
+ if (kind === "a" && !f)
524
+ throw new TypeError("Private accessor was defined without a getter");
525
+ if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver))
526
+ throw new TypeError("Cannot read private member from an object whose class did not declare it");
527
+ return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
528
+ }
529
+ function __classPrivateFieldSet(receiver, state, value, kind, f) {
530
+ if (kind === "m")
531
+ throw new TypeError("Private method is not writable");
532
+ if (kind === "a" && !f)
533
+ throw new TypeError("Private accessor was defined without a setter");
534
+ if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver))
535
+ throw new TypeError("Cannot write private member to an object whose class did not declare it");
536
+ return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;
537
+ }
538
+
539
+ function parseAffixHorizontalAlignment$1(alignment) {
1111
540
  switch (alignment) {
1112
541
  case 'center':
1113
542
  return 'center';
@@ -1121,813 +550,1380 @@
1121
550
  }
1122
551
  }
1123
552
 
553
+ var _SkyDropdownComponent_positionTimeout;
1124
554
  /**
1125
- * @dynamic
1126
- * @internal
1127
- */
1128
- var SkyPopoverContext = /** @class */ (function () {
1129
- function SkyPopoverContext(args) {
1130
- this.contentTemplateRef = args.contentTemplateRef;
1131
- }
1132
- return SkyPopoverContext;
1133
- }());
1134
-
1135
- /**
1136
- * @internal
555
+ * Creates a dropdown menu that displays menu items that users may select.
1137
556
  */
1138
- var SkyPopoverContentComponent = /** @class */ (function () {
1139
- function SkyPopoverContentComponent(changeDetector, elementRef, affixService, coreAdapterService, adapterService, context, themeSvc) {
557
+ var SkyDropdownComponent = /** @class */ (function () {
558
+ function SkyDropdownComponent(changeDetector, affixService, overlayService, themeSvc) {
1140
559
  this.changeDetector = changeDetector;
1141
- this.elementRef = elementRef;
1142
560
  this.affixService = affixService;
1143
- this.coreAdapterService = coreAdapterService;
1144
- this.adapterService = adapterService;
1145
- this.context = context;
1146
- this.themeSvc = themeSvc;
1147
- this.dismissOnBlur = true;
1148
- this.enableAnimations = true;
1149
- this.isOpen = false;
1150
- this.popoverType = 'info';
561
+ this.overlayService = overlayService;
562
+ this.themeSvc = themeSvc;
563
+ /**
564
+ * Provides an observable to send commands to the dropdown. The commands should respect
565
+ * the [[SkyDropdownMessage]] type.
566
+ */
567
+ this.messageStream = new rxjs.Subject();
568
+ this.isMouseEnter = false;
569
+ this.isVisible = false;
1151
570
  this.ngUnsubscribe = new rxjs.Subject();
1152
- this._closed = new rxjs.Subject();
1153
- this._isMouseEnter = new rxjs.Subject();
1154
- this._opened = new rxjs.Subject();
571
+ this._isOpen = false;
572
+ _SkyDropdownComponent_positionTimeout.set(this, void 0);
1155
573
  }
1156
- Object.defineProperty(SkyPopoverContentComponent.prototype, "animationState", {
574
+ Object.defineProperty(SkyDropdownComponent.prototype, "buttonStyle", {
1157
575
  get: function () {
1158
- return this.isOpen ? 'open' : 'closed';
576
+ return this._buttonStyle || 'default';
577
+ },
578
+ /**
579
+ * Specifies a background color for the dropdown button. Available values are `default` and
580
+ * `primary`. These values set the background color from the
581
+ * [secondary and primary button classes](https://developer.blackbaud.com/skyux/components/button) respectively.
582
+ * @default "default"
583
+ */
584
+ set: function (value) {
585
+ this._buttonStyle = value;
1159
586
  },
1160
587
  enumerable: false,
1161
588
  configurable: true
1162
589
  });
1163
- Object.defineProperty(SkyPopoverContentComponent.prototype, "closed", {
590
+ Object.defineProperty(SkyDropdownComponent.prototype, "buttonType", {
1164
591
  get: function () {
1165
- return this._closed.asObservable();
592
+ return this._buttonType || 'select';
593
+ },
594
+ /**
595
+ * Specifies the type of button to render as the dropdown's trigger element. To display a button
596
+ * with text and a caret, specify `select` and then enter the button text in a
597
+ * `sky-dropdown-button` element. To display a round button with an ellipsis, specify
598
+ * `context-menu`. And to display a button with a [Font Awesome icon](http://fontawesome.io/icons/), specify the icon's class name.
599
+ * For example, to display the `fa-filter` icon, specify `filter`.
600
+ * @default "select"
601
+ */
602
+ set: function (value) {
603
+ this._buttonType = value;
1166
604
  },
1167
605
  enumerable: false,
1168
606
  configurable: true
1169
607
  });
1170
- Object.defineProperty(SkyPopoverContentComponent.prototype, "opened", {
608
+ Object.defineProperty(SkyDropdownComponent.prototype, "disabled", {
1171
609
  get: function () {
1172
- return this._opened.asObservable();
610
+ return this._disabled || false;
611
+ },
612
+ /**
613
+ * Indicates whether to disable the dropdown button.
614
+ * @default false
615
+ */
616
+ set: function (value) {
617
+ this._disabled = value;
1173
618
  },
1174
619
  enumerable: false,
1175
620
  configurable: true
1176
621
  });
1177
- Object.defineProperty(SkyPopoverContentComponent.prototype, "isMouseEnter", {
622
+ Object.defineProperty(SkyDropdownComponent.prototype, "dismissOnBlur", {
1178
623
  get: function () {
1179
- return this._isMouseEnter.asObservable();
624
+ if (this._dismissOnBlur === undefined) {
625
+ return true;
626
+ }
627
+ return this._dismissOnBlur;
628
+ },
629
+ /**
630
+ * Indicates whether to close the dropdown when users click away from the menu.
631
+ * @default true
632
+ */
633
+ set: function (value) {
634
+ this._dismissOnBlur = value;
1180
635
  },
1181
636
  enumerable: false,
1182
637
  configurable: true
1183
638
  });
1184
- SkyPopoverContentComponent.prototype.ngOnInit = function () {
639
+ Object.defineProperty(SkyDropdownComponent.prototype, "horizontalAlignment", {
640
+ get: function () {
641
+ return this._horizontalAlignment || 'left';
642
+ },
643
+ /**
644
+ * Specifies the horizontal alignment of the dropdown menu in relation to the dropdown button.
645
+ * @default "left"
646
+ */
647
+ set: function (value) {
648
+ this._horizontalAlignment = value;
649
+ },
650
+ enumerable: false,
651
+ configurable: true
652
+ });
653
+ Object.defineProperty(SkyDropdownComponent.prototype, "trigger", {
654
+ get: function () {
655
+ return this._trigger || 'click';
656
+ },
657
+ /**
658
+ * Specifies how users interact with the dropdown button to expose the dropdown menu.
659
+ * We recommend the default `click` value because the `hover` value can pose
660
+ * [accessibility](https://developer.blackbaud.com/skyux/learn/accessibility) issues
661
+ * for users on touch devices such as phones and tablets.
662
+ * @deprecated We recommend against using this property. If you choose to use the deprecated
663
+ * `hover` value anyway, we recommend that you not use it in combination with the `title`
664
+ * property. (This property will be removed in the next major version release.)
665
+ * @default "click"
666
+ */
667
+ set: function (value) {
668
+ this._trigger = value;
669
+ },
670
+ enumerable: false,
671
+ configurable: true
672
+ });
673
+ Object.defineProperty(SkyDropdownComponent.prototype, "isOpen", {
674
+ get: function () {
675
+ return this._isOpen || false;
676
+ },
677
+ set: function (value) {
678
+ this._isOpen = value;
679
+ this.changeDetector.markForCheck();
680
+ },
681
+ enumerable: false,
682
+ configurable: true
683
+ });
684
+ Object.defineProperty(SkyDropdownComponent.prototype, "menuContainerElementRef", {
685
+ get: function () {
686
+ return this._menuContainerElementRef;
687
+ },
688
+ set: function (value) {
689
+ if (value) {
690
+ this._menuContainerElementRef = value;
691
+ this.destroyAffixer();
692
+ this.createAffixer(value);
693
+ this.changeDetector.markForCheck();
694
+ }
695
+ },
696
+ enumerable: false,
697
+ configurable: true
698
+ });
699
+ SkyDropdownComponent.prototype.ngOnInit = function () {
1185
700
  var _this = this;
1186
701
  var _a;
1187
- /*istanbul ignore next*/
1188
- this.contentTarget.createEmbeddedView((_a = this.context) === null || _a === void 0 ? void 0 : _a.contentTemplateRef);
1189
702
  this.addEventListeners();
1190
- /*istanbul ignore else*/
1191
- if (this.themeSvc) {
1192
- this.themeSvc.settingsChange
1193
- .pipe(operators.takeUntil(this.ngUnsubscribe))
1194
- .subscribe(function (themeSettings) {
1195
- var _a, _b;
1196
- /*istanbul ignore next*/
1197
- _this.themeName = (_b = (_a = themeSettings.currentSettings) === null || _a === void 0 ? void 0 : _a.theme) === null || _b === void 0 ? void 0 : _b.name;
1198
- });
1199
- }
703
+ this.messageStream
704
+ .pipe(operators.takeUntil(this.ngUnsubscribe))
705
+ .subscribe(function (message) {
706
+ _this.handleIncomingMessages(message);
707
+ });
708
+ // Load proper icons on theme change.
709
+ (_a = this.themeSvc) === null || _a === void 0 ? void 0 : _a.settingsChange.pipe(operators.takeUntil(this.ngUnsubscribe)).subscribe(function () {
710
+ _this.changeDetector.markForCheck();
711
+ });
1200
712
  };
1201
- SkyPopoverContentComponent.prototype.ngOnDestroy = function () {
713
+ SkyDropdownComponent.prototype.ngOnDestroy = function () {
714
+ this.destroyAffixer();
715
+ this.destroyOverlay();
716
+ clearTimeout(__classPrivateFieldGet(this, _SkyDropdownComponent_positionTimeout, "f"));
1202
717
  this.ngUnsubscribe.next();
1203
718
  this.ngUnsubscribe.complete();
1204
- this._closed.complete();
1205
- this._isMouseEnter.complete();
1206
- this._opened.complete();
1207
- /* istanbul ignore else */
1208
- if (this.affixer) {
1209
- this.affixer.destroy();
1210
- }
1211
- this._closed =
1212
- this._isMouseEnter =
1213
- this._opened =
1214
- this.affixer =
1215
- this.ngUnsubscribe =
1216
- undefined;
1217
719
  };
1218
- SkyPopoverContentComponent.prototype.onAnimationEvent = function (event) {
1219
- var _a, _b;
1220
- if (event.fromState === 'void') {
1221
- return;
1222
- }
1223
- if (event.phaseName === 'done') {
1224
- if (event.toState === 'open') {
1225
- /*istanbul ignore next*/
1226
- (_a = this._opened) === null || _a === void 0 ? void 0 : _a.next();
720
+ SkyDropdownComponent.prototype.addEventListeners = function () {
721
+ var _this = this;
722
+ var buttonElement = this.triggerButton.nativeElement;
723
+ rxjs.fromEvent(buttonElement, 'click')
724
+ .pipe(operators.takeUntil(this.ngUnsubscribe))
725
+ .subscribe(function () {
726
+ if (_this.isOpen) {
727
+ _this.sendMessage(exports.SkyDropdownMessageType.Close);
1227
728
  }
1228
729
  else {
1229
- /*istanbul ignore next*/
1230
- (_b = this._closed) === null || _b === void 0 ? void 0 : _b.next();
730
+ _this.sendMessage(exports.SkyDropdownMessageType.Open);
731
+ // Wait for dropdown to open, then set focus on first item.
732
+ setTimeout(function () {
733
+ _this.sendMessage(exports.SkyDropdownMessageType.FocusFirstItem);
734
+ });
1231
735
  }
1232
- }
1233
- };
1234
- SkyPopoverContentComponent.prototype.open = function (caller, config) {
1235
- var _this = this;
1236
- this.caller = caller;
1237
- this.dismissOnBlur = config.dismissOnBlur;
1238
- this.enableAnimations = config.enableAnimations;
1239
- this.horizontalAlignment = config.horizontalAlignment;
1240
- this.placement = config.placement;
1241
- this.popoverTitle = config.popoverTitle;
1242
- if (config.popoverType) {
1243
- this.popoverType = config.popoverType;
1244
- }
1245
- this.changeDetector.markForCheck();
1246
- // Indicates if the popover should be displayed statically.
1247
- // Please note: This feature is internal-only and used by the visual tests to capture multiple
1248
- // states simultaneously without the overhead of event listeners.
1249
- /* istanbul ignore if */
1250
- if (config.isStatic) {
1251
- this.isOpen = true;
1252
- this.changeDetector.markForCheck();
736
+ });
737
+ rxjs.fromEvent(buttonElement, 'keydown')
738
+ .pipe(operators.takeUntil(this.ngUnsubscribe))
739
+ .subscribe(function (event) {
740
+ var key = event.key.toLowerCase();
741
+ /* tslint:disable-next-line:switch-default */
742
+ switch (key) {
743
+ case 'escape':
744
+ /*istanbul ignore else*/
745
+ if (_this.isOpen) {
746
+ _this.sendMessage(exports.SkyDropdownMessageType.Close);
747
+ _this.sendMessage(exports.SkyDropdownMessageType.FocusTriggerButton);
748
+ event.stopPropagation();
749
+ }
750
+ break;
751
+ case 'tab':
752
+ if (_this.isOpen && _this.dismissOnBlur) {
753
+ _this.sendMessage(exports.SkyDropdownMessageType.Close);
754
+ }
755
+ break;
756
+ case 'arrowup':
757
+ case 'up':
758
+ if (!_this.isOpen) {
759
+ _this.sendMessage(exports.SkyDropdownMessageType.Open);
760
+ _this.sendMessage(exports.SkyDropdownMessageType.FocusLastItem);
761
+ event.preventDefault();
762
+ event.stopPropagation();
763
+ }
764
+ break;
765
+ case 'enter':
766
+ case 'arrowdown':
767
+ case 'down':
768
+ case ' ': // Spacebar.
769
+ /*istanbul ignore else*/
770
+ if (!_this.isOpen) {
771
+ _this.sendMessage(exports.SkyDropdownMessageType.Open);
772
+ _this.sendMessage(exports.SkyDropdownMessageType.FocusFirstItem);
773
+ event.preventDefault();
774
+ event.stopPropagation();
775
+ }
776
+ break;
777
+ }
778
+ });
779
+ rxjs.fromEvent(buttonElement, 'mouseenter')
780
+ .pipe(operators.takeUntil(this.ngUnsubscribe))
781
+ .subscribe(function () {
782
+ _this.isMouseEnter = true;
783
+ if (_this.trigger === 'hover') {
784
+ _this.sendMessage(exports.SkyDropdownMessageType.Open);
785
+ }
786
+ });
787
+ rxjs.fromEvent(buttonElement, 'mouseleave')
788
+ .pipe(operators.takeUntil(this.ngUnsubscribe))
789
+ .subscribe(function () {
790
+ _this.isMouseEnter = false;
791
+ if (_this.trigger === 'hover') {
792
+ // Allow the dropdown menu to set isMouseEnter before checking if the close action
793
+ // should be taken.
794
+ setTimeout(function () {
795
+ if (!_this.isMouseEnter) {
796
+ _this.sendMessage(exports.SkyDropdownMessageType.Close);
797
+ }
798
+ });
799
+ }
800
+ });
801
+ };
802
+ SkyDropdownComponent.prototype.createOverlay = function () {
803
+ var _this = this;
804
+ if (this.overlay) {
1253
805
  return;
1254
806
  }
1255
- // Let the styles render before gauging the affix dimensions.
1256
- setTimeout(function () {
1257
- var _a;
1258
- /*istanbul ignore next*/
1259
- if (!((_a = _this.popoverRef) === null || _a === void 0 ? void 0 : _a.nativeElement) ||
1260
- !_this.ngUnsubscribe ||
1261
- _this.ngUnsubscribe.isStopped) {
1262
- return;
1263
- }
1264
- if (!_this.affixer) {
1265
- _this.setupAffixer();
1266
- }
1267
- var affixOptions = {
1268
- autoFitContext: i1.SkyAffixAutoFitContext.Viewport,
1269
- enableAutoFit: true,
1270
- horizontalAlignment: parseAffixHorizontalAlignment(_this.horizontalAlignment),
1271
- isSticky: true,
1272
- placement: parseAffixPlacement(_this.placement),
1273
- };
1274
- // Ensure vertical alignment is set according to the popover's placement value.
1275
- if (affixOptions.placement === 'left' ||
1276
- affixOptions.placement === 'right') {
1277
- affixOptions.verticalAlignment = 'middle';
807
+ var overlay = this.overlayService.create({
808
+ enableScroll: true,
809
+ enablePointerEvents: true,
810
+ });
811
+ overlay.attachTemplate(this.menuContainerTemplateRef);
812
+ overlay.backdropClick.pipe(operators.takeUntil(this.ngUnsubscribe)).subscribe(function () {
813
+ if (_this.dismissOnBlur) {
814
+ _this.sendMessage(exports.SkyDropdownMessageType.Close);
1278
815
  }
1279
- _this.affixer.affixTo(_this.caller.nativeElement, affixOptions);
1280
- _this.updateArrowOffset();
1281
- _this.isOpen = true;
1282
- _this.changeDetector.markForCheck();
1283
816
  });
817
+ this.overlay = overlay;
1284
818
  };
1285
- SkyPopoverContentComponent.prototype.close = function () {
1286
- this.isOpen = false;
1287
- this.changeDetector.markForCheck();
819
+ SkyDropdownComponent.prototype.destroyAffixer = function () {
820
+ /*istanbul ignore else*/
821
+ if (this.affixer) {
822
+ this.affixer.destroy();
823
+ this.affixer = undefined;
824
+ }
1288
825
  };
1289
- SkyPopoverContentComponent.prototype.applyFocus = function () {
1290
- if (this.isOpen) {
1291
- this.coreAdapterService.getFocusableChildrenAndApplyFocus(this.popoverRef, '.sky-popover', true);
826
+ SkyDropdownComponent.prototype.destroyOverlay = function () {
827
+ /*istanbul ignore else*/
828
+ if (this.overlay) {
829
+ this.overlayService.close(this.overlay);
830
+ this.overlay = undefined;
1292
831
  }
1293
832
  };
1294
- SkyPopoverContentComponent.prototype.setupAffixer = function () {
833
+ SkyDropdownComponent.prototype.createAffixer = function (menuContainerElementRef) {
1295
834
  var _this = this;
1296
- var affixer = this.affixService.createAffixer(this.popoverRef);
1297
- affixer.offsetChange.pipe(operators.takeUntil(this.ngUnsubscribe)).subscribe(function () {
1298
- _this.updateArrowOffset();
1299
- _this.changeDetector.markForCheck();
1300
- });
1301
- affixer.overflowScroll.pipe(operators.takeUntil(this.ngUnsubscribe)).subscribe(function () {
1302
- _this.updateArrowOffset();
1303
- _this.changeDetector.markForCheck();
1304
- });
835
+ var affixer = this.affixService.createAffixer(menuContainerElementRef);
1305
836
  affixer.placementChange
1306
837
  .pipe(operators.takeUntil(this.ngUnsubscribe))
1307
838
  .subscribe(function (change) {
1308
- _this.placement = change.placement;
839
+ _this.isVisible = change.placement !== null;
1309
840
  _this.changeDetector.markForCheck();
1310
841
  });
1311
842
  this.affixer = affixer;
1312
843
  };
1313
- SkyPopoverContentComponent.prototype.updateArrowOffset = function () {
1314
- var _c = this.adapterService.getArrowCoordinates({
1315
- caller: this.caller,
1316
- popover: this.popoverRef,
1317
- popoverArrow: this.arrowRef,
1318
- }, this.placement, this.themeName), top = _c.top, left = _c.left;
1319
- this.arrowTop = top;
1320
- this.arrowLeft = left;
1321
- };
1322
- SkyPopoverContentComponent.prototype.isFocusLeavingElement = function (event) {
1323
- var focusableItems = this.coreAdapterService.getFocusableChildren(this.elementRef.nativeElement);
1324
- var isFirstItem = focusableItems[0] === event.target && event.shiftKey;
1325
- var isLastItem = focusableItems[focusableItems.length - 1] === event.target &&
1326
- !event.shiftKey;
1327
- return focusableItems.length === 0 || isFirstItem || isLastItem;
1328
- };
1329
- SkyPopoverContentComponent.prototype.addEventListeners = function () {
1330
- var _this = this;
1331
- var hostElement = this.elementRef.nativeElement;
1332
- rxjs.fromEvent(hostElement, 'mouseenter')
1333
- .pipe(operators.takeUntil(this.ngUnsubscribe))
1334
- .subscribe(function () { return _this._isMouseEnter.next(true); });
1335
- rxjs.fromEvent(hostElement, 'mouseleave')
1336
- .pipe(operators.takeUntil(this.ngUnsubscribe))
1337
- .subscribe(function () { return _this._isMouseEnter.next(false); });
1338
- rxjs.fromEvent(hostElement, 'keydown')
1339
- .pipe(operators.takeUntil(this.ngUnsubscribe))
1340
- .subscribe(function (event) {
1341
- var key = event.key.toLowerCase();
844
+ SkyDropdownComponent.prototype.handleIncomingMessages = function (message) {
845
+ if (!this.disabled) {
1342
846
  /* tslint:disable-next-line:switch-default */
1343
- switch (key) {
1344
- case 'escape':
1345
- _this.close();
1346
- _this.caller.nativeElement.focus();
1347
- event.preventDefault();
1348
- event.stopPropagation();
847
+ switch (message.type) {
848
+ case exports.SkyDropdownMessageType.Open:
849
+ this.isOpen = true;
850
+ this.positionDropdownMenu();
1349
851
  break;
1350
- // Since the popover now lives in an overlay at the bottom of the document body, we need
1351
- // to handle the tab key ourselves. Otherwise, focus would be moved to the browser's
1352
- // search bar.
1353
- case 'tab':
1354
- if (!_this.dismissOnBlur) {
1355
- return;
1356
- }
1357
- /*istanbul ignore else*/
1358
- if (_this.isFocusLeavingElement(event)) {
1359
- _this.close();
1360
- _this.caller.nativeElement.focus();
1361
- event.preventDefault();
1362
- event.stopPropagation();
852
+ case exports.SkyDropdownMessageType.Close:
853
+ this.isOpen = false;
854
+ this.destroyOverlay();
855
+ break;
856
+ case exports.SkyDropdownMessageType.Reposition:
857
+ // Only reposition the dropdown if it is already open.
858
+ /* istanbul ignore else */
859
+ if (this.isOpen && this.affixer) {
860
+ this.affixer.reaffix();
1363
861
  }
1364
862
  break;
863
+ case exports.SkyDropdownMessageType.FocusTriggerButton:
864
+ this.triggerButton.nativeElement.focus();
865
+ break;
1365
866
  }
1366
- });
867
+ }
1367
868
  };
1368
- return SkyPopoverContentComponent;
869
+ SkyDropdownComponent.prototype.sendMessage = function (type) {
870
+ this.messageStream.next({ type: type });
871
+ };
872
+ SkyDropdownComponent.prototype.positionDropdownMenu = function () {
873
+ var _this = this;
874
+ this.isVisible = false;
875
+ this.createOverlay();
876
+ this.changeDetector.markForCheck();
877
+ // Explicitly declare the `setTimeout` from the `window` object in order to use the DOM typings
878
+ // during a unit test (instead of confusing this with Node's `setTimeout`).
879
+ __classPrivateFieldSet(this, _SkyDropdownComponent_positionTimeout, window.setTimeout(function () {
880
+ _this.affixer.affixTo(_this.triggerButton.nativeElement, {
881
+ autoFitContext: i1.SkyAffixAutoFitContext.Viewport,
882
+ enableAutoFit: true,
883
+ horizontalAlignment: parseAffixHorizontalAlignment$1(_this.horizontalAlignment),
884
+ isSticky: true,
885
+ placement: 'below',
886
+ });
887
+ _this.isVisible = true;
888
+ _this.changeDetector.markForCheck();
889
+ }), "f");
890
+ };
891
+ return SkyDropdownComponent;
1369
892
  }());
1370
- SkyPopoverContentComponent.ɵfac = i0__namespace.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.16", ngImport: i0__namespace, type: SkyPopoverContentComponent, deps: [{ token: i0__namespace.ChangeDetectorRef }, { token: i0__namespace.ElementRef }, { token: i1__namespace.SkyAffixService }, { token: i1__namespace.SkyCoreAdapterService }, { token: SkyPopoverAdapterService }, { token: SkyPopoverContext, optional: true }, { token: i2__namespace.SkyThemeService, optional: true }], target: i0__namespace.ɵɵFactoryTarget.Component });
1371
- SkyPopoverContentComponent.ɵcmp = i0__namespace.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.16", type: SkyPopoverContentComponent, selector: "sky-popover-content", providers: [SkyPopoverAdapterService], viewQueries: [{ propertyName: "arrowRef", first: true, predicate: ["arrowRef"], descendants: true, read: i0.ElementRef, static: true }, { propertyName: "popoverRef", first: true, predicate: ["popoverRef"], descendants: true, read: i0.ElementRef, static: true }, { propertyName: "contentTarget", first: true, predicate: ["contentTarget"], descendants: true, read: i0.ViewContainerRef, static: true }], ngImport: i0__namespace, 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__namespace.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: i2__namespace.λ2, selector: "[skyThemeClass]", inputs: ["class", "skyThemeClass"] }, { type: i4__namespace.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }], animations: [skyPopoverAnimation] });
1372
- i0__namespace.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.16", ngImport: i0__namespace, type: SkyPopoverContentComponent, decorators: [{
893
+ _SkyDropdownComponent_positionTimeout = new WeakMap();
894
+ SkyDropdownComponent.ɵfac = i0__namespace.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.16", ngImport: i0__namespace, type: SkyDropdownComponent, deps: [{ token: i0__namespace.ChangeDetectorRef }, { token: i1__namespace.SkyAffixService }, { token: i1__namespace.SkyOverlayService }, { token: i2__namespace.SkyThemeService, optional: true }], target: i0__namespace.ɵɵFactoryTarget.Component });
895
+ SkyDropdownComponent.ɵcmp = i0__namespace.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.16", 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: i0.ElementRef }, { propertyName: "menuContainerTemplateRef", first: true, predicate: ["menuContainerTemplateRef"], descendants: true, read: i0.TemplateRef, static: true }, { propertyName: "triggerButton", first: true, predicate: ["triggerButton"], descendants: true, read: i0.ElementRef, static: true }], ngImport: i0__namespace, 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{color:#fff}.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__namespace.λ4, selector: "sky-icon", inputs: ["icon", "iconType", "size", "fixedWidth", "variant"] }], directives: [{ type: i4__namespace.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: i4__namespace.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { type: i4__namespace.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { type: i2__namespace.λ3, selector: "[skyThemeIf]", inputs: ["skyThemeIf"] }, { type: i4__namespace.NgSwitchDefault, selector: "[ngSwitchDefault]" }, { type: i4__namespace.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }], pipes: { "skyLibResources": i5__namespace.SkyLibResourcesPipe }, changeDetection: i0__namespace.ChangeDetectionStrategy.OnPush });
896
+ i0__namespace.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.16", ngImport: i0__namespace, type: SkyDropdownComponent, decorators: [{
1373
897
  type: i0.Component,
1374
898
  args: [{
1375
- selector: 'sky-popover-content',
1376
- 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",
1377
- 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"],
1378
- animations: [skyPopoverAnimation],
1379
- providers: [SkyPopoverAdapterService],
899
+ selector: 'sky-dropdown',
900
+ 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",
901
+ 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{color:#fff}.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"],
902
+ changeDetection: i0.ChangeDetectionStrategy.OnPush,
1380
903
  }]
1381
904
  }], ctorParameters: function () {
1382
- return [{ type: i0__namespace.ChangeDetectorRef }, { type: i0__namespace.ElementRef }, { type: i1__namespace.SkyAffixService }, { type: i1__namespace.SkyCoreAdapterService }, { type: SkyPopoverAdapterService }, { type: SkyPopoverContext, decorators: [{
1383
- type: i0.Optional
1384
- }] }, { type: i2__namespace.SkyThemeService, decorators: [{
905
+ return [{ type: i0__namespace.ChangeDetectorRef }, { type: i1__namespace.SkyAffixService }, { type: i1__namespace.SkyOverlayService }, { type: i2__namespace.SkyThemeService, decorators: [{
1385
906
  type: i0.Optional
1386
907
  }] }];
1387
- }, propDecorators: { arrowRef: [{
908
+ }, propDecorators: { buttonStyle: [{
909
+ type: i0.Input
910
+ }], buttonType: [{
911
+ type: i0.Input
912
+ }], disabled: [{
913
+ type: i0.Input
914
+ }], dismissOnBlur: [{
915
+ type: i0.Input
916
+ }], label: [{
917
+ type: i0.Input
918
+ }], horizontalAlignment: [{
919
+ type: i0.Input
920
+ }], messageStream: [{
921
+ type: i0.Input
922
+ }], title: [{
923
+ type: i0.Input
924
+ }], trigger: [{
925
+ type: i0.Input
926
+ }], menuContainerElementRef: [{
1388
927
  type: i0.ViewChild,
1389
- args: ['arrowRef', {
928
+ args: ['menuContainerElementRef', {
1390
929
  read: i0.ElementRef,
1391
- static: true,
1392
930
  }]
1393
- }], popoverRef: [{
931
+ }], menuContainerTemplateRef: [{
1394
932
  type: i0.ViewChild,
1395
- args: ['popoverRef', {
1396
- read: i0.ElementRef,
933
+ args: ['menuContainerTemplateRef', {
934
+ read: i0.TemplateRef,
1397
935
  static: true,
1398
936
  }]
1399
- }], contentTarget: [{
937
+ }], triggerButton: [{
1400
938
  type: i0.ViewChild,
1401
- args: ['contentTarget', {
1402
- read: i0.ViewContainerRef,
939
+ args: ['triggerButton', {
940
+ read: i0.ElementRef,
1403
941
  static: true,
1404
942
  }]
1405
943
  }] } });
1406
944
 
1407
- var SkyPopoverComponent = /** @class */ (function () {
1408
- function SkyPopoverComponent(overlayService) {
1409
- this.overlayService = overlayService;
1410
- /**
1411
- * Fires when users close the popover.
1412
- */
1413
- this.popoverClosed = new i0.EventEmitter();
1414
- /**
1415
- * Fires when users open the popover.
1416
- */
1417
- this.popoverOpened = new i0.EventEmitter();
1418
- /**
1419
- * Indicates that the popover is in the process of being opened or closed.
1420
- * @internal
1421
- */
1422
- this.isActive = false;
945
+ var nextId = 0;
946
+ /**
947
+ * Creates a menu that contains dropdown menu items.
948
+ *
949
+ */
950
+ var SkyDropdownMenuComponent = /** @class */ (function () {
951
+ function SkyDropdownMenuComponent(changeDetector, elementRef, dropdownComponent) {
952
+ this.changeDetector = changeDetector;
953
+ this.elementRef = elementRef;
954
+ this.dropdownComponent = dropdownComponent;
1423
955
  /**
1424
- * Used by unit tests to disable animations since the component is injected at the bottom of the
1425
- * document body.
1426
- * @internal
956
+ * Fires when the dropdown menu's active index or selected item changes. This event provides an
957
+ * observable to emit changes, and the response is of
958
+ * the SkyDropdownMenuChange type.
1427
959
  */
1428
- this.enableAnimations = true;
1429
- this.isMouseEnter = false;
1430
- this.isMarkedForCloseOnMouseLeave = false;
960
+ this.menuChanges = new i0.EventEmitter();
961
+ this.dropdownMenuId = "sky-dropdown-menu-" + ++nextId;
1431
962
  this.ngUnsubscribe = new rxjs.Subject();
963
+ this._menuIndex = 0;
1432
964
  }
1433
- Object.defineProperty(SkyPopoverComponent.prototype, "alignment", {
965
+ Object.defineProperty(SkyDropdownMenuComponent.prototype, "ariaRole", {
1434
966
  get: function () {
1435
- return this._alignment || 'center';
967
+ return this._ariaRole || 'menu';
1436
968
  },
1437
969
  /**
1438
- * Specifies the horizontal alignment of the popover in relation to the trigger element.
1439
- * The `skyPopoverAlignment` property on the popover directive takes precedence over this property when specified.
1440
- * @default "center"
970
+ * Specifies an ARIA role for the dropdown menu
971
+ * [to support accessibility](https://developer.blackbaud.com/skyux/learn/accessibility)
972
+ * by indicating how the dropdown menu functions and what it controls. The dropdown button
973
+ * inherits this value to set its `aria-haspopup` property. For information
974
+ * about how an ARIA role indicates what an item represents on a web page, see the
975
+ * [WAI-ARIA roles model](https://www.w3.org/WAI/PF/aria/roles).
976
+ * @default "menu"
1441
977
  */
1442
978
  set: function (value) {
1443
- this._alignment = value;
979
+ this._ariaRole = value;
1444
980
  },
1445
981
  enumerable: false,
1446
982
  configurable: true
1447
983
  });
1448
- Object.defineProperty(SkyPopoverComponent.prototype, "dismissOnBlur", {
984
+ Object.defineProperty(SkyDropdownMenuComponent.prototype, "useNativeFocus", {
1449
985
  get: function () {
1450
- if (this._dismissOnBlur === undefined) {
986
+ if (this._useNativeFocus === undefined) {
1451
987
  return true;
1452
988
  }
1453
- return this._dismissOnBlur;
989
+ return this._useNativeFocus;
1454
990
  },
1455
991
  /**
1456
- * Indicates whether to close the popover when it loses focus.
1457
- * To require users to click a trigger button to close the popover, set this input to false.
992
+ * Indicates whether to use the browser's native focus function when users navigate through menu
993
+ * items with the keyboard. To disable the native focus function, set this property to `false`.
994
+ * For example, to let users interact with the dropdown menu but keep the keyboard focus on a
995
+ * different element, set this property to `false`.
1458
996
  * @default true
1459
997
  */
1460
998
  set: function (value) {
1461
- this._dismissOnBlur = value;
999
+ this._useNativeFocus = value;
1462
1000
  },
1463
1001
  enumerable: false,
1464
1002
  configurable: true
1465
1003
  });
1466
- Object.defineProperty(SkyPopoverComponent.prototype, "placement", {
1004
+ Object.defineProperty(SkyDropdownMenuComponent.prototype, "hasFocusableItems", {
1467
1005
  get: function () {
1468
- return this._placement || 'above';
1006
+ var found = this.menuItems.find(function (item) { return item.isFocusable(); });
1007
+ return found !== undefined;
1008
+ },
1009
+ enumerable: false,
1010
+ configurable: true
1011
+ });
1012
+ Object.defineProperty(SkyDropdownMenuComponent.prototype, "menuIndex", {
1013
+ get: function () {
1014
+ return this._menuIndex;
1469
1015
  },
1470
- /**
1471
- * Specifies the placement of the popover in relation to the trigger element.
1472
- * The `skyPopoverPlacement` property on the popover directive takes precedence over this property when specified.
1473
- * @default "above"
1474
- */
1475
1016
  set: function (value) {
1476
- this._placement = value;
1017
+ if (value < 0) {
1018
+ value = this.menuItems.length - 1;
1019
+ }
1020
+ if (value >= this.menuItems.length) {
1021
+ value = 0;
1022
+ }
1023
+ this._menuIndex = value;
1477
1024
  },
1478
1025
  enumerable: false,
1479
1026
  configurable: true
1480
1027
  });
1481
- SkyPopoverComponent.prototype.ngOnDestroy = function () {
1028
+ SkyDropdownMenuComponent.prototype.ngAfterContentInit = function () {
1029
+ var _this = this;
1030
+ /* istanbul ignore else */
1031
+ if (this.dropdownComponent) {
1032
+ this.dropdownComponent.menuId = this.dropdownMenuId;
1033
+ this.dropdownComponent.menuAriaRole = this.ariaRole;
1034
+ this.dropdownComponent.messageStream
1035
+ .pipe(operators.takeUntil(this.ngUnsubscribe))
1036
+ .subscribe(function (message) {
1037
+ /* tslint:disable-next-line:switch-default */
1038
+ switch (message.type) {
1039
+ case exports.SkyDropdownMessageType.Open:
1040
+ case exports.SkyDropdownMessageType.Close:
1041
+ _this.reset();
1042
+ break;
1043
+ case exports.SkyDropdownMessageType.FocusFirstItem:
1044
+ _this.focusFirstItem();
1045
+ break;
1046
+ case exports.SkyDropdownMessageType.FocusNextItem:
1047
+ _this.focusNextItem();
1048
+ break;
1049
+ case exports.SkyDropdownMessageType.FocusPreviousItem:
1050
+ _this.focusPreviousItem();
1051
+ break;
1052
+ case exports.SkyDropdownMessageType.FocusLastItem:
1053
+ _this.focusLastItem();
1054
+ break;
1055
+ }
1056
+ });
1057
+ this.menuChanges
1058
+ .pipe(operators.takeUntil(this.ngUnsubscribe))
1059
+ .subscribe(function (change) {
1060
+ // Close the dropdown when a menu item is selected.
1061
+ if (change.selectedItem) {
1062
+ _this.sendMessage(exports.SkyDropdownMessageType.Close);
1063
+ _this.sendMessage(exports.SkyDropdownMessageType.FocusTriggerButton);
1064
+ }
1065
+ if (change.items) {
1066
+ // Update the popover style and position whenever the number of items changes.
1067
+ _this.sendMessage(exports.SkyDropdownMessageType.Reposition);
1068
+ }
1069
+ });
1070
+ }
1071
+ // Reset dropdown whenever the menu items change.
1072
+ this.menuItems.changes
1073
+ .pipe(operators.takeUntil(this.ngUnsubscribe))
1074
+ .subscribe(function (items) {
1075
+ _this.reset();
1076
+ _this.menuChanges.emit({
1077
+ items: items.toArray(),
1078
+ });
1079
+ });
1080
+ this.addEventListeners();
1081
+ };
1082
+ SkyDropdownMenuComponent.prototype.ngOnDestroy = function () {
1482
1083
  this.ngUnsubscribe.next();
1483
1084
  this.ngUnsubscribe.complete();
1484
- this.ngUnsubscribe = undefined;
1485
- if (this.overlay) {
1486
- this.overlayService.close(this.overlay);
1487
- this.overlay = undefined;
1085
+ };
1086
+ SkyDropdownMenuComponent.prototype.focusFirstItem = function () {
1087
+ if (!this.hasFocusableItems) {
1088
+ return;
1089
+ }
1090
+ this.menuIndex = 0;
1091
+ var firstItem = this.getItemByIndex(this.menuIndex);
1092
+ if (firstItem && firstItem.isFocusable()) {
1093
+ this.focusItem(firstItem);
1094
+ }
1095
+ else {
1096
+ this.focusNextItem();
1488
1097
  }
1489
1098
  };
1490
- /**
1491
- * Positions the popover next to a given caller element.
1492
- * @param caller The element that opened the popover.
1493
- * @param placement The placement of the popover.
1494
- * @param alignment The horizontal alignment of the popover.
1495
- * @internal
1496
- */
1497
- SkyPopoverComponent.prototype.positionNextTo = function (caller, placement, alignment) {
1498
- if (!this.overlay) {
1499
- this.setupOverlay();
1099
+ SkyDropdownMenuComponent.prototype.focusLastItem = function () {
1100
+ if (!this.hasFocusableItems) {
1101
+ return;
1500
1102
  }
1501
- this.placement = placement !== null && placement !== void 0 ? placement : this.placement;
1502
- this.alignment = alignment !== null && alignment !== void 0 ? alignment : this.alignment;
1503
- this.isActive = true;
1504
- this.contentRef.open(caller, {
1505
- dismissOnBlur: this.dismissOnBlur,
1506
- enableAnimations: this.enableAnimations,
1507
- horizontalAlignment: this.alignment,
1508
- isStatic: false,
1509
- placement: this.placement,
1510
- popoverTitle: this.popoverTitle,
1511
- popoverType: this.popoverType,
1103
+ this.menuIndex = this.menuItems.length - 1;
1104
+ var lastItem = this.getItemByIndex(this.menuIndex);
1105
+ if (lastItem && lastItem.isFocusable()) {
1106
+ this.focusItem(lastItem);
1107
+ }
1108
+ else {
1109
+ this.focusPreviousItem();
1110
+ }
1111
+ };
1112
+ SkyDropdownMenuComponent.prototype.focusPreviousItem = function () {
1113
+ if (!this.hasFocusableItems) {
1114
+ return;
1115
+ }
1116
+ this.menuIndex--;
1117
+ var previousItem = this.getItemByIndex(this.menuIndex);
1118
+ if (previousItem && previousItem.isFocusable()) {
1119
+ this.focusItem(previousItem);
1120
+ }
1121
+ else {
1122
+ this.focusPreviousItem();
1123
+ }
1124
+ };
1125
+ SkyDropdownMenuComponent.prototype.focusNextItem = function () {
1126
+ if (!this.hasFocusableItems) {
1127
+ return;
1128
+ }
1129
+ this.menuIndex++;
1130
+ var nextItem = this.getItemByIndex(this.menuIndex);
1131
+ if (nextItem && nextItem.isFocusable()) {
1132
+ this.focusItem(nextItem);
1133
+ }
1134
+ else {
1135
+ this.focusNextItem();
1136
+ }
1137
+ };
1138
+ SkyDropdownMenuComponent.prototype.reset = function () {
1139
+ this._menuIndex = -1;
1140
+ this.resetItemsActiveState();
1141
+ this.changeDetector.markForCheck();
1142
+ };
1143
+ SkyDropdownMenuComponent.prototype.resetItemsActiveState = function () {
1144
+ this.menuItems.forEach(function (item) {
1145
+ item.resetState();
1512
1146
  });
1513
1147
  };
1514
- /**
1515
- * Closes the popover.
1516
- * @internal
1517
- */
1518
- SkyPopoverComponent.prototype.close = function () {
1519
- var _a;
1520
- /*istanbul ignore next*/
1521
- (_a = this.contentRef) === null || _a === void 0 ? void 0 : _a.close();
1148
+ SkyDropdownMenuComponent.prototype.focusItem = function (item) {
1149
+ this.resetItemsActiveState();
1150
+ item.focusElement(this.useNativeFocus);
1151
+ this.menuChanges.emit({
1152
+ activeIndex: this.menuIndex,
1153
+ });
1522
1154
  };
1523
- /**
1524
- * Brings focus to the popover element if its open.
1525
- * @internal
1526
- */
1527
- SkyPopoverComponent.prototype.applyFocus = function () {
1528
- var _a;
1529
- /*istanbul ignore next*/
1530
- (_a = this.contentRef) === null || _a === void 0 ? void 0 : _a.applyFocus();
1155
+ SkyDropdownMenuComponent.prototype.getItemByIndex = function (index) {
1156
+ return this.menuItems.find(function (_, i) { return i === index; });
1531
1157
  };
1532
- /**
1533
- * Adds a flag to the popover to close when the mouse leaves the popover's bounds.
1534
- * @internal
1535
- */
1536
- SkyPopoverComponent.prototype.markForCloseOnMouseLeave = function () {
1537
- this.isMarkedForCloseOnMouseLeave = true;
1158
+ SkyDropdownMenuComponent.prototype.selectItemByEventTarget = function (target) {
1159
+ var _this = this;
1160
+ var selectedItem = this.menuItems.find(function (item, i) {
1161
+ var found = item.elementRef.nativeElement.contains(target);
1162
+ if (found) {
1163
+ _this.menuIndex = i;
1164
+ _this.menuChanges.next({
1165
+ activeIndex: _this.menuIndex,
1166
+ });
1167
+ }
1168
+ return found;
1169
+ });
1170
+ /* istanbul ignore else */
1171
+ if (selectedItem) {
1172
+ this.menuChanges.next({
1173
+ selectedItem: selectedItem,
1174
+ });
1175
+ }
1538
1176
  };
1539
- SkyPopoverComponent.prototype.setupOverlay = function () {
1177
+ SkyDropdownMenuComponent.prototype.sendMessage = function (type) {
1178
+ this.dropdownComponent.messageStream.next({ type: type });
1179
+ };
1180
+ SkyDropdownMenuComponent.prototype.addEventListeners = function () {
1540
1181
  var _this = this;
1541
- var overlay = this.overlayService.create({
1542
- enableScroll: true,
1543
- enablePointerEvents: true,
1182
+ var dropdownMenuElement = this.elementRef.nativeElement;
1183
+ rxjs.fromEvent(dropdownMenuElement, 'click')
1184
+ .pipe(operators.takeUntil(this.ngUnsubscribe))
1185
+ .subscribe(function (event) {
1186
+ _this.selectItemByEventTarget(event.target);
1544
1187
  });
1545
- overlay.backdropClick.pipe(operators.takeUntil(this.ngUnsubscribe)).subscribe(function () {
1546
- if (_this.dismissOnBlur) {
1547
- _this.close();
1188
+ rxjs.fromEvent(dropdownMenuElement, 'keydown')
1189
+ .pipe(operators.takeUntil(this.ngUnsubscribe))
1190
+ .subscribe(function (event) {
1191
+ var key = event.key.toLowerCase();
1192
+ /*tslint:disable-next-line:switch-default*/
1193
+ switch (key) {
1194
+ case 'escape':
1195
+ _this.sendMessage(exports.SkyDropdownMessageType.Close);
1196
+ _this.sendMessage(exports.SkyDropdownMessageType.FocusTriggerButton);
1197
+ event.stopPropagation();
1198
+ event.preventDefault();
1199
+ break;
1200
+ case 'arrowdown':
1201
+ case 'down':
1202
+ _this.focusNextItem();
1203
+ event.preventDefault();
1204
+ break;
1205
+ case 'arrowup':
1206
+ case 'up':
1207
+ _this.focusPreviousItem();
1208
+ event.preventDefault();
1209
+ break;
1210
+ case 'tab':
1211
+ if (_this.dropdownComponent.dismissOnBlur) {
1212
+ _this.sendMessage(exports.SkyDropdownMessageType.Close);
1213
+ }
1214
+ _this.sendMessage(exports.SkyDropdownMessageType.FocusTriggerButton);
1215
+ break;
1548
1216
  }
1549
1217
  });
1550
- var contentRef = overlay.attachComponent(SkyPopoverContentComponent, [
1551
- {
1552
- provide: SkyPopoverContext,
1553
- useValue: new SkyPopoverContext({
1554
- contentTemplateRef: this.templateRef,
1555
- }),
1556
- },
1557
- ]);
1558
- contentRef.opened.pipe(operators.takeUntil(this.ngUnsubscribe)).subscribe(function () {
1559
- _this.popoverOpened.emit(_this);
1560
- });
1561
- contentRef.closed.pipe(operators.takeUntil(this.ngUnsubscribe)).subscribe(function () {
1562
- /*istanbul ignore else*/
1563
- if (_this.isActive) {
1564
- _this.overlayService.close(_this.overlay);
1565
- _this.overlay = undefined;
1566
- _this.isActive = false;
1567
- _this.popoverClosed.emit(_this);
1568
- }
1218
+ rxjs.fromEvent(dropdownMenuElement, 'mouseenter')
1219
+ .pipe(operators.takeUntil(this.ngUnsubscribe))
1220
+ .subscribe(function () {
1221
+ _this.dropdownComponent.isMouseEnter = true;
1569
1222
  });
1570
- contentRef.isMouseEnter
1223
+ rxjs.fromEvent(dropdownMenuElement, 'mouseleave')
1571
1224
  .pipe(operators.takeUntil(this.ngUnsubscribe))
1572
- .subscribe(function (isMouseEnter) {
1573
- _this.isMouseEnter = isMouseEnter;
1574
- if (_this.isMarkedForCloseOnMouseLeave) {
1575
- _this.isMarkedForCloseOnMouseLeave = false;
1576
- _this.close();
1577
- }
1225
+ .subscribe(function () {
1226
+ _this.dropdownComponent.isMouseEnter = false;
1227
+ // Allow the dropdown component to set isMouseEnter before checking if the close action
1228
+ // should be taken.
1229
+ setTimeout(function () {
1230
+ if (_this.dropdownComponent.trigger === 'hover' &&
1231
+ _this.dropdownComponent.isMouseEnter === false) {
1232
+ _this.sendMessage(exports.SkyDropdownMessageType.Close);
1233
+ }
1234
+ });
1578
1235
  });
1579
- this.overlay = overlay;
1580
- this.contentRef = contentRef;
1581
1236
  };
1582
- return SkyPopoverComponent;
1237
+ return SkyDropdownMenuComponent;
1583
1238
  }());
1584
- SkyPopoverComponent.ɵfac = i0__namespace.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.16", ngImport: i0__namespace, type: SkyPopoverComponent, deps: [{ token: i1__namespace.SkyOverlayService }], target: i0__namespace.ɵɵFactoryTarget.Component });
1585
- SkyPopoverComponent.ɵcmp = i0__namespace.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.16", 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: i0.TemplateRef, static: true }], ngImport: i0__namespace, template: "<ng-template #templateRef>\n <ng-content></ng-content>\n</ng-template>\n" });
1586
- i0__namespace.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.16", ngImport: i0__namespace, type: SkyPopoverComponent, decorators: [{
1239
+ SkyDropdownMenuComponent.ɵfac = i0__namespace.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.16", ngImport: i0__namespace, type: SkyDropdownMenuComponent, deps: [{ token: i0__namespace.ChangeDetectorRef }, { token: i0__namespace.ElementRef }, { token: SkyDropdownComponent, optional: true }], target: i0__namespace.ɵɵFactoryTarget.Component });
1240
+ SkyDropdownMenuComponent.ɵcmp = i0__namespace.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.16", 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__namespace, 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__namespace.ChangeDetectionStrategy.OnPush, encapsulation: i0__namespace.ViewEncapsulation.None });
1241
+ i0__namespace.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.16", ngImport: i0__namespace, type: SkyDropdownMenuComponent, decorators: [{
1587
1242
  type: i0.Component,
1588
1243
  args: [{
1589
- selector: 'sky-popover',
1590
- template: "<ng-template #templateRef>\n <ng-content></ng-content>\n</ng-template>\n",
1244
+ selector: 'sky-dropdown-menu',
1245
+ 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",
1246
+ 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"],
1247
+ changeDetection: i0.ChangeDetectionStrategy.OnPush,
1248
+ encapsulation: i0.ViewEncapsulation.None,
1591
1249
  }]
1592
- }], ctorParameters: function () { return [{ type: i1__namespace.SkyOverlayService }]; }, propDecorators: { alignment: [{
1593
- type: i0.Input
1594
- }], dismissOnBlur: [{
1595
- type: i0.Input
1596
- }], placement: [{
1250
+ }], ctorParameters: function () {
1251
+ return [{ type: i0__namespace.ChangeDetectorRef }, { type: i0__namespace.ElementRef }, { type: SkyDropdownComponent, decorators: [{
1252
+ type: i0.Optional
1253
+ }] }];
1254
+ }, propDecorators: { ariaLabelledBy: [{
1597
1255
  type: i0.Input
1598
- }], popoverTitle: [{
1256
+ }], ariaRole: [{
1599
1257
  type: i0.Input
1600
- }], popoverType: [{
1258
+ }], useNativeFocus: [{
1601
1259
  type: i0.Input
1602
- }], popoverClosed: [{
1603
- type: i0.Output
1604
- }], popoverOpened: [{
1260
+ }], menuChanges: [{
1605
1261
  type: i0.Output
1606
- }], templateRef: [{
1607
- type: i0.ViewChild,
1608
- args: ['templateRef', {
1609
- read: i0.TemplateRef,
1610
- static: true,
1611
- }]
1262
+ }], menuItems: [{
1263
+ type: i0.ContentChildren,
1264
+ args: [SkyDropdownItemComponent, { descendants: true }]
1612
1265
  }] } });
1613
1266
 
1614
- /*! *****************************************************************************
1615
- Copyright (c) Microsoft Corporation.
1267
+ var SkyDropdownModule = /** @class */ (function () {
1268
+ function SkyDropdownModule() {
1269
+ }
1270
+ return SkyDropdownModule;
1271
+ }());
1272
+ SkyDropdownModule.ɵfac = i0__namespace.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.16", ngImport: i0__namespace, type: SkyDropdownModule, deps: [], target: i0__namespace.ɵɵFactoryTarget.NgModule });
1273
+ SkyDropdownModule.ɵmod = i0__namespace.ɵɵngDeclareNgModule({ minVersion: "12.0.0", version: "12.2.16", ngImport: i0__namespace, type: SkyDropdownModule, declarations: [SkyDropdownButtonComponent,
1274
+ SkyDropdownComponent,
1275
+ SkyDropdownItemComponent,
1276
+ SkyDropdownMenuComponent], imports: [i4.CommonModule,
1277
+ i1.SkyAffixModule,
1278
+ i3.SkyIconModule,
1279
+ i1.SkyOverlayModule,
1280
+ SkyPopoversResourcesModule,
1281
+ i2.SkyThemeModule], exports: [SkyDropdownButtonComponent,
1282
+ SkyDropdownComponent,
1283
+ SkyDropdownItemComponent,
1284
+ SkyDropdownMenuComponent] });
1285
+ SkyDropdownModule.ɵinj = i0__namespace.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "12.2.16", ngImport: i0__namespace, type: SkyDropdownModule, imports: [[
1286
+ i4.CommonModule,
1287
+ i1.SkyAffixModule,
1288
+ i3.SkyIconModule,
1289
+ i1.SkyOverlayModule,
1290
+ SkyPopoversResourcesModule,
1291
+ i2.SkyThemeModule,
1292
+ ]] });
1293
+ i0__namespace.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.16", ngImport: i0__namespace, type: SkyDropdownModule, decorators: [{
1294
+ type: i0.NgModule,
1295
+ args: [{
1296
+ declarations: [
1297
+ SkyDropdownButtonComponent,
1298
+ SkyDropdownComponent,
1299
+ SkyDropdownItemComponent,
1300
+ SkyDropdownMenuComponent,
1301
+ ],
1302
+ imports: [
1303
+ i4.CommonModule,
1304
+ i1.SkyAffixModule,
1305
+ i3.SkyIconModule,
1306
+ i1.SkyOverlayModule,
1307
+ SkyPopoversResourcesModule,
1308
+ i2.SkyThemeModule,
1309
+ ],
1310
+ exports: [
1311
+ SkyDropdownButtonComponent,
1312
+ SkyDropdownComponent,
1313
+ SkyDropdownItemComponent,
1314
+ SkyDropdownMenuComponent,
1315
+ ],
1316
+ }]
1317
+ }] });
1318
+
1319
+ /**
1320
+ * @internal
1321
+ */
1322
+ var SkyPopoverAdapterService = /** @class */ (function () {
1323
+ function SkyPopoverAdapterService() {
1324
+ }
1325
+ SkyPopoverAdapterService.prototype.getArrowCoordinates = function (elements, placement, themeName) {
1326
+ var callerRect = elements.caller.nativeElement.getBoundingClientRect();
1327
+ var popoverRect = elements.popover.nativeElement.getBoundingClientRect();
1328
+ var arrowRect = elements.popoverArrow.nativeElement.getBoundingClientRect();
1329
+ var pixelTolerance = 20;
1330
+ var top;
1331
+ var left;
1332
+ if (placement === 'above' || placement === 'below') {
1333
+ left = callerRect.left + callerRect.width * 0.5;
1334
+ // Make sure the arrow never detaches from the popover.
1335
+ if (left - pixelTolerance < popoverRect.left) {
1336
+ left = popoverRect.left + pixelTolerance;
1337
+ }
1338
+ else if (left + pixelTolerance > popoverRect.right) {
1339
+ left = popoverRect.right - pixelTolerance;
1340
+ }
1341
+ if (placement === 'above') {
1342
+ if (themeName !== 'modern') {
1343
+ top = callerRect.top - arrowRect.height;
1344
+ }
1345
+ else {
1346
+ top = callerRect.top - arrowRect.height + 5;
1347
+ }
1348
+ }
1349
+ else {
1350
+ if (themeName !== 'modern') {
1351
+ top = callerRect.bottom;
1352
+ }
1353
+ else {
1354
+ top = callerRect.bottom + 4;
1355
+ }
1356
+ }
1357
+ }
1358
+ else {
1359
+ top = callerRect.top + callerRect.height * 0.5;
1360
+ // Make sure the arrow never detaches from the popover.
1361
+ if (top - pixelTolerance < popoverRect.top) {
1362
+ top = popoverRect.top + pixelTolerance;
1363
+ }
1364
+ else if (top + pixelTolerance > popoverRect.bottom) {
1365
+ top = popoverRect.bottom - pixelTolerance;
1366
+ }
1367
+ if (placement === 'left') {
1368
+ if (themeName !== 'modern') {
1369
+ left = callerRect.left - arrowRect.width;
1370
+ }
1371
+ else {
1372
+ left = callerRect.left - arrowRect.width + 5;
1373
+ }
1374
+ }
1375
+ else {
1376
+ if (themeName !== 'modern') {
1377
+ left = callerRect.right;
1378
+ }
1379
+ else {
1380
+ left = callerRect.right + 4;
1381
+ }
1382
+ }
1383
+ }
1384
+ return { top: top, left: left };
1385
+ };
1386
+ return SkyPopoverAdapterService;
1387
+ }());
1388
+ SkyPopoverAdapterService.ɵfac = i0__namespace.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.16", ngImport: i0__namespace, type: SkyPopoverAdapterService, deps: [], target: i0__namespace.ɵɵFactoryTarget.Injectable });
1389
+ SkyPopoverAdapterService.ɵprov = i0__namespace.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "12.2.16", ngImport: i0__namespace, type: SkyPopoverAdapterService });
1390
+ i0__namespace.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.16", ngImport: i0__namespace, type: SkyPopoverAdapterService, decorators: [{
1391
+ type: i0.Injectable
1392
+ }] });
1393
+
1394
+ /**
1395
+ * @internal
1396
+ */
1397
+ var skyPopoverAnimation = animations.trigger('skyPopoverAnimation', [
1398
+ animations.state('void', animations.style({
1399
+ opacity: 0,
1400
+ })),
1401
+ animations.state('open', animations.style({
1402
+ opacity: 1,
1403
+ })),
1404
+ animations.state('closed', animations.style({
1405
+ opacity: 0,
1406
+ })),
1407
+ animations.transition('void => *', [animations.animate('250ms')]),
1408
+ animations.transition('open => closed', [animations.animate('150ms')]),
1409
+ animations.transition('closed => open', [animations.animate('150ms')]),
1410
+ ]);
1411
+
1412
+ function parseAffixPlacement(placement) {
1413
+ switch (placement) {
1414
+ case 'above':
1415
+ return 'above';
1416
+ case 'below':
1417
+ return 'below';
1418
+ case 'right':
1419
+ return 'right';
1420
+ case 'left':
1421
+ return 'left';
1422
+ /* istanbul ignore next */
1423
+ default:
1424
+ throw "SkyAffixPlacement does not have a matching value for '" + placement + "'!";
1425
+ }
1426
+ }
1427
+ function parseAffixHorizontalAlignment(alignment) {
1428
+ switch (alignment) {
1429
+ case 'center':
1430
+ return 'center';
1431
+ case 'left':
1432
+ return 'left';
1433
+ case 'right':
1434
+ return 'right';
1435
+ /* istanbul ignore next */
1436
+ default:
1437
+ throw "SkyAffixHorizontalAlignment does not have a matching value for '" + alignment + "'!";
1438
+ }
1439
+ }
1616
1440
 
1617
- Permission to use, copy, modify, and/or distribute this software for any
1618
- purpose with or without fee is hereby granted.
1441
+ /**
1442
+ * @dynamic
1443
+ * @internal
1444
+ */
1445
+ var SkyPopoverContext = /** @class */ (function () {
1446
+ function SkyPopoverContext(args) {
1447
+ this.contentTemplateRef = args.contentTemplateRef;
1448
+ }
1449
+ return SkyPopoverContext;
1450
+ }());
1619
1451
 
1620
- THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
1621
- REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
1622
- AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
1623
- INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
1624
- LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
1625
- OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
1626
- PERFORMANCE OF THIS SOFTWARE.
1627
- ***************************************************************************** */
1628
- /* global Reflect, Promise */
1629
- var extendStatics = function (d, b) {
1630
- extendStatics = Object.setPrototypeOf ||
1631
- ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
1632
- function (d, b) { for (var p in b)
1633
- if (Object.prototype.hasOwnProperty.call(b, p))
1634
- d[p] = b[p]; };
1635
- return extendStatics(d, b);
1636
- };
1637
- function __extends(d, b) {
1638
- if (typeof b !== "function" && b !== null)
1639
- throw new TypeError("Class extends value " + String(b) + " is not a constructor or null");
1640
- extendStatics(d, b);
1641
- function __() { this.constructor = d; }
1642
- d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
1643
- }
1644
- var __assign = function () {
1645
- __assign = Object.assign || function __assign(t) {
1646
- for (var s, i = 1, n = arguments.length; i < n; i++) {
1647
- s = arguments[i];
1648
- for (var p in s)
1649
- if (Object.prototype.hasOwnProperty.call(s, p))
1650
- t[p] = s[p];
1452
+ /**
1453
+ * @internal
1454
+ */
1455
+ var SkyPopoverContentComponent = /** @class */ (function () {
1456
+ function SkyPopoverContentComponent(changeDetector, elementRef, affixService, coreAdapterService, adapterService, context, themeSvc) {
1457
+ this.changeDetector = changeDetector;
1458
+ this.elementRef = elementRef;
1459
+ this.affixService = affixService;
1460
+ this.coreAdapterService = coreAdapterService;
1461
+ this.adapterService = adapterService;
1462
+ this.context = context;
1463
+ this.themeSvc = themeSvc;
1464
+ this.dismissOnBlur = true;
1465
+ this.enableAnimations = true;
1466
+ this.isOpen = false;
1467
+ this.placement = null;
1468
+ this.ngUnsubscribe = new rxjs.Subject();
1469
+ this._closed = new rxjs.Subject();
1470
+ this._isMouseEnter = new rxjs.Subject();
1471
+ this._opened = new rxjs.Subject();
1472
+ }
1473
+ Object.defineProperty(SkyPopoverContentComponent.prototype, "animationState", {
1474
+ get: function () {
1475
+ return this.isOpen ? 'open' : 'closed';
1476
+ },
1477
+ enumerable: false,
1478
+ configurable: true
1479
+ });
1480
+ Object.defineProperty(SkyPopoverContentComponent.prototype, "closed", {
1481
+ get: function () {
1482
+ return this._closed.asObservable();
1483
+ },
1484
+ enumerable: false,
1485
+ configurable: true
1486
+ });
1487
+ Object.defineProperty(SkyPopoverContentComponent.prototype, "opened", {
1488
+ get: function () {
1489
+ return this._opened.asObservable();
1490
+ },
1491
+ enumerable: false,
1492
+ configurable: true
1493
+ });
1494
+ Object.defineProperty(SkyPopoverContentComponent.prototype, "isMouseEnter", {
1495
+ get: function () {
1496
+ return this._isMouseEnter.asObservable();
1497
+ },
1498
+ enumerable: false,
1499
+ configurable: true
1500
+ });
1501
+ SkyPopoverContentComponent.prototype.ngOnInit = function () {
1502
+ var _this = this;
1503
+ this.contentTarget.createEmbeddedView(this.context.contentTemplateRef);
1504
+ this.addEventListeners();
1505
+ /*istanbul ignore else*/
1506
+ if (this.themeSvc) {
1507
+ this.themeSvc.settingsChange
1508
+ .pipe(operators.takeUntil(this.ngUnsubscribe))
1509
+ .subscribe(function (themeSettings) {
1510
+ var _a, _b;
1511
+ /*istanbul ignore next*/
1512
+ _this.themeName = (_b = (_a = themeSettings.currentSettings) === null || _a === void 0 ? void 0 : _a.theme) === null || _b === void 0 ? void 0 : _b.name;
1513
+ });
1651
1514
  }
1652
- return t;
1653
1515
  };
1654
- return __assign.apply(this, arguments);
1655
- };
1656
- function __rest(s, e) {
1657
- var t = {};
1658
- for (var p in s)
1659
- if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
1660
- t[p] = s[p];
1661
- if (s != null && typeof Object.getOwnPropertySymbols === "function")
1662
- for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
1663
- if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
1664
- t[p[i]] = s[p[i]];
1516
+ SkyPopoverContentComponent.prototype.ngOnDestroy = function () {
1517
+ this.ngUnsubscribe.next();
1518
+ this.ngUnsubscribe.complete();
1519
+ this._closed.complete();
1520
+ this._isMouseEnter.complete();
1521
+ this._opened.complete();
1522
+ /* istanbul ignore else */
1523
+ if (this.affixer) {
1524
+ this.affixer.destroy();
1525
+ this.affixer = undefined;
1665
1526
  }
1666
- return t;
1667
- }
1668
- function __decorate(decorators, target, key, desc) {
1669
- var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
1670
- if (typeof Reflect === "object" && typeof Reflect.decorate === "function")
1671
- r = Reflect.decorate(decorators, target, key, desc);
1672
- else
1673
- for (var i = decorators.length - 1; i >= 0; i--)
1674
- if (d = decorators[i])
1675
- r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
1676
- return c > 3 && r && Object.defineProperty(target, key, r), r;
1677
- }
1678
- function __param(paramIndex, decorator) {
1679
- return function (target, key) { decorator(target, key, paramIndex); };
1680
- }
1681
- function __metadata(metadataKey, metadataValue) {
1682
- if (typeof Reflect === "object" && typeof Reflect.metadata === "function")
1683
- return Reflect.metadata(metadataKey, metadataValue);
1684
- }
1685
- function __awaiter(thisArg, _arguments, P, generator) {
1686
- function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
1687
- return new (P || (P = Promise))(function (resolve, reject) {
1688
- function fulfilled(value) { try {
1689
- step(generator.next(value));
1527
+ };
1528
+ SkyPopoverContentComponent.prototype.onAnimationEvent = function (event) {
1529
+ if (event.fromState === 'void') {
1530
+ return;
1690
1531
  }
1691
- catch (e) {
1692
- reject(e);
1693
- } }
1694
- function rejected(value) { try {
1695
- step(generator["throw"](value));
1532
+ if (event.phaseName === 'done') {
1533
+ if (event.toState === 'open') {
1534
+ this._opened.next();
1535
+ }
1536
+ else {
1537
+ this._closed.next();
1538
+ }
1696
1539
  }
1697
- catch (e) {
1698
- reject(e);
1699
- } }
1700
- function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
1701
- step((generator = generator.apply(thisArg, _arguments || [])).next());
1702
- });
1703
- }
1704
- function __generator(thisArg, body) {
1705
- var _ = { label: 0, sent: function () { if (t[0] & 1)
1706
- throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
1707
- return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function () { return this; }), g;
1708
- function verb(n) { return function (v) { return step([n, v]); }; }
1709
- function step(op) {
1710
- if (f)
1711
- throw new TypeError("Generator is already executing.");
1712
- while (_)
1713
- try {
1714
- if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done)
1715
- return t;
1716
- if (y = 0, t)
1717
- op = [op[0] & 2, t.value];
1718
- switch (op[0]) {
1719
- case 0:
1720
- case 1:
1721
- t = op;
1722
- break;
1723
- case 4:
1724
- _.label++;
1725
- return { value: op[1], done: false };
1726
- case 5:
1727
- _.label++;
1728
- y = op[1];
1729
- op = [0];
1730
- continue;
1731
- case 7:
1732
- op = _.ops.pop();
1733
- _.trys.pop();
1734
- continue;
1735
- default:
1736
- if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) {
1737
- _ = 0;
1738
- continue;
1739
- }
1740
- if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) {
1741
- _.label = op[1];
1742
- break;
1743
- }
1744
- if (op[0] === 6 && _.label < t[1]) {
1745
- _.label = t[1];
1746
- t = op;
1747
- break;
1748
- }
1749
- if (t && _.label < t[2]) {
1750
- _.label = t[2];
1751
- _.ops.push(op);
1752
- break;
1753
- }
1754
- if (t[2])
1755
- _.ops.pop();
1756
- _.trys.pop();
1757
- continue;
1758
- }
1759
- op = body.call(thisArg, _);
1540
+ };
1541
+ SkyPopoverContentComponent.prototype.open = function (caller, config) {
1542
+ var _this = this;
1543
+ this.caller = caller;
1544
+ this.dismissOnBlur = config.dismissOnBlur;
1545
+ this.enableAnimations = config.enableAnimations;
1546
+ this.horizontalAlignment = config.horizontalAlignment;
1547
+ this.placement = config.placement;
1548
+ this.popoverTitle = config.popoverTitle;
1549
+ this.popoverType = config.popoverType;
1550
+ this.changeDetector.markForCheck();
1551
+ // Indicates if the popover should be displayed statically.
1552
+ // Please note: This feature is internal-only and used by the visual tests to capture multiple
1553
+ // states simultaneously without the overhead of event listeners.
1554
+ /* istanbul ignore if */
1555
+ if (config.isStatic) {
1556
+ this.isOpen = true;
1557
+ this.changeDetector.markForCheck();
1558
+ return;
1559
+ }
1560
+ // Let the styles render before gauging the affix dimensions.
1561
+ setTimeout(function () {
1562
+ if (!_this.popoverRef.nativeElement || _this.ngUnsubscribe.isStopped) {
1563
+ return;
1760
1564
  }
1761
- catch (e) {
1762
- op = [6, e];
1763
- y = 0;
1565
+ if (!_this.affixer) {
1566
+ _this.setupAffixer();
1764
1567
  }
1765
- finally {
1766
- f = t = 0;
1568
+ var affixOptions = {
1569
+ autoFitContext: i1.SkyAffixAutoFitContext.Viewport,
1570
+ enableAutoFit: true,
1571
+ horizontalAlignment: parseAffixHorizontalAlignment(_this.horizontalAlignment),
1572
+ isSticky: true,
1573
+ placement: parseAffixPlacement(_this.placement),
1574
+ };
1575
+ // Ensure vertical alignment is set according to the popover's placement value.
1576
+ if (affixOptions.placement === 'left' ||
1577
+ affixOptions.placement === 'right') {
1578
+ affixOptions.verticalAlignment = 'middle';
1767
1579
  }
1768
- if (op[0] & 5)
1769
- throw op[1];
1770
- return { value: op[0] ? op[1] : void 0, done: true };
1771
- }
1772
- }
1773
- var __createBinding = Object.create ? (function (o, m, k, k2) {
1774
- if (k2 === undefined)
1775
- k2 = k;
1776
- Object.defineProperty(o, k2, { enumerable: true, get: function () { return m[k]; } });
1777
- }) : (function (o, m, k, k2) {
1778
- if (k2 === undefined)
1779
- k2 = k;
1780
- o[k2] = m[k];
1781
- });
1782
- function __exportStar(m, o) {
1783
- for (var p in m)
1784
- if (p !== "default" && !Object.prototype.hasOwnProperty.call(o, p))
1785
- __createBinding(o, m, p);
1786
- }
1787
- function __values(o) {
1788
- var s = typeof Symbol === "function" && Symbol.iterator, m = s && o[s], i = 0;
1789
- if (m)
1790
- return m.call(o);
1791
- if (o && typeof o.length === "number")
1792
- return {
1793
- next: function () {
1794
- if (o && i >= o.length)
1795
- o = void 0;
1796
- return { value: o && o[i++], done: !o };
1580
+ _this.affixer.affixTo(_this.caller.nativeElement, affixOptions);
1581
+ _this.updateArrowOffset();
1582
+ _this.isOpen = true;
1583
+ _this.changeDetector.markForCheck();
1584
+ });
1585
+ };
1586
+ SkyPopoverContentComponent.prototype.close = function () {
1587
+ this.isOpen = false;
1588
+ this.changeDetector.markForCheck();
1589
+ };
1590
+ SkyPopoverContentComponent.prototype.applyFocus = function () {
1591
+ if (this.isOpen) {
1592
+ this.coreAdapterService.getFocusableChildrenAndApplyFocus(this.popoverRef, '.sky-popover', true);
1593
+ }
1594
+ };
1595
+ SkyPopoverContentComponent.prototype.setupAffixer = function () {
1596
+ var _this = this;
1597
+ var affixer = this.affixService.createAffixer(this.popoverRef);
1598
+ affixer.offsetChange.pipe(operators.takeUntil(this.ngUnsubscribe)).subscribe(function () {
1599
+ _this.updateArrowOffset();
1600
+ _this.changeDetector.markForCheck();
1601
+ });
1602
+ affixer.overflowScroll.pipe(operators.takeUntil(this.ngUnsubscribe)).subscribe(function () {
1603
+ _this.updateArrowOffset();
1604
+ _this.changeDetector.markForCheck();
1605
+ });
1606
+ affixer.placementChange
1607
+ .pipe(operators.takeUntil(this.ngUnsubscribe))
1608
+ .subscribe(function (change) {
1609
+ _this.placement = change.placement;
1610
+ _this.changeDetector.markForCheck();
1611
+ });
1612
+ this.affixer = affixer;
1613
+ };
1614
+ SkyPopoverContentComponent.prototype.updateArrowOffset = function () {
1615
+ if (this.placement) {
1616
+ var _c = this.adapterService.getArrowCoordinates({
1617
+ caller: this.caller,
1618
+ popover: this.popoverRef,
1619
+ popoverArrow: this.arrowRef,
1620
+ }, this.placement, this.themeName), top = _c.top, left = _c.left;
1621
+ this.arrowTop = top;
1622
+ this.arrowLeft = left;
1623
+ }
1624
+ };
1625
+ SkyPopoverContentComponent.prototype.isFocusLeavingElement = function (event) {
1626
+ var focusableItems = this.coreAdapterService.getFocusableChildren(this.elementRef.nativeElement);
1627
+ var isFirstItem = focusableItems[0] === event.target && event.shiftKey;
1628
+ var isLastItem = focusableItems[focusableItems.length - 1] === event.target &&
1629
+ !event.shiftKey;
1630
+ return focusableItems.length === 0 || isFirstItem || isLastItem;
1631
+ };
1632
+ SkyPopoverContentComponent.prototype.addEventListeners = function () {
1633
+ var _this = this;
1634
+ var hostElement = this.elementRef.nativeElement;
1635
+ rxjs.fromEvent(hostElement, 'mouseenter')
1636
+ .pipe(operators.takeUntil(this.ngUnsubscribe))
1637
+ .subscribe(function () { return _this._isMouseEnter.next(true); });
1638
+ rxjs.fromEvent(hostElement, 'mouseleave')
1639
+ .pipe(operators.takeUntil(this.ngUnsubscribe))
1640
+ .subscribe(function () { return _this._isMouseEnter.next(false); });
1641
+ rxjs.fromEvent(hostElement, 'keydown')
1642
+ .pipe(operators.takeUntil(this.ngUnsubscribe))
1643
+ .subscribe(function (event) {
1644
+ var key = event.key.toLowerCase();
1645
+ /* tslint:disable-next-line:switch-default */
1646
+ switch (key) {
1647
+ case 'escape':
1648
+ _this.close();
1649
+ _this.caller.nativeElement.focus();
1650
+ event.preventDefault();
1651
+ event.stopPropagation();
1652
+ break;
1653
+ // Since the popover now lives in an overlay at the bottom of the document body, we need
1654
+ // to handle the tab key ourselves. Otherwise, focus would be moved to the browser's
1655
+ // search bar.
1656
+ case 'tab':
1657
+ if (!_this.dismissOnBlur) {
1658
+ return;
1659
+ }
1660
+ /*istanbul ignore else*/
1661
+ if (_this.isFocusLeavingElement(event)) {
1662
+ _this.close();
1663
+ _this.caller.nativeElement.focus();
1664
+ event.preventDefault();
1665
+ event.stopPropagation();
1666
+ }
1667
+ break;
1797
1668
  }
1798
- };
1799
- throw new TypeError(s ? "Object is not iterable." : "Symbol.iterator is not defined.");
1800
- }
1801
- function __read(o, n) {
1802
- var m = typeof Symbol === "function" && o[Symbol.iterator];
1803
- if (!m)
1804
- return o;
1805
- var i = m.call(o), r, ar = [], e;
1806
- try {
1807
- while ((n === void 0 || n-- > 0) && !(r = i.next()).done)
1808
- ar.push(r.value);
1809
- }
1810
- catch (error) {
1811
- e = { error: error };
1669
+ });
1670
+ };
1671
+ return SkyPopoverContentComponent;
1672
+ }());
1673
+ SkyPopoverContentComponent.ɵfac = i0__namespace.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.16", ngImport: i0__namespace, type: SkyPopoverContentComponent, deps: [{ token: i0__namespace.ChangeDetectorRef }, { token: i0__namespace.ElementRef }, { token: i1__namespace.SkyAffixService }, { token: i1__namespace.SkyCoreAdapterService }, { token: SkyPopoverAdapterService }, { token: SkyPopoverContext }, { token: i2__namespace.SkyThemeService, optional: true }], target: i0__namespace.ɵɵFactoryTarget.Component });
1674
+ SkyPopoverContentComponent.ɵcmp = i0__namespace.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.16", type: SkyPopoverContentComponent, selector: "sky-popover-content", providers: [SkyPopoverAdapterService], viewQueries: [{ propertyName: "arrowRef", first: true, predicate: ["arrowRef"], descendants: true, read: i0.ElementRef, static: true }, { propertyName: "popoverRef", first: true, predicate: ["popoverRef"], descendants: true, read: i0.ElementRef, static: true }, { propertyName: "contentTarget", first: true, predicate: ["contentTarget"], descendants: true, read: i0.ViewContainerRef, static: true }], ngImport: i0__namespace, 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__namespace.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: i2__namespace.λ2, selector: "[skyThemeClass]", inputs: ["class", "skyThemeClass"] }, { type: i4__namespace.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }], animations: [skyPopoverAnimation] });
1675
+ i0__namespace.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.16", ngImport: i0__namespace, type: SkyPopoverContentComponent, decorators: [{
1676
+ type: i0.Component,
1677
+ args: [{
1678
+ selector: 'sky-popover-content',
1679
+ 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",
1680
+ 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"],
1681
+ animations: [skyPopoverAnimation],
1682
+ providers: [SkyPopoverAdapterService],
1683
+ }]
1684
+ }], ctorParameters: function () {
1685
+ return [{ type: i0__namespace.ChangeDetectorRef }, { type: i0__namespace.ElementRef }, { type: i1__namespace.SkyAffixService }, { type: i1__namespace.SkyCoreAdapterService }, { type: SkyPopoverAdapterService }, { type: SkyPopoverContext }, { type: i2__namespace.SkyThemeService, decorators: [{
1686
+ type: i0.Optional
1687
+ }] }];
1688
+ }, propDecorators: { arrowRef: [{
1689
+ type: i0.ViewChild,
1690
+ args: ['arrowRef', {
1691
+ read: i0.ElementRef,
1692
+ static: true,
1693
+ }]
1694
+ }], popoverRef: [{
1695
+ type: i0.ViewChild,
1696
+ args: ['popoverRef', {
1697
+ read: i0.ElementRef,
1698
+ static: true,
1699
+ }]
1700
+ }], contentTarget: [{
1701
+ type: i0.ViewChild,
1702
+ args: ['contentTarget', {
1703
+ read: i0.ViewContainerRef,
1704
+ static: true,
1705
+ }]
1706
+ }] } });
1707
+
1708
+ var SkyPopoverComponent = /** @class */ (function () {
1709
+ function SkyPopoverComponent(overlayService) {
1710
+ this.overlayService = overlayService;
1711
+ /**
1712
+ * Fires when users close the popover.
1713
+ */
1714
+ this.popoverClosed = new i0.EventEmitter();
1715
+ /**
1716
+ * Fires when users open the popover.
1717
+ */
1718
+ this.popoverOpened = new i0.EventEmitter();
1719
+ /**
1720
+ * Indicates that the popover is in the process of being opened or closed.
1721
+ * @internal
1722
+ */
1723
+ this.isActive = false;
1724
+ /**
1725
+ * Used by unit tests to disable animations since the component is injected at the bottom of the
1726
+ * document body.
1727
+ * @internal
1728
+ */
1729
+ this.enableAnimations = true;
1730
+ this.isMouseEnter = false;
1731
+ this.isMarkedForCloseOnMouseLeave = false;
1732
+ this.ngUnsubscribe = new rxjs.Subject();
1812
1733
  }
1813
- finally {
1814
- try {
1815
- if (r && !r.done && (m = i["return"]))
1816
- m.call(i);
1734
+ Object.defineProperty(SkyPopoverComponent.prototype, "alignment", {
1735
+ get: function () {
1736
+ return this._alignment || 'center';
1737
+ },
1738
+ /**
1739
+ * Specifies the horizontal alignment of the popover in relation to the trigger element.
1740
+ * The `skyPopoverAlignment` property on the popover directive takes precedence over this property when specified.
1741
+ * @default "center"
1742
+ */
1743
+ set: function (value) {
1744
+ this._alignment = value;
1745
+ },
1746
+ enumerable: false,
1747
+ configurable: true
1748
+ });
1749
+ Object.defineProperty(SkyPopoverComponent.prototype, "dismissOnBlur", {
1750
+ get: function () {
1751
+ if (this._dismissOnBlur === undefined) {
1752
+ return true;
1753
+ }
1754
+ return this._dismissOnBlur;
1755
+ },
1756
+ /**
1757
+ * Indicates whether to close the popover when it loses focus.
1758
+ * To require users to click a trigger button to close the popover, set this input to false.
1759
+ * @default true
1760
+ */
1761
+ set: function (value) {
1762
+ this._dismissOnBlur = value;
1763
+ },
1764
+ enumerable: false,
1765
+ configurable: true
1766
+ });
1767
+ Object.defineProperty(SkyPopoverComponent.prototype, "placement", {
1768
+ get: function () {
1769
+ return this._placement || 'above';
1770
+ },
1771
+ /**
1772
+ * Specifies the placement of the popover in relation to the trigger element.
1773
+ * The `skyPopoverPlacement` property on the popover directive takes precedence over this property when specified.
1774
+ * @default "above"
1775
+ */
1776
+ set: function (value) {
1777
+ this._placement = value;
1778
+ },
1779
+ enumerable: false,
1780
+ configurable: true
1781
+ });
1782
+ Object.defineProperty(SkyPopoverComponent.prototype, "popoverType", {
1783
+ get: function () {
1784
+ return this._popoverType || 'info';
1785
+ },
1786
+ /**
1787
+ * Specifies the type of popover.
1788
+ * @default "info"
1789
+ */
1790
+ set: function (value) {
1791
+ this._popoverType = value;
1792
+ },
1793
+ enumerable: false,
1794
+ configurable: true
1795
+ });
1796
+ SkyPopoverComponent.prototype.ngOnDestroy = function () {
1797
+ this.ngUnsubscribe.next();
1798
+ this.ngUnsubscribe.complete();
1799
+ if (this.overlay) {
1800
+ this.overlayService.close(this.overlay);
1801
+ this.overlay = undefined;
1817
1802
  }
1818
- finally {
1819
- if (e)
1820
- throw e.error;
1803
+ };
1804
+ /**
1805
+ * Positions the popover next to a given caller element.
1806
+ * @param caller The element that opened the popover.
1807
+ * @param placement The placement of the popover.
1808
+ * @param alignment The horizontal alignment of the popover.
1809
+ * @internal
1810
+ */
1811
+ SkyPopoverComponent.prototype.positionNextTo = function (caller, placement, alignment) {
1812
+ if (!this.overlay) {
1813
+ this.setupOverlay();
1821
1814
  }
1822
- }
1823
- return ar;
1824
- }
1825
- /** @deprecated */
1826
- function __spread() {
1827
- for (var ar = [], i = 0; i < arguments.length; i++)
1828
- ar = ar.concat(__read(arguments[i]));
1829
- return ar;
1830
- }
1831
- /** @deprecated */
1832
- function __spreadArrays() {
1833
- for (var s = 0, i = 0, il = arguments.length; i < il; i++)
1834
- s += arguments[i].length;
1835
- for (var r = Array(s), k = 0, i = 0; i < il; i++)
1836
- for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)
1837
- r[k] = a[j];
1838
- return r;
1839
- }
1840
- function __spreadArray(to, from, pack) {
1841
- if (pack || arguments.length === 2)
1842
- for (var i = 0, l = from.length, ar; i < l; i++) {
1843
- if (ar || !(i in from)) {
1844
- if (!ar)
1845
- ar = Array.prototype.slice.call(from, 0, i);
1846
- ar[i] = from[i];
1815
+ this.placement = placement !== null && placement !== void 0 ? placement : this.placement;
1816
+ this.alignment = alignment !== null && alignment !== void 0 ? alignment : this.alignment;
1817
+ this.isActive = true;
1818
+ this.contentRef.open(caller, {
1819
+ dismissOnBlur: this.dismissOnBlur,
1820
+ enableAnimations: this.enableAnimations,
1821
+ horizontalAlignment: this.alignment,
1822
+ isStatic: false,
1823
+ placement: this.placement,
1824
+ popoverTitle: this.popoverTitle,
1825
+ popoverType: this.popoverType,
1826
+ });
1827
+ };
1828
+ /**
1829
+ * Closes the popover.
1830
+ * @internal
1831
+ */
1832
+ SkyPopoverComponent.prototype.close = function () {
1833
+ var _a;
1834
+ /*istanbul ignore next*/
1835
+ (_a = this.contentRef) === null || _a === void 0 ? void 0 : _a.close();
1836
+ };
1837
+ /**
1838
+ * Brings focus to the popover element if its open.
1839
+ * @internal
1840
+ */
1841
+ SkyPopoverComponent.prototype.applyFocus = function () {
1842
+ var _a;
1843
+ /*istanbul ignore next*/
1844
+ (_a = this.contentRef) === null || _a === void 0 ? void 0 : _a.applyFocus();
1845
+ };
1846
+ /**
1847
+ * Adds a flag to the popover to close when the mouse leaves the popover's bounds.
1848
+ * @internal
1849
+ */
1850
+ SkyPopoverComponent.prototype.markForCloseOnMouseLeave = function () {
1851
+ this.isMarkedForCloseOnMouseLeave = true;
1852
+ };
1853
+ SkyPopoverComponent.prototype.setupOverlay = function () {
1854
+ var _this = this;
1855
+ var overlay = this.overlayService.create({
1856
+ enableScroll: true,
1857
+ enablePointerEvents: true,
1858
+ });
1859
+ overlay.backdropClick.pipe(operators.takeUntil(this.ngUnsubscribe)).subscribe(function () {
1860
+ if (_this.dismissOnBlur) {
1861
+ _this.close();
1847
1862
  }
1848
- }
1849
- return to.concat(ar || Array.prototype.slice.call(from));
1850
- }
1851
- function __await(v) {
1852
- return this instanceof __await ? (this.v = v, this) : new __await(v);
1853
- }
1854
- function __asyncGenerator(thisArg, _arguments, generator) {
1855
- if (!Symbol.asyncIterator)
1856
- throw new TypeError("Symbol.asyncIterator is not defined.");
1857
- var g = generator.apply(thisArg, _arguments || []), i, q = [];
1858
- return i = {}, verb("next"), verb("throw"), verb("return"), i[Symbol.asyncIterator] = function () { return this; }, i;
1859
- function verb(n) { if (g[n])
1860
- i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }
1861
- function resume(n, v) { try {
1862
- step(g[n](v));
1863
- }
1864
- catch (e) {
1865
- settle(q[0][3], e);
1866
- } }
1867
- function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }
1868
- function fulfill(value) { resume("next", value); }
1869
- function reject(value) { resume("throw", value); }
1870
- function settle(f, v) { if (f(v), q.shift(), q.length)
1871
- resume(q[0][0], q[0][1]); }
1872
- }
1873
- function __asyncDelegator(o) {
1874
- var i, p;
1875
- return i = {}, verb("next"), verb("throw", function (e) { throw e; }), verb("return"), i[Symbol.iterator] = function () { return this; }, i;
1876
- function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: n === "return" } : f ? f(v) : v; } : f; }
1877
- }
1878
- function __asyncValues(o) {
1879
- if (!Symbol.asyncIterator)
1880
- throw new TypeError("Symbol.asyncIterator is not defined.");
1881
- var m = o[Symbol.asyncIterator], i;
1882
- return m ? m.call(o) : (o = typeof __values === "function" ? __values(o) : o[Symbol.iterator](), i = {}, verb("next"), verb("throw"), verb("return"), i[Symbol.asyncIterator] = function () { return this; }, i);
1883
- function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }
1884
- function settle(resolve, reject, d, v) { Promise.resolve(v).then(function (v) { resolve({ value: v, done: d }); }, reject); }
1885
- }
1886
- function __makeTemplateObject(cooked, raw) {
1887
- if (Object.defineProperty) {
1888
- Object.defineProperty(cooked, "raw", { value: raw });
1889
- }
1890
- else {
1891
- cooked.raw = raw;
1892
- }
1893
- return cooked;
1894
- }
1895
- ;
1896
- var __setModuleDefault = Object.create ? (function (o, v) {
1897
- Object.defineProperty(o, "default", { enumerable: true, value: v });
1898
- }) : function (o, v) {
1899
- o["default"] = v;
1900
- };
1901
- function __importStar(mod) {
1902
- if (mod && mod.__esModule)
1903
- return mod;
1904
- var result = {};
1905
- if (mod != null)
1906
- for (var k in mod)
1907
- if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k))
1908
- __createBinding(result, mod, k);
1909
- __setModuleDefault(result, mod);
1910
- return result;
1911
- }
1912
- function __importDefault(mod) {
1913
- return (mod && mod.__esModule) ? mod : { default: mod };
1914
- }
1915
- function __classPrivateFieldGet(receiver, state, kind, f) {
1916
- if (kind === "a" && !f)
1917
- throw new TypeError("Private accessor was defined without a getter");
1918
- if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver))
1919
- throw new TypeError("Cannot read private member from an object whose class did not declare it");
1920
- return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
1921
- }
1922
- function __classPrivateFieldSet(receiver, state, value, kind, f) {
1923
- if (kind === "m")
1924
- throw new TypeError("Private method is not writable");
1925
- if (kind === "a" && !f)
1926
- throw new TypeError("Private accessor was defined without a setter");
1927
- if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver))
1928
- throw new TypeError("Cannot write private member to an object whose class did not declare it");
1929
- return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;
1930
- }
1863
+ });
1864
+ var contentRef = overlay.attachComponent(SkyPopoverContentComponent, [
1865
+ {
1866
+ provide: SkyPopoverContext,
1867
+ useValue: new SkyPopoverContext({
1868
+ contentTemplateRef: this.templateRef,
1869
+ }),
1870
+ },
1871
+ ]);
1872
+ contentRef.opened.pipe(operators.takeUntil(this.ngUnsubscribe)).subscribe(function () {
1873
+ _this.popoverOpened.emit(_this);
1874
+ });
1875
+ contentRef.closed.pipe(operators.takeUntil(this.ngUnsubscribe)).subscribe(function () {
1876
+ /*istanbul ignore else*/
1877
+ if (_this.isActive && _this.overlay) {
1878
+ _this.overlayService.close(_this.overlay);
1879
+ _this.overlay = undefined;
1880
+ _this.isActive = false;
1881
+ _this.popoverClosed.emit(_this);
1882
+ }
1883
+ });
1884
+ contentRef.isMouseEnter
1885
+ .pipe(operators.takeUntil(this.ngUnsubscribe))
1886
+ .subscribe(function (isMouseEnter) {
1887
+ _this.isMouseEnter = isMouseEnter;
1888
+ if (_this.isMarkedForCloseOnMouseLeave) {
1889
+ _this.isMarkedForCloseOnMouseLeave = false;
1890
+ _this.close();
1891
+ }
1892
+ });
1893
+ this.overlay = overlay;
1894
+ this.contentRef = contentRef;
1895
+ };
1896
+ return SkyPopoverComponent;
1897
+ }());
1898
+ SkyPopoverComponent.ɵfac = i0__namespace.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.16", ngImport: i0__namespace, type: SkyPopoverComponent, deps: [{ token: i1__namespace.SkyOverlayService }], target: i0__namespace.ɵɵFactoryTarget.Component });
1899
+ SkyPopoverComponent.ɵcmp = i0__namespace.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.16", 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: i0.TemplateRef, static: true }], ngImport: i0__namespace, template: "<ng-template #templateRef>\n <ng-content></ng-content>\n</ng-template>\n" });
1900
+ i0__namespace.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.16", ngImport: i0__namespace, type: SkyPopoverComponent, decorators: [{
1901
+ type: i0.Component,
1902
+ args: [{
1903
+ selector: 'sky-popover',
1904
+ template: "<ng-template #templateRef>\n <ng-content></ng-content>\n</ng-template>\n",
1905
+ }]
1906
+ }], ctorParameters: function () { return [{ type: i1__namespace.SkyOverlayService }]; }, propDecorators: { alignment: [{
1907
+ type: i0.Input
1908
+ }], dismissOnBlur: [{
1909
+ type: i0.Input
1910
+ }], placement: [{
1911
+ type: i0.Input
1912
+ }], popoverTitle: [{
1913
+ type: i0.Input
1914
+ }], popoverType: [{
1915
+ type: i0.Input
1916
+ }], popoverClosed: [{
1917
+ type: i0.Output
1918
+ }], popoverOpened: [{
1919
+ type: i0.Output
1920
+ }], templateRef: [{
1921
+ type: i0.ViewChild,
1922
+ args: ['templateRef', {
1923
+ read: i0.TemplateRef,
1924
+ static: true,
1925
+ }]
1926
+ }] } });
1931
1927
 
1932
1928
  /**
1933
1929
  * Specifies the type of message to send to the popover component.
@@ -2090,7 +2086,6 @@
2090
2086
  SkyPopoverDirective.prototype.removeEventListeners = function () {
2091
2087
  this.ngUnsubscribe.next();
2092
2088
  this.ngUnsubscribe.complete();
2093
- this.ngUnsubscribe = undefined;
2094
2089
  };
2095
2090
  SkyPopoverDirective.prototype.handleIncomingMessages = function (message) {
2096
2091
  /* tslint:disable-next-line:switch-default */