@kirbydesign/designsystem 3.0.15 → 4.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (66) hide show
  1. package/bundles/kirbydesign-designsystem-testing-base.umd.js +44 -15
  2. package/bundles/kirbydesign-designsystem-testing-base.umd.js.map +1 -1
  3. package/bundles/kirbydesign-designsystem-testing-base.umd.min.js +1 -1
  4. package/bundles/kirbydesign-designsystem-testing-base.umd.min.js.map +1 -1
  5. package/bundles/kirbydesign-designsystem.umd.js +280 -63
  6. package/bundles/kirbydesign-designsystem.umd.js.map +1 -1
  7. package/bundles/kirbydesign-designsystem.umd.min.js +1 -1
  8. package/bundles/kirbydesign-designsystem.umd.min.js.map +1 -1
  9. package/esm2015/kirbydesign-designsystem.js +18 -16
  10. package/esm2015/kirbydesign-designsystem.metadata.json +1 -1
  11. package/esm2015/lib/components/card/card.component.js +1 -1
  12. package/esm2015/lib/components/card/card.component.metadata.json +1 -1
  13. package/esm2015/lib/components/dropdown/dropdown.component.js +53 -59
  14. package/esm2015/lib/components/dropdown/dropdown.component.metadata.json +1 -1
  15. package/esm2015/lib/components/dropdown/dropdown.types.js +12 -0
  16. package/esm2015/lib/components/dropdown/dropdown.types.metadata.json +1 -0
  17. package/esm2015/lib/components/dropdown/keyboard-handler.service.js +43 -0
  18. package/esm2015/lib/components/dropdown/keyboard-handler.service.metadata.json +1 -0
  19. package/esm2015/lib/components/index.js +3 -2
  20. package/esm2015/lib/components/index.metadata.json +1 -1
  21. package/esm2015/lib/components/item/item.component.js +1 -1
  22. package/esm2015/lib/components/item/item.component.metadata.json +1 -1
  23. package/esm2015/lib/components/popover/popover.component.js +156 -0
  24. package/esm2015/lib/components/popover/popover.component.metadata.json +1 -0
  25. package/esm2015/lib/components/tabs/index.js +2 -2
  26. package/esm2015/lib/components/tabs/index.metadata.json +1 -1
  27. package/esm2015/lib/components/tabs/tabs.service.js +3 -1
  28. package/esm2015/lib/components/tabs/tabs.service.metadata.json +1 -1
  29. package/esm2015/lib/helpers/design-token-helper.js +4 -1
  30. package/esm2015/lib/helpers/design-token-helper.metadata.json +1 -1
  31. package/esm2015/lib/helpers/design-token-helper.styles.js +2 -1
  32. package/esm2015/lib/helpers/design-token-helper.styles.metadata.json +1 -1
  33. package/esm2015/lib/kirby.module.js +3 -1
  34. package/esm2015/lib/kirby.module.metadata.json +1 -1
  35. package/esm2015/testing-base/kirbydesign-designsystem-testing-base.js +17 -16
  36. package/esm2015/testing-base/kirbydesign-designsystem-testing-base.metadata.json +1 -1
  37. package/esm2015/testing-base/lib/components/mock.dropdown.component.js +2 -1
  38. package/esm2015/testing-base/lib/components/mock.dropdown.component.metadata.json +1 -1
  39. package/esm2015/testing-base/lib/components/mock.popover.component.js +27 -0
  40. package/esm2015/testing-base/lib/components/mock.popover.component.metadata.json +1 -0
  41. package/esm2015/testing-base/lib/mock-components.js +3 -1
  42. package/esm2015/testing-base/lib/mock-components.metadata.json +1 -1
  43. package/fesm2015/kirbydesign-designsystem-testing-base.js +29 -2
  44. package/fesm2015/kirbydesign-designsystem-testing-base.js.map +1 -1
  45. package/fesm2015/kirbydesign-designsystem.js +252 -50
  46. package/fesm2015/kirbydesign-designsystem.js.map +1 -1
  47. package/kirbydesign-designsystem.d.ts +17 -15
  48. package/kirbydesign-designsystem.metadata.json +1 -1
  49. package/lib/components/dropdown/dropdown.component.d.ts +13 -14
  50. package/lib/components/dropdown/dropdown.types.d.ts +9 -0
  51. package/lib/components/dropdown/keyboard-handler.service.d.ts +3 -0
  52. package/lib/components/index.d.ts +2 -1
  53. package/lib/components/popover/popover.component.d.ts +34 -0
  54. package/lib/components/tabs/index.d.ts +1 -1
  55. package/lib/components/tabs/tabs.service.d.ts +1 -0
  56. package/lib/helpers/design-token-helper.d.ts +1 -0
  57. package/lib/helpers/design-token-helper.styles.d.ts +1 -0
  58. package/package.json +1 -1
  59. package/scss/_global-styles.scss +3 -1
  60. package/scss/base/_functions.scss +15 -0
  61. package/scss/base/_list.scss +82 -0
  62. package/scss/base/_variables.scss +1 -0
  63. package/testing-base/kirbydesign-designsystem-testing-base.d.ts +16 -15
  64. package/testing-base/kirbydesign-designsystem-testing-base.metadata.json +1 -1
  65. package/testing-base/lib/components/mock.dropdown.component.d.ts +1 -0
  66. package/testing-base/lib/components/mock.popover.component.d.ts +7 -0
@@ -1,6 +1,6 @@
1
1
  import { Component, Input, EventEmitter, Output, Injectable, ɵɵdefineInjectable, ElementRef, ViewChild, ɵɵinject, InjectionToken, Injector, HostListener, Optional, Inject, HostBinding, ContentChild, NgZone, RendererStyleFlags2, Renderer2, ComponentFactoryResolver, ViewChildren, NgModule, ChangeDetectionStrategy, LOCALE_ID, Directive, forwardRef, ChangeDetectorRef, TemplateRef, ContentChildren, INJECTOR, Pipe, SkipSelf, ViewContainerRef } from '@angular/core';
2
2
  import { ModalController as ModalController$1, IonContent, IonHeader, IonToolbar, IonTitle, AnimationController, IonApp, IonicModule, IonRadio, IonFabButton, LoadingController, IonItemSliding, IonTabs, IonFooter, ToastController as ToastController$1 } from '@ionic/angular';
3
- export { NavController } from '@ionic/angular';
3
+ export { IonRouterOutlet, NavController } from '@ionic/angular';
4
4
  import { NavigationEnd, Router, ActivatedRoute, RouterOutlet, ROUTES, NavigationStart, RouterModule } from '@angular/router';
5
5
  import { of, EMPTY, Subject, merge, fromEvent, ReplaySubject } from 'rxjs';
6
6
  import { filter, first, startWith, map, pairwise, debounceTime, takeUntil } from 'rxjs/operators';
@@ -55,6 +55,7 @@ const styles = {
55
55
  default: '1',
56
56
  segmentBadge: '2',
57
57
  dropdown: '800',
58
+ popover: '850',
58
59
  modalOverlay: '900',
59
60
  modal: '901',
60
61
  loadingOverlay: '1001',
@@ -1114,6 +1115,9 @@ class DesignTokenHelper {
1114
1115
  static itemHeight(key) {
1115
1116
  return styles.itemHeights[key];
1116
1117
  }
1118
+ static zLayer(key) {
1119
+ return styles.zLayers[key];
1120
+ }
1117
1121
  }
1118
1122
  DesignTokenHelper.breakpoints = styles.breakpoints;
1119
1123
  DesignTokenHelper.softKeyboardTransitionEnter = styles.softKeyboardTransitionEnter;
@@ -2628,7 +2632,7 @@ CardComponent.decorators = [
2628
2632
  { type: Component, args: [{
2629
2633
  selector: 'kirby-card',
2630
2634
  template: "<ng-content select=\"kirby-card-header\"></ng-content>\n<div class=\"content-wrapper\" [class.padding]=\"hasPadding\">\n <ng-content></ng-content>\n</div>\n<ng-content select=\"kirby-card-footer\"></ng-content>\n",
2631
- styles: [":host{--kirby-card-main-background-color:var(--kirby-white);--kirby-card-main-color:var(--kirby-white-contrast);--kirby-card-footer-background-color:var(--kirby-white);--kirby-card-footer-color:var(--kirby-white-contrast);border-radius:16px;box-shadow:0 5px 10px -10px rgba(28,28,28,.3),0 0 5px 0 rgba(28,28,28,.08);color:var(--kirby-card-main-color);background-color:var(--kirby-card-main-background-color);display:flex;flex-direction:column;justify-content:space-between;overflow:hidden;position:relative;z-index:1}:host .content-wrapper.padding{padding:16px}:host.highlighted{box-shadow:0 10px 15px -10px rgba(28,28,28,.3),0 0 5px 0 rgba(28,28,28,.08)}:host.flat{box-shadow:none}:host-context(.swiper-slide-active){box-shadow:0 10px 15px -10px rgba(28,28,28,.3),0 0 5px 0 rgba(28,28,28,.08);transition:all .5s;transform:translateY(-3px)}:host(.primary){--kirby-card-main-background-color:var(--kirby-primary);--kirby-card-main-color:var(--kirby-primary-contrast)}:host(.secondary){--kirby-card-main-background-color:var(--kirby-secondary);--kirby-card-main-color:var(--kirby-secondary-contrast)}:host(.tertiary){--kirby-card-main-background-color:var(--kirby-tertiary);--kirby-card-main-color:var(--kirby-tertiary-contrast)}:host(.success){--kirby-card-main-background-color:var(--kirby-success);--kirby-card-main-color:var(--kirby-success-contrast)}:host(.warning){--kirby-card-main-background-color:var(--kirby-warning);--kirby-card-main-color:var(--kirby-warning-contrast)}:host(.danger){--kirby-card-main-background-color:var(--kirby-danger);--kirby-card-main-color:var(--kirby-danger-contrast)}:host(.light){--kirby-card-main-background-color:var(--kirby-light);--kirby-card-main-color:var(--kirby-light-contrast)}:host(.medium){--kirby-card-main-background-color:var(--kirby-medium);--kirby-card-main-color:var(--kirby-medium-contrast)}:host(.dark){--kirby-card-main-background-color:var(--kirby-dark);--kirby-card-main-color:var(--kirby-dark-contrast)}"]
2635
+ styles: [":host{--kirby-card-main-background-color:var(--kirby-white);--kirby-card-main-color:var(--kirby-white-contrast);--kirby-card-footer-background-color:var(--kirby-white);--kirby-card-footer-color:var(--kirby-white-contrast);border-radius:16px;box-shadow:0 5px 10px -10px rgba(28,28,28,.3),0 0 5px 0 rgba(28,28,28,.08);color:var(--kirby-card-main-color);background-color:var(--kirby-card-main-background-color);display:flex;flex-direction:column;justify-content:space-between;overflow:hidden;position:relative;z-index:1;width:var(--kirby-card-width,auto)}:host .content-wrapper.padding{padding:16px}:host.highlighted{box-shadow:0 10px 15px -10px rgba(28,28,28,.3),0 0 5px 0 rgba(28,28,28,.08)}:host.flat{box-shadow:none}:host-context(.swiper-slide-active){box-shadow:0 10px 15px -10px rgba(28,28,28,.3),0 0 5px 0 rgba(28,28,28,.08);transition:all .5s;transform:translateY(-3px)}:host(.primary){--kirby-card-main-background-color:var(--kirby-primary);--kirby-card-main-color:var(--kirby-primary-contrast)}:host(.secondary){--kirby-card-main-background-color:var(--kirby-secondary);--kirby-card-main-color:var(--kirby-secondary-contrast)}:host(.tertiary){--kirby-card-main-background-color:var(--kirby-tertiary);--kirby-card-main-color:var(--kirby-tertiary-contrast)}:host(.success){--kirby-card-main-background-color:var(--kirby-success);--kirby-card-main-color:var(--kirby-success-contrast)}:host(.warning){--kirby-card-main-background-color:var(--kirby-warning);--kirby-card-main-color:var(--kirby-warning-contrast)}:host(.danger){--kirby-card-main-background-color:var(--kirby-danger);--kirby-card-main-color:var(--kirby-danger-contrast)}:host(.light){--kirby-card-main-background-color:var(--kirby-light);--kirby-card-main-color:var(--kirby-light-contrast)}:host(.medium){--kirby-card-main-background-color:var(--kirby-medium);--kirby-card-main-color:var(--kirby-medium-contrast)}:host(.dark){--kirby-card-main-background-color:var(--kirby-dark);--kirby-card-main-color:var(--kirby-dark-contrast)}"]
2632
2636
  },] }
2633
2637
  ];
2634
2638
  /** @nocollapse */
@@ -4875,7 +4879,7 @@ ItemComponent.decorators = [
4875
4879
  { type: Component, args: [{
4876
4880
  selector: 'kirby-item',
4877
4881
  template: "<ion-item\n lines=\"none\"\n [attr.disabled]=\"disabled\"\n [attr.button]=\"selectable ? true : null\"\n [attr.tabindex]=\"selectable ? null : 0\"\n detail=\"false\"\n (mousedown)=\"onMouseDown($event)\"\n>\n <div class=\"outside\" slot=\"start\">\n <ng-content select=\"[slot='outside']\"></ng-content>\n </div>\n <ng-content></ng-content>\n <ion-reorder slot=\"end\" *ngIf=\"reorderable\">\n <kirby-icon name=\"reorder\"></kirby-icon>\n </ion-reorder>\n</ion-item>\n",
4878
- styles: [":host{display:block;position:relative}:host ion-item{font-size:14px;--min-height:56px;--padding-start:16px;--inner-padding-top:8px;--inner-padding-bottom:8px;--inner-padding-end:16px;--background:var(--kirby-item-background,var(--kirby-white));--background-activated:var(--kirby-item-background-activated,var(--kirby-white-shade));--background-activated-opacity:0.99;--background-focused:var(--kirby-item-background-focused,var(--kirby-background-color));--background-focused-opacity:1;--background-hover:var(--kirby-item-background-hover,var(--kirby-background-color));--background-hover-opacity:1}@media screen and (orientation:landscape){:host ion-item{--ion-safe-area-left:0px;--ion-safe-area-right:0px}}:host ion-item ::ng-deep>[slot=end]{margin-inline-start:0;margin-inline-end:0;text-align:right}:host ion-item ::ng-deep>time[slot=end]{margin-inline-start:12px}:host ion-item ::ng-deep>[detail][slot=end],:host ion-item ::ng-deep>data[slot=end],:host ion-item ::ng-deep>ion-reorder[slot=end]{margin-inline-start:16px}:host ion-item ::ng-deep>data,:host ion-item ::ng-deep>h1,:host ion-item ::ng-deep>h2,:host ion-item ::ng-deep>h3,:host ion-item ::ng-deep>h4,:host ion-item ::ng-deep>h5,:host ion-item ::ng-deep>h6,:host ion-item ::ng-deep>p{font-size:16px;line-height:24px;color:var(--kirby-text-color-black);display:block;margin:0;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;font-weight:400}:host ion-item ::ng-deep>data.kirby-text-bold,:host ion-item ::ng-deep>h1.kirby-text-bold,:host ion-item ::ng-deep>h2.kirby-text-bold,:host ion-item ::ng-deep>h3.kirby-text-bold,:host ion-item ::ng-deep>h4.kirby-text-bold,:host ion-item ::ng-deep>h5.kirby-text-bold,:host ion-item ::ng-deep>h6.kirby-text-bold,:host ion-item ::ng-deep>p.kirby-text-bold{font-weight:700}:host ion-item ::ng-deep>p{font-size:14px}:host ion-item ::ng-deep>[detail],:host ion-item ::ng-deep>[subtitle]{font-size:12px;line-height:16px}:host ion-item ::ng-deep>[subtitle]:not(:last-child){margin-bottom:4px}:host ion-item ::ng-deep>[detail]{color:var(--kirby-text-color-semi-dark)}:host ion-item ::ng-deep>:not([slot]){width:100%}:host ion-item ::ng-deep>input[slot=end],:host ion-item ::ng-deep>kirby-form-field[slot=end] input{margin-inline-start:16px;width:auto;text-align:right}:host.sm ion-item{--min-height:44px}:host.xs ion-item{--min-height:32px;--inner-padding-top:4px;--inner-padding-bottom:4px}:host .outside{left:4px;margin:0;position:absolute;width:16px;z-index:1}:host-context(kirby-dropdown) ion-item{--min-height:44px}:host-context(kirby-list-item:first-of-type) ion-item{--padding-top:8px}:host-context(kirby-list-item:first-of-type kirby-card) ion-item{--padding-top:0}:host-context(kirby-list-item:last-of-type) ion-item{--padding-bottom:8px}:host-context(kirby-list-item:last-of-type kirby-card) ion-item{--padding-bottom:0}:host(.selected) ion-item ::ng-deep>data,:host(.selected) ion-item ::ng-deep>h1,:host(.selected) ion-item ::ng-deep>h2,:host(.selected) ion-item ::ng-deep>h3,:host(.selected) ion-item ::ng-deep>h4,:host(.selected) ion-item ::ng-deep>h5,:host(.selected) ion-item ::ng-deep>h6,:host(.selected) ion-item ::ng-deep>p,:host-context(kirby-list .selected) ion-item ::ng-deep>data,:host-context(kirby-list .selected) ion-item ::ng-deep>h1,:host-context(kirby-list .selected) ion-item ::ng-deep>h2,:host-context(kirby-list .selected) ion-item ::ng-deep>h3,:host-context(kirby-list .selected) ion-item ::ng-deep>h4,:host-context(kirby-list .selected) ion-item ::ng-deep>h5,:host-context(kirby-list .selected) ion-item ::ng-deep>h6,:host-context(kirby-list .selected) ion-item ::ng-deep>p{font-weight:700}:host-context(.shape-rounded .is-single) ion-item{--border-radius:16px}:host-context(.has-header .is-single) ion-item::part(native){border-top-left-radius:0;border-top-right-radius:0}:host-context(.has-footer .is-single) ion-item::part(native){border-bottom-left-radius:0;border-bottom-right-radius:0}:host-context(.shape-rounded.has-sections .list-items kirby-list-item:first-of-type) ion-item::part(native){border-top-left-radius:16px;border-top-right-radius:16px}"]
4882
+ styles: [":host{display:block;position:relative}:host ion-item{font-size:14px;--min-height:56px;--padding-start:16px;--inner-padding-top:8px;--inner-padding-bottom:8px;--inner-padding-end:16px;--background:var(--kirby-item-background,var(--kirby-white));--background-activated:var(--kirby-item-background-activated,var(--kirby-white-shade));--background-activated-opacity:0.99;--background-focused:var(--kirby-item-background-focused,var(--kirby-background-color));--background-focused-opacity:1;--background-hover:var(--kirby-item-background-hover,var(--kirby-background-color));--background-hover-opacity:1}@media screen and (orientation:landscape){:host ion-item{--ion-safe-area-left:0px;--ion-safe-area-right:0px}}:host ion-item ::ng-deep>[slot=end]{margin-inline-start:0;margin-inline-end:0;text-align:right}:host ion-item ::ng-deep>time[slot=end]{margin-inline-start:12px}:host ion-item ::ng-deep>[detail][slot=end],:host ion-item ::ng-deep>data[slot=end],:host ion-item ::ng-deep>ion-reorder[slot=end]{margin-inline-start:16px}:host ion-item ::ng-deep>data,:host ion-item ::ng-deep>h1,:host ion-item ::ng-deep>h2,:host ion-item ::ng-deep>h3,:host ion-item ::ng-deep>h4,:host ion-item ::ng-deep>h5,:host ion-item ::ng-deep>h6,:host ion-item ::ng-deep>p{font-size:16px;line-height:24px;color:var(--kirby-text-color-black);display:block;margin:0;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;font-weight:400}:host ion-item ::ng-deep>data.kirby-text-bold,:host ion-item ::ng-deep>h1.kirby-text-bold,:host ion-item ::ng-deep>h2.kirby-text-bold,:host ion-item ::ng-deep>h3.kirby-text-bold,:host ion-item ::ng-deep>h4.kirby-text-bold,:host ion-item ::ng-deep>h5.kirby-text-bold,:host ion-item ::ng-deep>h6.kirby-text-bold,:host ion-item ::ng-deep>p.kirby-text-bold{font-weight:700}:host ion-item ::ng-deep>p{font-size:14px}:host ion-item ::ng-deep>[detail],:host ion-item ::ng-deep>[subtitle]{font-size:12px;line-height:16px}:host ion-item ::ng-deep>[subtitle]:not(:last-child){margin-bottom:4px}:host ion-item ::ng-deep>[detail]{color:var(--kirby-text-color-semi-dark)}:host ion-item ::ng-deep>:not([slot]){width:100%}:host ion-item ::ng-deep>input[slot=end],:host ion-item ::ng-deep>kirby-form-field[slot=end] input{margin-inline-start:16px;width:auto;text-align:right}:host.sm ion-item{--min-height:44px}:host.xs ion-item{--min-height:32px;--inner-padding-top:4px;--inner-padding-bottom:4px}:host .outside{left:4px;margin:0;position:absolute;width:16px;z-index:1}:host-context(kirby-dropdown) ion-item,:host-context(kirby-popover) ion-item{--min-height:44px}:host-context(kirby-list-item:first-of-type) ion-item{--padding-top:8px}:host-context(kirby-list-item:first-of-type kirby-card) ion-item{--padding-top:0}:host-context(kirby-list-item:last-of-type) ion-item{--padding-bottom:8px}:host-context(kirby-list-item:last-of-type kirby-card) ion-item{--padding-bottom:0}:host(.selected) ion-item ::ng-deep>data,:host(.selected) ion-item ::ng-deep>h1,:host(.selected) ion-item ::ng-deep>h2,:host(.selected) ion-item ::ng-deep>h3,:host(.selected) ion-item ::ng-deep>h4,:host(.selected) ion-item ::ng-deep>h5,:host(.selected) ion-item ::ng-deep>h6,:host(.selected) ion-item ::ng-deep>p,:host-context(kirby-list .selected) ion-item ::ng-deep>data,:host-context(kirby-list .selected) ion-item ::ng-deep>h1,:host-context(kirby-list .selected) ion-item ::ng-deep>h2,:host-context(kirby-list .selected) ion-item ::ng-deep>h3,:host-context(kirby-list .selected) ion-item ::ng-deep>h4,:host-context(kirby-list .selected) ion-item ::ng-deep>h5,:host-context(kirby-list .selected) ion-item ::ng-deep>h6,:host-context(kirby-list .selected) ion-item ::ng-deep>p{font-weight:700}:host-context(.shape-rounded .is-single) ion-item{--border-radius:16px}:host-context(.has-header .is-single) ion-item::part(native){border-top-left-radius:0;border-top-right-radius:0}:host-context(.has-footer .is-single) ion-item::part(native){border-bottom-left-radius:0;border-bottom-right-radius:0}:host-context(.shape-rounded.has-sections .list-items kirby-list-item:first-of-type) ion-item::part(native){border-top-left-radius:16px;border-top-right-radius:16px}"]
4879
4883
  },] }
4880
4884
  ];
4881
4885
  ItemComponent.propDecorators = {
@@ -4939,27 +4943,219 @@ ListFooterDirective.decorators = [
4939
4943
  },] }
4940
4944
  ];
4941
4945
 
4946
+ var HorizontalDirection;
4947
+ (function (HorizontalDirection) {
4948
+ HorizontalDirection["right"] = "right";
4949
+ HorizontalDirection["left"] = "left";
4950
+ })(HorizontalDirection || (HorizontalDirection = {}));
4951
+ class PopoverComponent {
4952
+ constructor(elementRef, renderer) {
4953
+ this.elementRef = elementRef;
4954
+ this.renderer = renderer;
4955
+ // removeEventListener same instance of event handler & options
4956
+ this.preventScrollEventListenerOptions = {
4957
+ passive: false,
4958
+ };
4959
+ this.POPOVER_BODY_PADDING = 12;
4960
+ this.isShowing = false;
4961
+ this.popout = HorizontalDirection.right;
4962
+ this.willHide = new EventEmitter();
4963
+ this.document = elementRef.nativeElement.ownerDocument;
4964
+ }
4965
+ get targetElement() {
4966
+ if (this.target instanceof ElementRef) {
4967
+ return this.target.nativeElement;
4968
+ }
4969
+ else {
4970
+ return this.target;
4971
+ }
4972
+ }
4973
+ _backdropClick() {
4974
+ this.willHide.emit();
4975
+ this.hide();
4976
+ }
4977
+ _onWindowResize() {
4978
+ if (this.isShowing) {
4979
+ this.willHide.emit();
4980
+ this.hide();
4981
+ }
4982
+ }
4983
+ ngAfterViewInit() {
4984
+ this.placePopoverAboveClosestModal();
4985
+ this.renderer.removeChild(this.elementRef.nativeElement.parentElement, this.elementRef.nativeElement);
4986
+ }
4987
+ ngOnDestroy() {
4988
+ this.hide();
4989
+ }
4990
+ placePopoverAboveClosestModal() {
4991
+ const closestIonModal = this.elementRef.nativeElement.closest('ion-modal');
4992
+ if (closestIonModal) {
4993
+ this.zIndex = parseInt(closestIonModal.style.zIndex) + 1;
4994
+ this.elementRef.nativeElement.style.zIndex = `${this.zIndex}`;
4995
+ }
4996
+ else {
4997
+ this.zIndex = parseInt(DesignTokenHelper.zLayer('popover'));
4998
+ }
4999
+ }
5000
+ // document.removeEventListener needs the exact same event handler & options reference:
5001
+ preventEvent(event) {
5002
+ event.preventDefault();
5003
+ }
5004
+ preventScroll() {
5005
+ this.isFirstToLockScroll = !this.document.body.classList.contains('backdrop-no-scroll');
5006
+ if (this.isFirstToLockScroll) {
5007
+ this.renderer.addClass(this.document.body, 'backdrop-no-scroll');
5008
+ }
5009
+ // preventDefault does not work with Renderer2.listen method; add event listener directly to document instead
5010
+ this.document.addEventListener('touchmove', this.preventEvent, this.preventScrollEventListenerOptions);
5011
+ }
5012
+ releaseScroll() {
5013
+ if (this.isFirstToLockScroll) {
5014
+ this.renderer.removeClass(this.document.body, 'backdrop-no-scroll');
5015
+ }
5016
+ this.document.removeEventListener('touchmove', this.preventEvent, this.preventScrollEventListenerOptions);
5017
+ }
5018
+ show() {
5019
+ this.renderer.addClass(this.elementRef.nativeElement, 'is-opening');
5020
+ this.renderer.appendChild(this.document.body, this.elementRef.nativeElement);
5021
+ this.preventScroll();
5022
+ this.positionWrapper();
5023
+ this.renderer.addClass(this.elementRef.nativeElement, 'is-open');
5024
+ this.renderer.removeClass(this.elementRef.nativeElement, 'is-opening');
5025
+ this.isShowing = true;
5026
+ }
5027
+ hide() {
5028
+ this.renderer.removeChild(this.document.body, this.elementRef.nativeElement);
5029
+ this.releaseScroll();
5030
+ this.renderer.removeStyle(this.targetElement, 'z-index');
5031
+ this.renderer.removeStyle(this.targetElement, 'pointer-events');
5032
+ this.isShowing = false;
5033
+ }
5034
+ positionWrapper() {
5035
+ const targetDimensions = this.targetElement.getBoundingClientRect();
5036
+ this.renderer.appendChild(this.document.body, this.elementRef.nativeElement);
5037
+ const wrapperElement = this.wrapperElement.nativeElement;
5038
+ const wrapperDimensions = wrapperElement.getBoundingClientRect();
5039
+ const viewport = wrapperElement.ownerDocument.defaultView;
5040
+ this.positionHorizontally(viewport, wrapperElement, targetDimensions, wrapperDimensions);
5041
+ this.positionVertically(viewport, wrapperElement, targetDimensions, wrapperDimensions);
5042
+ }
5043
+ positionHorizontally(viewPort, wrapperElement, targetDimensions, wrapperDimensions) {
5044
+ const viewPortWidth = viewPort.innerWidth;
5045
+ const contentWidth = wrapperDimensions.width;
5046
+ const availableSpaceRight = viewPortWidth - targetDimensions.left;
5047
+ const availableSpaceLeft = targetDimensions.right;
5048
+ const contentCanFitRightOfTarget = availableSpaceRight >= contentWidth + this.POPOVER_BODY_PADDING;
5049
+ const openRight = contentCanFitRightOfTarget || availableSpaceRight >= availableSpaceLeft;
5050
+ const [direction, oppositeDirection] = this.popout === HorizontalDirection.left || !openRight
5051
+ ? ['left', 'right']
5052
+ : ['right', 'left'];
5053
+ const pxValue = direction === 'left' ? viewPortWidth - targetDimensions.right : targetDimensions.left;
5054
+ this.renderer.removeStyle(wrapperElement, direction);
5055
+ this.renderer.setStyle(wrapperElement, oppositeDirection, `${pxValue}px`);
5056
+ }
5057
+ positionVertically(viewPort, wrapperElement, targetDimensions, wrapperDimensions) {
5058
+ const viewPortHeight = viewPort.innerHeight;
5059
+ const contentHeight = wrapperDimensions.height;
5060
+ const availableSpaceDown = viewPortHeight - targetDimensions.bottom;
5061
+ const availableSpaceUp = targetDimensions.top;
5062
+ const contentCanFitBelowTarget = availableSpaceDown >= contentHeight + this.POPOVER_BODY_PADDING;
5063
+ const isAvailableSpaceBelow = contentCanFitBelowTarget || availableSpaceDown >= availableSpaceUp;
5064
+ const [direction, oppositeDirection] = isAvailableSpaceBelow
5065
+ ? ['bottom', 'top']
5066
+ : ['top', 'bottom'];
5067
+ const pxValue = direction === 'bottom' ? targetDimensions.bottom : viewPortHeight - targetDimensions.top;
5068
+ this.renderer.removeStyle(wrapperElement, direction);
5069
+ this.renderer.setStyle(wrapperElement, oppositeDirection, `${pxValue}px`);
5070
+ if (direction === 'top') {
5071
+ // Ensure target is elevated above shadows in popover, i.e. content wrapped in Card:
5072
+ this.renderer.setStyle(this.targetElement, 'z-index', `${this.zIndex + 1}`);
5073
+ this.renderer.setStyle(this.targetElement, 'pointer-events', 'none');
5074
+ }
5075
+ }
5076
+ }
5077
+ PopoverComponent.decorators = [
5078
+ { type: Component, args: [{
5079
+ selector: 'kirby-popover',
5080
+ template: `
5081
+ <div #wrapper class="wrapper"><ng-content></ng-content></div>
5082
+ `,
5083
+ styles: [":host{display:none;position:fixed;top:0;right:0;bottom:0;left:0;z-index:850}:host(.is-opening){display:block;visibility:hidden}:host(.is-open){display:block}.wrapper{position:fixed;margin-top:4px;margin-bottom:4px}"]
5084
+ },] }
5085
+ ];
5086
+ /** @nocollapse */
5087
+ PopoverComponent.ctorParameters = () => [
5088
+ { type: ElementRef },
5089
+ { type: Renderer2 }
5090
+ ];
5091
+ PopoverComponent.propDecorators = {
5092
+ wrapperElement: [{ type: ViewChild, args: ['wrapper', { static: true, read: ElementRef },] }],
5093
+ popout: [{ type: Input }],
5094
+ target: [{ type: Input }],
5095
+ willHide: [{ type: Output }],
5096
+ _backdropClick: [{ type: HostListener, args: ['click',] }],
5097
+ _onWindowResize: [{ type: HostListener, args: ['window:resize',] }]
5098
+ };
5099
+
4942
5100
  var OpenState;
4943
5101
  (function (OpenState) {
4944
5102
  OpenState[OpenState["closed"] = 0] = "closed";
4945
5103
  OpenState[OpenState["opening"] = 1] = "opening";
4946
5104
  OpenState[OpenState["open"] = 2] = "open";
4947
5105
  })(OpenState || (OpenState = {}));
4948
- var HorizontalDirection;
4949
- (function (HorizontalDirection) {
4950
- HorizontalDirection["right"] = "right";
4951
- HorizontalDirection["left"] = "left";
4952
- })(HorizontalDirection || (HorizontalDirection = {}));
4953
5106
  var VerticalDirection;
4954
5107
  (function (VerticalDirection) {
4955
5108
  VerticalDirection[VerticalDirection["up"] = 0] = "up";
4956
5109
  VerticalDirection[VerticalDirection["down"] = 1] = "down";
4957
5110
  })(VerticalDirection || (VerticalDirection = {}));
5111
+
5112
+ class KeyboardHandlerService {
5113
+ handle(event, items, selectedIndex) {
5114
+ let newIndex = -1;
5115
+ switch (event.key) {
5116
+ case 'ArrowUp':
5117
+ case 'ArrowLeft':
5118
+ // Select previous item:
5119
+ newIndex = selectedIndex - 1;
5120
+ break;
5121
+ case 'ArrowDown':
5122
+ case 'ArrowRight':
5123
+ if (selectedIndex === undefined) {
5124
+ // None selected, select first item:
5125
+ newIndex = 0;
5126
+ }
5127
+ else if (selectedIndex < items.length - 1) {
5128
+ // Select next item:
5129
+ newIndex = selectedIndex + 1;
5130
+ }
5131
+ break;
5132
+ case 'Home':
5133
+ // Select first item:
5134
+ newIndex = 0;
5135
+ break;
5136
+ case 'End':
5137
+ // Select last item:
5138
+ newIndex = items.length - 1;
5139
+ break;
5140
+ default:
5141
+ break;
5142
+ }
5143
+ return newIndex;
5144
+ }
5145
+ }
5146
+ /** @nocollapse */ KeyboardHandlerService.ɵprov = ɵɵdefineInjectable({ factory: function KeyboardHandlerService_Factory() { return new KeyboardHandlerService(); }, token: KeyboardHandlerService, providedIn: "root" });
5147
+ KeyboardHandlerService.decorators = [
5148
+ { type: Injectable, args: [{
5149
+ providedIn: 'root',
5150
+ },] }
5151
+ ];
5152
+
4958
5153
  class DropdownComponent {
4959
- constructor(renderer, elementRef, changeDetectorRef) {
5154
+ constructor(renderer, elementRef, changeDetectorRef, keyboardHandlerService) {
4960
5155
  this.renderer = renderer;
4961
5156
  this.elementRef = elementRef;
4962
5157
  this.changeDetectorRef = changeDetectorRef;
5158
+ this.keyboardHandlerService = keyboardHandlerService;
4963
5159
  this.state = OpenState.closed;
4964
5160
  this.hasConfiguredSlottedItems = false;
4965
5161
  this.horizontalDirection = HorizontalDirection.right;
@@ -4973,6 +5169,7 @@ class DropdownComponent {
4973
5169
  this.disabled = false;
4974
5170
  this.size = 'md';
4975
5171
  this.tabindex = 0;
5172
+ this.usePopover = false;
4976
5173
  /**
4977
5174
  * Emitted when an item is selected (tap on mobile, click/keypress on web)
4978
5175
  */
@@ -5065,10 +5262,25 @@ class DropdownComponent {
5065
5262
  this.hasConfiguredSlottedItems = true;
5066
5263
  }
5067
5264
  }
5265
+ /* Utility that makes it easier to set styles on card element
5266
+ when using popover*/
5267
+ setPopoverCardStyle(style, value) {
5268
+ if (!this.usePopover)
5269
+ return;
5270
+ this.renderer.setStyle(this.cardElement.nativeElement, style, value, RendererStyleFlags2.DashCase);
5271
+ }
5068
5272
  ngAfterViewInit() {
5273
+ if (this.usePopover && this.expand === 'block') {
5274
+ const { width } = this.elementRef.nativeElement.getBoundingClientRect();
5275
+ this.setPopoverCardStyle('--kirby-card-width', `${width}px`);
5276
+ this.setPopoverCardStyle('max-width', 'initial');
5277
+ this.setPopoverCardStyle('min-width', 'initial');
5278
+ }
5069
5279
  this.initializeAlignment();
5070
5280
  }
5071
5281
  initializeAlignment() {
5282
+ if (this.usePopover)
5283
+ return;
5072
5284
  if (!this.intersectionObserverRef) {
5073
5285
  const options = {
5074
5286
  rootMargin: '0px',
@@ -5135,13 +5347,16 @@ class DropdownComponent {
5135
5347
  }
5136
5348
  }
5137
5349
  showDropdown() {
5350
+ var _a;
5138
5351
  if (this.state === OpenState.opening) {
5139
5352
  this.state = OpenState.open;
5353
+ (_a = this.popover) === null || _a === void 0 ? void 0 : _a.show();
5140
5354
  this.scrollItemIntoView(this.selectedIndex);
5141
5355
  this.changeDetectorRef.markForCheck();
5142
5356
  }
5143
5357
  }
5144
5358
  close() {
5359
+ var _a;
5145
5360
  if (this.disabled) {
5146
5361
  return;
5147
5362
  }
@@ -5149,6 +5364,7 @@ class DropdownComponent {
5149
5364
  this.state = OpenState.closed;
5150
5365
  // Reset vertical direction to default
5151
5366
  this.verticalDirection = VerticalDirection.down;
5367
+ (_a = this.popover) === null || _a === void 0 ? void 0 : _a.hide();
5152
5368
  }
5153
5369
  }
5154
5370
  onItemSelect(index) {
@@ -5249,12 +5465,17 @@ class DropdownComponent {
5249
5465
  this.elementRef.nativeElement.blur();
5250
5466
  }
5251
5467
  }
5252
- _onBlur() {
5253
- if (this.disabled) {
5468
+ _onPopoverWillHide() {
5469
+ this.state = OpenState.closed;
5470
+ this.elementRef.nativeElement.focus();
5471
+ }
5472
+ _onBlur(event) {
5473
+ if (this.disabled)
5254
5474
  return;
5255
- }
5256
5475
  if (this.isOpen) {
5257
- this.close();
5476
+ if (!this.cardElement.nativeElement.contains(event === null || event === void 0 ? void 0 : event.relatedTarget)) {
5477
+ this.close();
5478
+ }
5258
5479
  }
5259
5480
  this._onTouched();
5260
5481
  }
@@ -5271,50 +5492,26 @@ class DropdownComponent {
5271
5492
  this.toggle();
5272
5493
  }
5273
5494
  _onArrowKeys(event) {
5274
- if (this.disabled) {
5495
+ if (this.disabled)
5275
5496
  return;
5276
- }
5497
+ // Mirror default HTML5 select behaviour - prevent left/right arrows when open:
5277
5498
  if (this.isOpen && (event.key === 'ArrowLeft' || event.key === 'ArrowRight')) {
5278
- // Mirror default HTML5 select behaviour - prevent left/right arrows when open:
5279
5499
  return;
5280
5500
  }
5281
- event.preventDefault();
5282
- let newIndex = -1;
5283
- if (event.key === 'ArrowUp' || event.key === 'ArrowLeft') {
5284
- // Select previous item:
5285
- newIndex = this.selectedIndex - 1;
5286
- }
5287
- if (event.key === 'ArrowDown' || event.key === 'ArrowRight') {
5288
- if (this.selectedIndex === undefined) {
5289
- // None selected, select first item:
5290
- newIndex = 0;
5291
- }
5292
- else if (this.selectedIndex < this.items.length - 1) {
5293
- // Select next item:
5294
- newIndex = this.selectedIndex + 1;
5295
- }
5296
- }
5501
+ const newIndex = this.keyboardHandlerService.handle(event, this.items, this.selectedIndex);
5297
5502
  if (newIndex > -1) {
5298
5503
  this.selectItem(newIndex);
5299
5504
  }
5505
+ return false;
5300
5506
  }
5301
5507
  _onHomeEndKeys(event) {
5302
- event.preventDefault();
5303
- if (this.disabled) {
5508
+ if (this.disabled)
5304
5509
  return;
5305
- }
5306
- let newIndex = -1;
5307
- if (event.key === 'Home') {
5308
- // Select first item:
5309
- newIndex = 0;
5310
- }
5311
- if (event.key === 'End') {
5312
- // Select last item:
5313
- newIndex = this.items.length - 1;
5314
- }
5510
+ const newIndex = this.keyboardHandlerService.handle(event, this.items, this.selectedIndex);
5315
5511
  if (newIndex > -1) {
5316
5512
  this.selectItem(newIndex);
5317
5513
  }
5514
+ return false;
5318
5515
  }
5319
5516
  ngOnDestroy() {
5320
5517
  let unlisten;
@@ -5330,7 +5527,7 @@ DropdownComponent.OPEN_DELAY_IN_MS = 100;
5330
5527
  DropdownComponent.decorators = [
5331
5528
  { type: Component, args: [{
5332
5529
  selector: 'kirby-dropdown',
5333
- template: "<button\n kirby-button\n [size]=\"size\"\n [attentionLevel]=\"isOpen ? attentionLevelOpen : attentionLevel\"\n tabindex=\"-1\"\n (click)=\"onToggle($event)\"\n (mousedown)=\"onButtonMouseEvent($event)\"\n [disabled]=\"disabled\"\n>\n <span class=\"text\">{{ selectedText || placeholder }}</span>\n <kirby-icon [name]=\"isOpen ? 'arrow-up' : 'arrow-down'\"></kirby-icon>\n</button>\n<kirby-card>\n <ng-container *ngFor=\"let item of items; let i = index\">\n <ng-container\n *ngTemplateOutlet=\"\n itemTemplate || defaultItemTemplate;\n context: { $implicit: item, selected: i === selectedIndex, index: i }\n \"\n ></ng-container>\n </ng-container>\n</kirby-card>\n\n<ng-template #defaultItemTemplate let-item let-selected=\"selected\" let-index=\"index\">\n <kirby-item [selectable]=\"true\" [selected]=\"selected\" (click)=\"onItemSelect(index)\" role=\"option\">\n <h3>{{ getTextFromItem(item) }}</h3>\n <kirby-icon *ngIf=\"selected\" name=\"checkmark-selected\" slot=\"end\"></kirby-icon>\n </kirby-item>\n</ng-template>\n",
5530
+ template: "<button\n kirby-button\n [size]=\"size\"\n [attentionLevel]=\"isOpen ? attentionLevelOpen : attentionLevel\"\n tabindex=\"-1\"\n (click)=\"onToggle($event)\"\n (mousedown)=\"onButtonMouseEvent($event)\"\n [disabled]=\"disabled\"\n>\n <span class=\"text\">{{ selectedText || placeholder }}</span>\n <kirby-icon [name]=\"isOpen ? 'arrow-up' : 'arrow-down'\"></kirby-icon>\n</button>\n\n<ng-container *ngTemplateOutlet=\"usePopover ? popoverTemplate : itemWrapperTemplate\"></ng-container>\n\n<ng-template #popoverTemplate>\n <kirby-popover [target]=\"buttonElement\" [popout]=\"popout\" (willHide)=\"_onPopoverWillHide()\">\n <ng-container *ngTemplateOutlet=\"itemWrapperTemplate\"></ng-container>\n </kirby-popover>\n</ng-template>\n\n<ng-template #itemWrapperTemplate>\n <kirby-card>\n <ng-container *ngFor=\"let item of items; let i = index\">\n <ng-container\n *ngTemplateOutlet=\"\n itemTemplate || defaultItemTemplate;\n context: { $implicit: item, selected: i === selectedIndex, index: i }\n \"\n ></ng-container>\n </ng-container>\n </kirby-card>\n</ng-template>\n\n<ng-template #defaultItemTemplate let-item let-selected=\"selected\" let-index=\"index\">\n <kirby-item [selectable]=\"true\" [selected]=\"selected\" (click)=\"onItemSelect(index)\" role=\"option\">\n <!-- Tabindex fixes issue with popover dropdown not working in safari -->\n <h3 tabindex=\"0\">{{ getTextFromItem(item) }}</h3>\n <kirby-icon *ngIf=\"selected\" name=\"checkmark-selected\" slot=\"end\"></kirby-icon>\n </kirby-item>\n</ng-template>\n",
5334
5531
  providers: [
5335
5532
  {
5336
5533
  provide: NG_VALUE_ACCESSOR,
@@ -5338,14 +5535,15 @@ DropdownComponent.decorators = [
5338
5535
  multi: true,
5339
5536
  },
5340
5537
  ],
5341
- styles: [":host{--kirby_internal_min-screen-width:320px;display:inline-block;position:relative;max-width:calc(100vw - 32px);outline:none}@media (min-width:321px){:host{--kirby_internal_min-screen-width:375px}}:host.expand{display:block}:host:not(.expand) kirby-card{min-width:calc(var(--kirby_internal_min-screen-width) - 32px);max-width:calc(100vw - 32px)}@media (hover:hover){:host:focus>button,:host:focus>button.attention-level3{border-color:#4d90fe}}:host.error>button,:host.ng-touched.ng-invalid>button{border-color:var(--kirby-danger)}:host>button{position:relative;margin:0;outline:none;width:100%;transition:box-shadow .2s,border-color .2s}:host>button.attention-level2{border:1px solid transparent}:host>button .text{overflow:hidden;text-overflow:ellipsis}kirby-card{display:none;opacity:0;position:absolute;width:100%;max-height:352px;margin-top:4px;overflow-y:auto;box-shadow:0 20px 30px -15px rgba(28,28,28,.3),0 0 5px 0 rgba(28,28,28,.08);z-index:800}:host(.is-opening) kirby-card{display:block}:host(.is-open)>button{box-shadow:0 20px 30px -15px rgba(28,28,28,.3),0 0 5px 0 rgba(28,28,28,.08)}:host(.is-open) kirby-card{display:block;opacity:1}:host(.popout-left) kirby-card{right:0}:host(.popout-up) kirby-card{top:0;margin-top:-4px;transform:translateY(-100%)}:host(.popout-up).is-open>button{z-index:801}:host-context(kirby-calendar)>button{border-color:transparent;font-weight:700;font-size:medium}:host-context(kirby-calendar).is-open>button{box-shadow:none}"]
5538
+ styles: [":host{display:inline-block;position:relative;max-width:calc(100vw - 32px);outline:none}:host.expand{display:block}:host.expand kirby-card{width:100%;min-width:0;max-width:none}@media (hover:hover){:host:focus>button,:host:focus>button.attention-level3{border-color:#4d90fe}}:host.error>button,:host.ng-touched.ng-invalid>button{border-color:var(--kirby-danger)}:host>button{position:relative;margin:0;outline:none;width:100%;transition:box-shadow .2s,border-color .2s}:host>button.attention-level2{border:1px solid transparent}:host>button .text{overflow:hidden;text-overflow:ellipsis}kirby-popover{--max-height:352px}kirby-card{max-height:352px;margin-top:4px;margin-bottom:4px;overflow-y:auto;box-shadow:0 20px 30px -15px rgba(28,28,28,.3),0 0 5px 0 rgba(28,28,28,.08);min-width:288px;max-width:calc(100vw - 32px)}@media (min-width:321px){kirby-card{min-width:343px}}:host(:not(.with-popover)) kirby-card{display:none;opacity:0;position:absolute;z-index:800}:host(:not(.with-popover)).is-opening kirby-card{display:block}:host(:not(.with-popover)).is-open kirby-card{display:block;opacity:1}:host(:not(.with-popover)).popout-left kirby-card{right:0}:host(:not(.with-popover)).popout-up kirby-card{top:0;margin-top:-4px;transform:translateY(-100%)}:host(:not(.with-popover)).popout-up.is-open>button{z-index:801}:host(.is-open)>button{box-shadow:0 20px 30px -15px rgba(28,28,28,.3),0 0 5px 0 rgba(28,28,28,.08)}:host-context(kirby-calendar)>button{border-color:transparent;font-weight:700;font-size:medium}:host-context(kirby-calendar).is-open>button{box-shadow:none}"]
5342
5539
  },] }
5343
5540
  ];
5344
5541
  /** @nocollapse */
5345
5542
  DropdownComponent.ctorParameters = () => [
5346
5543
  { type: Renderer2 },
5347
5544
  { type: ElementRef },
5348
- { type: ChangeDetectorRef }
5545
+ { type: ChangeDetectorRef },
5546
+ { type: KeyboardHandlerService }
5349
5547
  ];
5350
5548
  DropdownComponent.propDecorators = {
5351
5549
  items: [{ type: Input }],
@@ -5360,6 +5558,7 @@ DropdownComponent.propDecorators = {
5360
5558
  hasError: [{ type: HostBinding, args: ['class.error',] }, { type: Input }],
5361
5559
  size: [{ type: Input }],
5362
5560
  tabindex: [{ type: Input }],
5561
+ usePopover: [{ type: HostBinding, args: ['class.with-popover',] }, { type: Input }],
5363
5562
  _tabindex: [{ type: HostBinding, args: ['attr.tabindex',] }],
5364
5563
  _noBlurOnScroll: [{ type: HostBinding, args: ['attr.no-blur',] }],
5365
5564
  change: [{ type: Output }],
@@ -5371,13 +5570,15 @@ DropdownComponent.propDecorators = {
5371
5570
  _popoutUp: [{ type: HostBinding, args: ['class.popout-up',] }],
5372
5571
  itemTemplate: [{ type: ContentChild, args: [ListItemTemplateDirective, { static: true, read: TemplateRef },] }],
5373
5572
  slottedItems: [{ type: ContentChildren, args: [ListItemTemplateDirective, { read: ElementRef },] }],
5374
- cardElement: [{ type: ViewChild, args: [CardComponent, { static: true, read: ElementRef },] }],
5573
+ cardElement: [{ type: ViewChild, args: [CardComponent, { read: ElementRef },] }],
5574
+ popover: [{ type: ViewChild, args: [PopoverComponent,] }],
5575
+ buttonElement: [{ type: ViewChild, args: [ButtonComponent, { static: true, read: ElementRef },] }],
5375
5576
  kirbyItemsDefault: [{ type: ViewChildren, args: [ItemComponent, { read: ElementRef },] }],
5376
5577
  kirbyItemsSlotted: [{ type: ContentChildren, args: [ItemComponent, { read: ElementRef },] }],
5377
5578
  _onTab: [{ type: HostListener, args: ['keydown.tab', ['$event'],] }],
5378
5579
  _onMouseDown: [{ type: HostListener, args: ['mousedown', ['$event'],] }],
5379
5580
  _onFocus: [{ type: HostListener, args: ['focus',] }],
5380
- _onBlur: [{ type: HostListener, args: ['keydown.enter',] }, { type: HostListener, args: ['keydown.escape',] }, { type: HostListener, args: ['blur',] }],
5581
+ _onBlur: [{ type: HostListener, args: ['keydown.enter',] }, { type: HostListener, args: ['keydown.escape',] }, { type: HostListener, args: ['blur', ['$event'],] }],
5381
5582
  _onSpace: [{ type: HostListener, args: ['keydown.space', ['$event'],] }],
5382
5583
  _onEnter: [{ type: HostListener, args: ['keydown.enter', ['$event'],] }],
5383
5584
  _onArrowKeys: [{ type: HostListener, args: ['keydown.arrowup', ['$event'],] }, { type: HostListener, args: ['keydown.arrowdown', ['$event'],] }, { type: HostListener, args: ['keydown.arrowleft', ['$event'],] }, { type: HostListener, args: ['keydown.arrowright', ['$event'],] }],
@@ -8584,6 +8785,7 @@ const declarations$1 = [
8584
8785
  ModalWrapperComponent,
8585
8786
  ModalCompactWrapperComponent,
8586
8787
  ProgressCircleRingComponent,
8788
+ PopoverComponent,
8587
8789
  ];
8588
8790
  const exportedModules = [
8589
8791
  AppModule,
@@ -8664,5 +8866,5 @@ KirbyModule.ctorParameters = () => [
8664
8866
  * Generated bundle index. Do not edit.
8665
8867
  */
8666
8868
 
8667
- export { AccordionDirective, AccordionItemComponent, ActionSheetComponent, AppComponent, AppModule, AvatarComponent, AvatarSize, BadgeComponent, ButtonComponent, ButtonSize, COMPONENT_PROPS, CalendarComponent, CardComponent, CardFooterComponent, CardHeaderComponent, ChartComponent, ChartDeprecatedComponent, ChartDeprecatedType, CheckboxComponent, ChipComponent, ColorHelper, ComponentLoaderDirective, DateInputDirective, DecimalMaskDirective, DesignTokenHelper, DividerComponent, DropdownComponent, EmptyStateComponent, FabSheetComponent, FitHeadingDirective, FitHeadingModule, FlagComponent, FormFieldComponent, FormFieldMessageComponent, GridCardConfiguration, GridComponent, GroupByPipe, HorizontalDirection, ICON_SETTINGS, IconComponent, IconModule, IconRegistryService, IconSize, InfiniteScrollDirective, InputComponent, InputCounterComponent, InputSize, ItemComponent, ItemModule, ItemSize, KeyHandlerDirective, KirbyAnimation, KirbyModule, LabelComponent, ListComponent, ListFlexItemDirective, ListFooterDirective, ListHeaderComponent, ListHeaderDirective, ListItemColorDirective, ListItemComponent, ListItemDirective, ListItemTemplateDirective, ListSectionHeaderComponent, ListSectionHeaderDirective, LoadingOverlayComponent, LoadingOverlayService, Modal, ModalController, ModalFooterComponent, PageActionsComponent, PageActionsDirective, PageComponent, PageContentComponent, PageContentDirective, PageFooterComponent, PageModule, PageProgressComponent, PageTitleComponent, PageTitleDirective, PageToolbarTitleDirective, PlatformService, ProgressCircleComponent, RadioComponent, RadioGroupComponent, RangeComponent, ReorderEvent, ReorderListComponent, ResizeObserverFactory, ResizeObserverService, RouterOutletComponent, RouterOutletModule, ScssHelper, SegmentedControlComponent, SegmentedControlMode, SlideButtonComponent, SlideDirective, SlidesComponent, SpinnerComponent, StockChartDeprecatedComponent, TabButtonComponent, TabsComponent, TabsModule, TabsService, TextareaComponent, ThemeColorDirective, ToastController, ToggleButtonComponent, ToggleComponent, annotations, camelToKebabCase, capitalizeFirstLetter, defaultIcons, isNumberArray, kebabToCamelCase, kebabToTitleCase, selectedTabClickEvent, stockChartDeprecatedOptions, ɵ0$6 as ɵ0, AppModule as ɵa, AppComponent as ɵb, Modal as ɵba, ButtonComponent as ɵbb, IconComponent as ɵbc, IconRegistryService as ɵbd, ICON_SETTINGS as ɵbf, ResizeObserverService as ɵbg, ResizeObserverFactory as ɵbh, FitHeadingModule as ɵbi, FitHeadingDirective as ɵbj, LineClampHelper as ɵbk, TabsModule as ɵbl, IconModule as ɵbm, TabButtonComponent as ɵbn, ItemModule as ɵbo, ItemComponent as ɵbp, LabelComponent as ɵbq, ToggleButtonModule as ɵbr, ToggleButtonComponent as ɵbs, ListModule as ɵbt, ListComponent as ɵbu, ListHelper as ɵbv, GroupByPipe as ɵbw, InfiniteScrollDirective as ɵbx, ListItemDirective as ɵby, ListFlexItemDirective as ɵbz, RouterOutletComponent as ɵc, ListItemTemplateDirective as ɵca, ListHeaderDirective as ɵcb, ListSectionHeaderDirective as ɵcc, ListFooterDirective as ɵcd, ListItemComponent as ɵce, ListSectionHeaderComponent as ɵcf, ListHeaderComponent as ɵcg, ListItemColorDirective as ɵch, SpinnerModule as ɵci, SpinnerComponent as ɵcj, ChartModule as ɵck, ChartComponent as ɵcl, ChartJSService as ɵcm, ChartConfigService as ɵcn, CardComponent as ɵco, CardHeaderComponent as ɵcp, CardFooterComponent as ɵcq, ChartDeprecatedComponent as ɵcr, ChartDeprecatedHelper as ɵcs, DONUT_OPTIONS as ɵct, DonutOptions as ɵcu, AREASPLINE_OPTIONS as ɵcv, AreaSplineOptions as ɵcw, TIMESERIES_OPTIONS as ɵcx, TimeSeriesOptions as ɵcy, ACTIVITYGAUGE_OPTIONS as ɵcz, ModalController as ɵd, ActivityGaugeOptions as ɵda, StockChartDeprecatedComponent as ɵdb, GridComponent as ɵdc, BreakpointHelperService as ɵdd, ComponentLoaderDirective as ɵde, AvatarComponent as ɵdf, CalendarComponent as ɵdg, CalendarHelper as ɵdh, CheckboxComponent as ɵdi, ActionSheetComponent as ɵdj, ModalFooterComponent as ɵdk, ModalRouterLinkDirective as ɵdl, SegmentedControlComponent as ɵdm, ChipComponent as ɵdn, BadgeComponent as ɵdo, ThemeColorDirective as ɵdp, DateInputDirective as ɵdq, DecimalMaskDirective as ɵdr, SlideButtonComponent as ɵds, ToggleComponent as ɵdt, EmptyStateComponent as ɵdu, FormFieldComponent as ɵdv, InputCounterComponent as ɵdw, RadioGroupComponent as ɵdx, RadioComponent as ɵdy, InputComponent as ɵdz, ModalHelper as ɵe, TextareaComponent as ɵea, FabSheetComponent as ɵeb, DividerComponent as ɵec, ReorderListComponent as ɵed, DropdownComponent as ɵee, LoadingOverlayComponent as ɵef, ProgressCircleComponent as ɵeg, FlagComponent as ɵeh, SlideDirective as ɵei, SlidesComponent as ɵej, AccordionDirective as ɵek, AccordionItemComponent as ɵel, RangeComponent as ɵem, KeyHandlerDirective as ɵen, FormFieldMessageComponent as ɵeo, AlertComponent as ɵep, ModalCompactWrapperComponent as ɵeq, ProgressCircleRingComponent as ɵer, ToastHelper as ɵes, ToastController as ɵet, LoadingOverlayService as ɵeu, ModalAnimationBuilderService as ɵf, PlatformService as ɵg, WindowRef as ɵh, ActionSheetHelper as ɵi, AlertHelper as ɵj, ModalNavigationService as ɵk, RouterOutletModule as ɵl, PageModule as ɵm, PageTitleDirective as ɵn, PageToolbarTitleDirective as ɵo, PageActionsDirective as ɵp, PageContentDirective as ɵq, PageProgressComponent as ɵr, PageTitleComponent as ɵs, PageContentComponent as ɵt, PageActionsComponent as ɵu, PageComponent as ɵv, TabsComponent as ɵw, TabsService as ɵx, PageFooterComponent as ɵy, ModalWrapperComponent as ɵz };
8869
+ export { AccordionDirective, AccordionItemComponent, ActionSheetComponent, AppComponent, AppModule, AvatarComponent, AvatarSize, BadgeComponent, ButtonComponent, ButtonSize, COMPONENT_PROPS, CalendarComponent, CardComponent, CardFooterComponent, CardHeaderComponent, ChartComponent, ChartDeprecatedComponent, ChartDeprecatedType, CheckboxComponent, ChipComponent, ColorHelper, ComponentLoaderDirective, DateInputDirective, DecimalMaskDirective, DesignTokenHelper, DividerComponent, DropdownComponent, EmptyStateComponent, FabSheetComponent, FitHeadingDirective, FitHeadingModule, FlagComponent, FormFieldComponent, FormFieldMessageComponent, GridCardConfiguration, GridComponent, GroupByPipe, HorizontalDirection, ICON_SETTINGS, IconComponent, IconModule, IconRegistryService, IconSize, InfiniteScrollDirective, InputComponent, InputCounterComponent, InputSize, ItemComponent, ItemModule, ItemSize, KeyHandlerDirective, KirbyAnimation, KirbyModule, LabelComponent, ListComponent, ListFlexItemDirective, ListFooterDirective, ListHeaderComponent, ListHeaderDirective, ListItemColorDirective, ListItemComponent, ListItemDirective, ListItemTemplateDirective, ListSectionHeaderComponent, ListSectionHeaderDirective, LoadingOverlayComponent, LoadingOverlayService, Modal, ModalController, ModalFooterComponent, PageActionsComponent, PageActionsDirective, PageComponent, PageContentComponent, PageContentDirective, PageFooterComponent, PageModule, PageProgressComponent, PageTitleComponent, PageTitleDirective, PageToolbarTitleDirective, PlatformService, PopoverComponent, ProgressCircleComponent, RadioComponent, RadioGroupComponent, RangeComponent, ReorderEvent, ReorderListComponent, ResizeObserverFactory, ResizeObserverService, RouterOutletComponent, RouterOutletModule, ScssHelper, SegmentedControlComponent, SegmentedControlMode, SlideButtonComponent, SlideDirective, SlidesComponent, SpinnerComponent, StockChartDeprecatedComponent, TabButtonComponent, TabsComponent, TabsModule, TabsService, TextareaComponent, ThemeColorDirective, ToastController, ToggleButtonComponent, ToggleComponent, annotations, camelToKebabCase, capitalizeFirstLetter, defaultIcons, isNumberArray, kebabToCamelCase, kebabToTitleCase, selectedTabClickEvent, stockChartDeprecatedOptions, ɵ0$6 as ɵ0, AppModule as ɵa, AppComponent as ɵb, Modal as ɵba, ButtonComponent as ɵbb, IconComponent as ɵbc, IconRegistryService as ɵbd, ICON_SETTINGS as ɵbf, ResizeObserverService as ɵbg, ResizeObserverFactory as ɵbh, FitHeadingModule as ɵbi, FitHeadingDirective as ɵbj, LineClampHelper as ɵbk, TabsModule as ɵbl, IconModule as ɵbm, TabButtonComponent as ɵbn, ItemModule as ɵbo, ItemComponent as ɵbp, LabelComponent as ɵbq, ToggleButtonModule as ɵbr, ToggleButtonComponent as ɵbs, ListModule as ɵbt, ListComponent as ɵbu, ListHelper as ɵbv, GroupByPipe as ɵbw, InfiniteScrollDirective as ɵbx, ListItemDirective as ɵby, ListFlexItemDirective as ɵbz, RouterOutletComponent as ɵc, ListItemTemplateDirective as ɵca, ListHeaderDirective as ɵcb, ListSectionHeaderDirective as ɵcc, ListFooterDirective as ɵcd, ListItemComponent as ɵce, ListSectionHeaderComponent as ɵcf, ListHeaderComponent as ɵcg, ListItemColorDirective as ɵch, SpinnerModule as ɵci, SpinnerComponent as ɵcj, ChartModule as ɵck, ChartComponent as ɵcl, ChartJSService as ɵcm, ChartConfigService as ɵcn, CardComponent as ɵco, CardHeaderComponent as ɵcp, CardFooterComponent as ɵcq, ChartDeprecatedComponent as ɵcr, ChartDeprecatedHelper as ɵcs, DONUT_OPTIONS as ɵct, DonutOptions as ɵcu, AREASPLINE_OPTIONS as ɵcv, AreaSplineOptions as ɵcw, TIMESERIES_OPTIONS as ɵcx, TimeSeriesOptions as ɵcy, ACTIVITYGAUGE_OPTIONS as ɵcz, ModalController as ɵd, ActivityGaugeOptions as ɵda, StockChartDeprecatedComponent as ɵdb, GridComponent as ɵdc, BreakpointHelperService as ɵdd, ComponentLoaderDirective as ɵde, AvatarComponent as ɵdf, CalendarComponent as ɵdg, CalendarHelper as ɵdh, CheckboxComponent as ɵdi, ActionSheetComponent as ɵdj, ModalFooterComponent as ɵdk, ModalRouterLinkDirective as ɵdl, SegmentedControlComponent as ɵdm, ChipComponent as ɵdn, BadgeComponent as ɵdo, ThemeColorDirective as ɵdp, DateInputDirective as ɵdq, DecimalMaskDirective as ɵdr, SlideButtonComponent as ɵds, ToggleComponent as ɵdt, EmptyStateComponent as ɵdu, FormFieldComponent as ɵdv, InputCounterComponent as ɵdw, RadioGroupComponent as ɵdx, RadioComponent as ɵdy, InputComponent as ɵdz, ModalHelper as ɵe, TextareaComponent as ɵea, FabSheetComponent as ɵeb, DividerComponent as ɵec, ReorderListComponent as ɵed, DropdownComponent as ɵee, PopoverComponent as ɵef, KeyboardHandlerService as ɵeg, LoadingOverlayComponent as ɵeh, ProgressCircleComponent as ɵei, FlagComponent as ɵej, SlideDirective as ɵek, SlidesComponent as ɵel, AccordionDirective as ɵem, AccordionItemComponent as ɵen, RangeComponent as ɵeo, KeyHandlerDirective as ɵep, FormFieldMessageComponent as ɵeq, AlertComponent as ɵer, ModalCompactWrapperComponent as ɵes, ProgressCircleRingComponent as ɵet, ToastHelper as ɵeu, ToastController as ɵev, LoadingOverlayService as ɵew, ModalAnimationBuilderService as ɵf, PlatformService as ɵg, WindowRef as ɵh, ActionSheetHelper as ɵi, AlertHelper as ɵj, ModalNavigationService as ɵk, RouterOutletModule as ɵl, PageModule as ɵm, PageTitleDirective as ɵn, PageToolbarTitleDirective as ɵo, PageActionsDirective as ɵp, PageContentDirective as ɵq, PageProgressComponent as ɵr, PageTitleComponent as ɵs, PageContentComponent as ɵt, PageActionsComponent as ɵu, PageComponent as ɵv, TabsComponent as ɵw, TabsService as ɵx, PageFooterComponent as ɵy, ModalWrapperComponent as ɵz };
8668
8870
  //# sourceMappingURL=kirbydesign-designsystem.js.map