@kirbydesign/designsystem 11.11.2 → 11.11.3

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 (129) hide show
  1. package/fesm2022/kirbydesign-designsystem-accordion.mjs +11 -11
  2. package/fesm2022/kirbydesign-designsystem-accordion.mjs.map +1 -1
  3. package/fesm2022/kirbydesign-designsystem-action-group.mjs +4 -4
  4. package/fesm2022/kirbydesign-designsystem-action-group.mjs.map +1 -1
  5. package/fesm2022/kirbydesign-designsystem-avatar.mjs +4 -4
  6. package/fesm2022/kirbydesign-designsystem-avatar.mjs.map +1 -1
  7. package/fesm2022/kirbydesign-designsystem-badge.mjs +5 -5
  8. package/fesm2022/kirbydesign-designsystem-badge.mjs.map +1 -1
  9. package/fesm2022/kirbydesign-designsystem-button.mjs +4 -4
  10. package/fesm2022/kirbydesign-designsystem-button.mjs.map +1 -1
  11. package/fesm2022/kirbydesign-designsystem-calendar.mjs +4 -4
  12. package/fesm2022/kirbydesign-designsystem-calendar.mjs.map +1 -1
  13. package/fesm2022/kirbydesign-designsystem-card.mjs +19 -19
  14. package/fesm2022/kirbydesign-designsystem-card.mjs.map +1 -1
  15. package/fesm2022/kirbydesign-designsystem-chart.mjs +22 -22
  16. package/fesm2022/kirbydesign-designsystem-checkbox.mjs +6 -6
  17. package/fesm2022/kirbydesign-designsystem-checkbox.mjs.map +1 -1
  18. package/fesm2022/kirbydesign-designsystem-config.mjs +1 -1
  19. package/fesm2022/kirbydesign-designsystem-config.mjs.map +1 -1
  20. package/fesm2022/kirbydesign-designsystem-data-table.mjs +7 -7
  21. package/fesm2022/kirbydesign-designsystem-divider.mjs +4 -4
  22. package/fesm2022/kirbydesign-designsystem-divider.mjs.map +1 -1
  23. package/fesm2022/kirbydesign-designsystem-dropdown.mjs +12 -12
  24. package/fesm2022/kirbydesign-designsystem-dropdown.mjs.map +1 -1
  25. package/fesm2022/kirbydesign-designsystem-empty-state.mjs +8 -8
  26. package/fesm2022/kirbydesign-designsystem-empty-state.mjs.map +1 -1
  27. package/fesm2022/kirbydesign-designsystem-fab-sheet.mjs +5 -5
  28. package/fesm2022/kirbydesign-designsystem-fab-sheet.mjs.map +1 -1
  29. package/fesm2022/kirbydesign-designsystem-flag.mjs +5 -5
  30. package/fesm2022/kirbydesign-designsystem-flag.mjs.map +1 -1
  31. package/fesm2022/kirbydesign-designsystem-form-field.mjs +44 -34
  32. package/fesm2022/kirbydesign-designsystem-form-field.mjs.map +1 -1
  33. package/fesm2022/kirbydesign-designsystem-gesture.mjs +4 -4
  34. package/fesm2022/kirbydesign-designsystem-gesture.mjs.map +1 -1
  35. package/fesm2022/kirbydesign-designsystem-header.mjs +20 -20
  36. package/fesm2022/kirbydesign-designsystem-header.mjs.map +1 -1
  37. package/fesm2022/kirbydesign-designsystem-helpers.mjs +9 -9
  38. package/fesm2022/kirbydesign-designsystem-icon.mjs +19 -12
  39. package/fesm2022/kirbydesign-designsystem-icon.mjs.map +1 -1
  40. package/fesm2022/kirbydesign-designsystem-item-group.mjs +3 -3
  41. package/fesm2022/kirbydesign-designsystem-item-sliding.mjs +5 -5
  42. package/fesm2022/kirbydesign-designsystem-item-sliding.mjs.map +1 -1
  43. package/fesm2022/kirbydesign-designsystem-item.mjs +13 -13
  44. package/fesm2022/kirbydesign-designsystem-item.mjs.map +1 -1
  45. package/fesm2022/kirbydesign-designsystem-kirby-app.mjs +8 -8
  46. package/fesm2022/kirbydesign-designsystem-kirby-app.mjs.map +1 -1
  47. package/fesm2022/kirbydesign-designsystem-list.mjs +45 -45
  48. package/fesm2022/kirbydesign-designsystem-list.mjs.map +1 -1
  49. package/fesm2022/kirbydesign-designsystem-loading-overlay.mjs +8 -8
  50. package/fesm2022/kirbydesign-designsystem-loading-overlay.mjs.map +1 -1
  51. package/fesm2022/kirbydesign-designsystem-menu.mjs +4 -4
  52. package/fesm2022/kirbydesign-designsystem-menu.mjs.map +1 -1
  53. package/fesm2022/kirbydesign-designsystem-modal.mjs +52 -52
  54. package/fesm2022/kirbydesign-designsystem-modal.mjs.map +1 -1
  55. package/fesm2022/kirbydesign-designsystem-page.mjs +46 -46
  56. package/fesm2022/kirbydesign-designsystem-page.mjs.map +1 -1
  57. package/fesm2022/kirbydesign-designsystem-popover.mjs +34 -19
  58. package/fesm2022/kirbydesign-designsystem-popover.mjs.map +1 -1
  59. package/fesm2022/kirbydesign-designsystem-progress-circle.mjs +27 -64
  60. package/fesm2022/kirbydesign-designsystem-progress-circle.mjs.map +1 -1
  61. package/fesm2022/kirbydesign-designsystem-radio.mjs +12 -12
  62. package/fesm2022/kirbydesign-designsystem-radio.mjs.map +1 -1
  63. package/fesm2022/kirbydesign-designsystem-range.mjs +6 -6
  64. package/fesm2022/kirbydesign-designsystem-range.mjs.map +1 -1
  65. package/fesm2022/kirbydesign-designsystem-reorder-list.mjs +5 -5
  66. package/fesm2022/kirbydesign-designsystem-reorder-list.mjs.map +1 -1
  67. package/fesm2022/kirbydesign-designsystem-router-outlet.mjs +10 -10
  68. package/fesm2022/kirbydesign-designsystem-router-outlet.mjs.map +1 -1
  69. package/fesm2022/kirbydesign-designsystem-section-header.mjs +5 -5
  70. package/fesm2022/kirbydesign-designsystem-section-header.mjs.map +1 -1
  71. package/fesm2022/kirbydesign-designsystem-segmented-control.mjs +6 -6
  72. package/fesm2022/kirbydesign-designsystem-segmented-control.mjs.map +1 -1
  73. package/fesm2022/kirbydesign-designsystem-shared-floating.mjs +3 -3
  74. package/fesm2022/kirbydesign-designsystem-shared-portal.mjs +3 -3
  75. package/fesm2022/kirbydesign-designsystem-shared.mjs +27 -29
  76. package/fesm2022/kirbydesign-designsystem-shared.mjs.map +1 -1
  77. package/fesm2022/kirbydesign-designsystem-slide-button.mjs +4 -4
  78. package/fesm2022/kirbydesign-designsystem-slide-button.mjs.map +1 -1
  79. package/fesm2022/kirbydesign-designsystem-slide.mjs +15 -14
  80. package/fesm2022/kirbydesign-designsystem-slide.mjs.map +1 -1
  81. package/fesm2022/kirbydesign-designsystem-spinner.mjs +8 -8
  82. package/fesm2022/kirbydesign-designsystem-spinner.mjs.map +1 -1
  83. package/fesm2022/kirbydesign-designsystem-tab-navigation.mjs +12 -12
  84. package/fesm2022/kirbydesign-designsystem-tab-navigation.mjs.map +1 -1
  85. package/fesm2022/kirbydesign-designsystem-tabs.mjs +17 -17
  86. package/fesm2022/kirbydesign-designsystem-tabs.mjs.map +1 -1
  87. package/fesm2022/kirbydesign-designsystem-testing-base.mjs +286 -286
  88. package/fesm2022/kirbydesign-designsystem-testing-jasmine.mjs +4 -4
  89. package/fesm2022/kirbydesign-designsystem-testing-jest.mjs +4 -4
  90. package/fesm2022/kirbydesign-designsystem-testing.mjs +5 -5
  91. package/fesm2022/kirbydesign-designsystem-testing.mjs.map +1 -1
  92. package/fesm2022/kirbydesign-designsystem-toast.mjs +7 -7
  93. package/fesm2022/kirbydesign-designsystem-toast.mjs.map +1 -1
  94. package/fesm2022/kirbydesign-designsystem-toggle-button.mjs +7 -7
  95. package/fesm2022/kirbydesign-designsystem-toggle.mjs +6 -6
  96. package/fesm2022/kirbydesign-designsystem-toggle.mjs.map +1 -1
  97. package/fesm2022/kirbydesign-designsystem-types.mjs +3 -3
  98. package/fesm2022/kirbydesign-designsystem.mjs +10 -10
  99. package/icons/svg/person-blocked.svg +3 -0
  100. package/icons/svg/person-check.svg +3 -0
  101. package/icons/svg/person-close.svg +3 -0
  102. package/icons/svg/person-cloud.svg +3 -0
  103. package/icons/svg/person-power.svg +3 -0
  104. package/icons/svg/person-warning.svg +3 -0
  105. package/icons/svg/phone-device-pin.svg +3 -0
  106. package/icons/svg/phone-device.svg +3 -2
  107. package/package.json +4 -4
  108. package/types/kirbydesign-designsystem-fab-sheet.d.ts +1 -1
  109. package/types/kirbydesign-designsystem-form-field.d.ts.map +1 -1
  110. package/types/kirbydesign-designsystem-icon.d.ts +1 -1
  111. package/types/kirbydesign-designsystem-icon.d.ts.map +1 -1
  112. package/types/kirbydesign-designsystem-item-sliding.d.ts +1 -1
  113. package/types/kirbydesign-designsystem-item.d.ts +1 -1
  114. package/types/kirbydesign-designsystem-kirby-app.d.ts +1 -1
  115. package/types/kirbydesign-designsystem-list.d.ts +2 -2
  116. package/types/kirbydesign-designsystem-loading-overlay.d.ts +1 -1
  117. package/types/kirbydesign-designsystem-modal.d.ts +1 -1
  118. package/types/kirbydesign-designsystem-page.d.ts +2 -2
  119. package/types/kirbydesign-designsystem-page.d.ts.map +1 -1
  120. package/types/kirbydesign-designsystem-popover.d.ts.map +1 -1
  121. package/types/kirbydesign-designsystem-progress-circle.d.ts +5 -29
  122. package/types/kirbydesign-designsystem-progress-circle.d.ts.map +1 -1
  123. package/types/kirbydesign-designsystem-radio.d.ts +1 -1
  124. package/types/kirbydesign-designsystem-router-outlet.d.ts +2 -2
  125. package/types/kirbydesign-designsystem-shared.d.ts.map +1 -1
  126. package/types/kirbydesign-designsystem-slide.d.ts +1 -1
  127. package/types/kirbydesign-designsystem-slide.d.ts.map +1 -1
  128. package/types/kirbydesign-designsystem-tabs.d.ts +3 -3
  129. package/types/kirbydesign-designsystem-toast.d.ts +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"kirbydesign-designsystem-page.mjs","sources":["../../page/src/page.component.ts","../../page/src/page.component.html","../../page/src/page-footer/page-footer.component.ts","../../page/src/page-footer/page-footer.component.html","../../page/src/page.module.ts","../../page/src/kirbydesign-designsystem-page.ts"],"sourcesContent":["import {\n AfterContentChecked,\n AfterViewInit,\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n ContentChild,\n ContentChildren,\n Directive,\n ElementRef,\n EventEmitter,\n HostBinding,\n HostListener,\n Inject,\n InjectionToken,\n Injector,\n Input,\n NgZone,\n OnChanges,\n OnDestroy,\n OnInit,\n Optional,\n Output,\n QueryList,\n Renderer2,\n RendererStyleFlags2,\n SimpleChanges,\n SkipSelf,\n TemplateRef,\n ViewChild,\n ViewChildren,\n} from '@angular/core';\nimport { NavigationEnd, NavigationStart, Router } from '@angular/router';\nimport {\n IonBackButton,\n IonButtons,\n IonContent,\n IonFooter,\n IonHeader,\n IonRefresher,\n IonRouterOutlet,\n IonTitle,\n IonToolbar,\n NavController,\n} from '@ionic/angular/standalone';\nimport { Title } from '@angular/platform-browser';\nimport type { ScrollDetail } from '@ionic/core';\nimport { componentOnReady } from '@ionic/core';\nimport { selectedTabClickEvent, TabsComponent } from '@kirbydesign/designsystem/tabs';\nimport { Observable, Subject } from 'rxjs';\nimport { debounceTime, filter, map, takeUntil } from 'rxjs/operators';\n\nimport { ACTIONGROUP_CONFIG, ActionGroupConfig } from '@kirbydesign/designsystem/action-group';\nimport { KirbyConfig } from '@kirbydesign/designsystem/config';\nimport {\n HeaderActionsDirective,\n HeaderComponent,\n HeaderTitleActionIconDirective,\n} from '@kirbydesign/designsystem/header';\nimport { IonicElementPartHelper, KirbyAnimation } from '@kirbydesign/designsystem/helpers';\nimport {\n ModalElementComponent,\n ModalElementsAdvertiser,\n ModalElementType,\n ModalNavigationService,\n} from '@kirbydesign/designsystem/modal';\nimport {\n FitHeadingConfig,\n FitHeadingDirective,\n ResizeObserverService,\n TranslationService,\n} from '@kirbydesign/designsystem/shared';\nimport { UnobserveFn } from '@kirbydesign/designsystem/types';\nimport { getGlobalConfig } from '@kirbydesign/designsystem/config';\nimport { observeContent } from '@kirbydesign/designsystem/helpers';\nimport { NgClass, NgTemplateOutlet } from '@angular/common';\nimport { SpinnerComponent } from '@kirbydesign/designsystem/spinner';\n\n/**\n * Specify scroll event debounce time in ms and scrolled offset from top in pixels\n */\nconst contentScrollDebounceTimeInMS = 10;\nconst contentScrolledOffsetInPixels = 4;\n\ntype stickyConfig = { sticky: boolean };\ntype fixedConfig = { fixed: boolean };\ntype MaxWidth = 'default' | 'lg' | 'xl' | 'full';\n\nexport const PAGE_BACK_BUTTON_OVERRIDE = new InjectionToken<PageBackButtonOverride>(\n 'page-back-button-override'\n);\n\nexport interface PageBackButtonOverride {\n navigateBack: (\n routerOutlet: IonRouterOutlet,\n navCtrl: NavController,\n defaultBackHref: string\n ) => void;\n}\n\n/**\n * Event emitted when \"pull-to-refresh\" begins.\n */\nexport interface PullToRefreshEvent {\n /**\n * Invoke this callback-method when action to perform upon \"pull-to-refresh\" completes.\n */\n complete();\n}\n\n@Directive({ selector: '[kirbyPageTitle]' })\nexport class PageTitleDirective {}\n\n@Directive({ selector: '[kirbyPageSubtitle]' })\nexport class PageSubtitleDirective {}\n\n@Directive({ selector: '[kirbyPageToolbarTitle]' })\nexport class PageToolbarTitleDirective {}\n\n@Directive({ selector: '[kirbyPageActions]' })\nexport class PageActionsDirective {\n @Input('kirbyPageActions') config: stickyConfig | fixedConfig;\n private readonly stickyDefault = true;\n private readonly fixedDefault = false;\n\n constructor(public template: TemplateRef<any>) {\n console.warn(\n 'Defining Page Actions via *kirbyPageActions is deprecated and will be removed in Kirby v11. A Kirby Header with Actions should be used instead, as it has an improved API with better support for responsive layouts.'\n );\n }\n\n get isSticky(): boolean {\n return this.config ? (this.config as stickyConfig).sticky : this.stickyDefault;\n }\n\n get isFixed(): boolean {\n return this.config ? (this.config as fixedConfig).fixed : this.fixedDefault;\n }\n}\n\n@Directive({ selector: '[kirbyPageContent]' })\nexport class PageContentDirective {\n @Input('kirbyPageContent') config: fixedConfig;\n\n constructor(public template: TemplateRef<any>) {}\n\n get isFixed(): boolean {\n return this.config && this.config.fixed;\n }\n}\n\n@Directive({ selector: '[kirbyPageStickyContent]' })\nexport class PageStickyContentDirective {}\n\n@Component({\n selector: 'kirby-page-progress',\n template: `\n <ng-content></ng-content>\n `,\n styles: [\n `\n :host {\n display: flex;\n margin-inline-end: 4px; /* Add spacing to potential supplementary action button */\n }\n `,\n ],\n})\nexport class PageProgressComponent extends ModalElementComponent {\n // TODO: Find alternative implementation, which aligns with future page configuration / consumption\n // This implementation was chosen over expanding `moveChild` method in component wrapper with yet another scenario\n @HostBinding('attr.slot') slot = 'start';\n\n constructor(\n @Optional() modalElementsAdvertiser: ModalElementsAdvertiser,\n elementRef: ElementRef<HTMLElement>\n ) {\n super(ModalElementType.PAGE_PROGRESS, elementRef, modalElementsAdvertiser);\n }\n}\n@Component({\n selector: 'kirby-page-title',\n template: `\n <ng-content></ng-content>\n `,\n})\nexport class PageTitleComponent extends ModalElementComponent {\n constructor(\n elementRef: ElementRef<HTMLElement>,\n @Optional() modalElementsAdvertiser: ModalElementsAdvertiser\n ) {\n super(ModalElementType.TITLE, elementRef, modalElementsAdvertiser);\n }\n}\n\n@Component({\n selector: 'kirby-page-content',\n template: `\n <ng-content></ng-content>\n `,\n})\nexport class PageContentComponent {}\n\n@Component({\n selector: 'kirby-page-actions',\n template: `\n <ng-content select=\"button[kirby-button]\"></ng-content>\n `,\n styles: [\n `\n :host {\n display: inline-flex;\n column-gap: 8px;\n }\n `,\n ],\n})\nexport class PageActionsComponent {}\n\n@Component({\n selector: 'kirby-page',\n templateUrl: './page.component.html',\n styleUrls: ['./page.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n providers: [IonicElementPartHelper],\n imports: [\n IonHeader,\n IonToolbar,\n IonButtons,\n IonBackButton,\n IonTitle,\n NgTemplateOutlet,\n IonContent,\n IonRefresher,\n SpinnerComponent,\n NgClass,\n IonFooter,\n FitHeadingDirective,\n ],\n})\nexport class PageComponent\n implements OnInit, OnDestroy, AfterViewInit, AfterContentChecked, OnChanges\n{\n @Input() title: string;\n @Input() subtitle: string;\n @Input() toolbarTitle: string;\n @Input() titleAlignment: 'left' | 'center' | 'right' = 'left';\n @Input() defaultBackHref: string;\n @Input() hideBackButton: boolean;\n @Input() titleMaxLines: number;\n @Input() hasInteractiveTitle: boolean;\n\n @Input() set maxWidth(width: MaxWidth) {\n this._maxWidth = width;\n }\n\n get maxWidth(): MaxWidth {\n return this._maxWidth;\n }\n\n private _maxWidth: MaxWidth = 'default';\n\n private _tabBarBottomHidden: boolean;\n public get tabBarBottomHidden(): boolean {\n return this._tabBarBottomHidden;\n }\n @Input()\n public set tabBarBottomHidden(value: boolean) {\n if (this.tabsComponent) {\n // as we are setting a class on tabs, we need this to happen in a separate cd cycle\n setTimeout(() => {\n this.tabsComponent.tabBarBottomHidden = value;\n this.changeDetectorRef.markForCheck();\n });\n }\n this._tabBarBottomHidden = value;\n }\n\n @Output() enter = new EventEmitter<void>();\n @Output() leave = new EventEmitter<void>();\n @Output() refresh = new EventEmitter<PullToRefreshEvent>();\n @Output() backButtonClick = new EventEmitter<Event>();\n @Output() toolbarTitleClick = new EventEmitter<PointerEvent>();\n\n @ViewChild(IonContent, { static: true }) private content?: IonContent;\n @ViewChild(IonContent, { static: true, read: ElementRef })\n private ionContentElement: ElementRef<HTMLIonContentElement>;\n @ViewChild(IonHeader, { static: true, read: ElementRef })\n ionHeaderElement: ElementRef<HTMLIonHeaderElement>;\n @ViewChild(IonFooter, { static: true, read: ElementRef })\n private ionFooterElement: ElementRef<HTMLIonFooterElement>;\n @ViewChild(IonToolbar, { static: true, read: ElementRef })\n private ionToolbarElement: ElementRef<HTMLIonToolbarElement>;\n @ViewChildren(IonButtons, { read: ElementRef })\n private ionToolbarButtonsElement: QueryList<ElementRef<HTMLIonButtonsElement>>;\n @ViewChild(IonBackButton, { static: false })\n private backButton: IonBackButton;\n @ViewChild('pageTitle', { static: false, read: ElementRef })\n private pageTitle: ElementRef;\n @ViewChild('stickyContentContainer', { static: false, read: ElementRef })\n private stickyContentContainer: ElementRef;\n\n @ViewChild('simpleTitleTemplate', { static: true, read: TemplateRef })\n private simpleTitleTemplate: TemplateRef<any>;\n @ViewChild('simpleToolbarTitleTemplate', { static: true, read: TemplateRef })\n private simpleToolbarTitleTemplate: TemplateRef<any>;\n @ContentChild(PageToolbarTitleDirective, { static: false, read: TemplateRef })\n private customToolbarTitleTemplate: TemplateRef<any>;\n @ContentChild(PageTitleDirective, { static: false, read: TemplateRef })\n customTitleTemplate: TemplateRef<any>;\n @ContentChild(PageSubtitleDirective, { static: false, read: TemplateRef })\n customSubtitleTemplate: TemplateRef<any>;\n @ContentChildren(PageActionsDirective)\n customActions: QueryList<PageActionsDirective>;\n @ContentChildren(PageContentDirective)\n private customContent: QueryList<PageContentDirective>;\n @ContentChild(PageStickyContentDirective, { static: false, read: TemplateRef })\n private stickyContentRef: TemplateRef<any>;\n @ContentChild(HeaderComponent)\n header?: HeaderComponent;\n\n hasHeader: boolean;\n hasPageTitle: boolean;\n hasPageSubtitle: boolean;\n toolbarTitleVisible: boolean;\n toolbarActionsVisible: boolean;\n isContentScrolled: boolean;\n isStickyContentPinned = false;\n\n fitHeadingConfig: FitHeadingConfig;\n\n toolbarTitleTemplate: TemplateRef<any>;\n customContentTemplate: TemplateRef<any>;\n pageActionsTemplate: TemplateRef<any>;\n fixedContentTemplate: TemplateRef<any>;\n stickyActionsTemplate: TemplateRef<any>;\n fixedActionsTemplate: TemplateRef<any>;\n stickyContentTemplate: TemplateRef<PageStickyContentDirective>;\n headerActionsTemplate: TemplateRef<HeaderActionsDirective>;\n titleActionIconTemplate: TemplateRef<HeaderTitleActionIconDirective>;\n\n private titleIntersectionObserver?: IntersectionObserver;\n private stickyActionsIntersectionObserver?: IntersectionObserver;\n private stickyContentIntersectionObserver?: IntersectionObserver;\n private isObservingTitle = false;\n private isObservingActions = false;\n private isDocTitleSet = false;\n\n private unobserveTitleMutation: UnobserveFn;\n\n private url: string;\n private isActive: boolean;\n\n private ngOnDestroy$: Subject<void> = new Subject<void>();\n private contentScrolled$: Observable<ScrollDetail>;\n\n private navigationStart$: Observable<NavigationStart> = this.router.events.pipe(\n filter((event): event is NavigationStart => event instanceof NavigationStart),\n takeUntil(this.ngOnDestroy$)\n );\n\n private navigationEnd$: Observable<NavigationEnd> = this.router.events.pipe(\n filter((event): event is NavigationEnd => event instanceof NavigationEnd),\n takeUntil(this.ngOnDestroy$)\n );\n\n toolbarActionGroupInjector: Injector;\n\n constructor(\n private elementRef: ElementRef,\n private injector: Injector,\n private renderer: Renderer2,\n private router: Router,\n private changeDetectorRef: ChangeDetectorRef,\n private zone: NgZone,\n private modalNavigationService: ModalNavigationService,\n private resizeObserverService: ResizeObserverService,\n @Optional() @SkipSelf() private tabsComponent: TabsComponent,\n @Optional()\n @Inject(PAGE_BACK_BUTTON_OVERRIDE)\n private backButtonOverride: PageBackButtonOverride,\n @Optional()\n private routerOutlet: IonRouterOutlet,\n @Optional()\n private navCtrl: NavController,\n private ionicElementPartHelper: IonicElementPartHelper,\n public translations: TranslationService,\n private htmlDocTitle: Title\n ) {}\n\n private contentReadyPromise: Promise<void>;\n private whenContentReady() {\n if (!this.contentReadyPromise) {\n this.contentReadyPromise = new Promise((resolve) => {\n this.resizeObserverService.observe(this.ionContentElement, (entry) => {\n if (entry.contentRect.height > 0) {\n this.resizeObserverService.unobserve(this.ionContentElement);\n resolve();\n }\n });\n });\n }\n return this.contentReadyPromise;\n }\n\n ngOnInit(): void {\n this.removeWrapper();\n this.ionicElementPartHelper.setPart(\n 'background',\n this.ionToolbarElement,\n '.toolbar-background'\n );\n\n const actionGroupConfig: ActionGroupConfig = {\n isCondensed: true,\n maxVisibleActions: 1,\n };\n this.toolbarActionGroupInjector = Injector.create({\n providers: [\n {\n provide: ACTIONGROUP_CONFIG,\n useValue: actionGroupConfig,\n },\n ],\n parent: this.injector,\n });\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n if (changes.titleMaxLines) {\n this.fitHeadingConfig = {\n maxLines: changes.titleMaxLines.currentValue,\n };\n }\n if (changes.subtitle && !changes.subtitle.isFirstChange) {\n this.subtitle = changes.title.currentValue;\n this.hasPageSubtitle = this.subtitle !== undefined;\n }\n if (changes.title || changes.toolbarTitle) {\n this.setHTMLDocumentTitle(this.title || this.toolbarTitle);\n }\n }\n\n ngAfterViewInit(): void {\n this.zone.runOutsideAngular(() => {\n this.contentScrolled$ = this.content.ionScroll.pipe(\n debounceTime(contentScrollDebounceTimeInMS),\n map((event) => event.detail),\n takeUntil(this.ngOnDestroy$)\n );\n\n this.contentScrolled$.subscribe((scrollInfo: ScrollDetail) => {\n if (scrollInfo.scrollTop > contentScrolledOffsetInPixels !== this.isContentScrolled) {\n this.isContentScrolled = !this.isContentScrolled;\n this.changeDetectorRef.detectChanges();\n }\n });\n });\n\n // This instance has observed a page enter so register the correct url for this instance\n this.url = this.router.url;\n this.onEnter();\n\n // Watch navigation events for page enter and leave\n this.navigationStart$.subscribe((event: NavigationStart) => {\n if (\n this.getPathname(event.url) !== this.getPathname(this.url) &&\n !this.modalNavigationService.isModalRoute(this.url) &&\n !this.modalNavigationService.isModalRoute(event.url)\n ) {\n this.onLeave();\n }\n });\n\n this.navigationEnd$.subscribe((event: NavigationEnd) => {\n if (this.getPathname(event.urlAfterRedirects) === this.getPathname(this.url)) {\n this.onEnter();\n }\n });\n\n this.interceptBackButtonClicksSetup();\n this.initializeStickyIntersectionObserver();\n this.setActionButtonsWidth();\n }\n\n ngAfterContentChecked(): void {\n this.initializeHeader();\n this.initializeTitle();\n this.initializeActions();\n this.initializeContent();\n this.initializeStickyContent();\n this.changeDetectorRef.detectChanges();\n }\n\n ngOnDestroy(): void {\n this.ngOnDestroy$.next();\n this.ngOnDestroy$.complete();\n\n this.titleIntersectionObserver?.disconnect();\n this.stickyActionsIntersectionObserver?.disconnect();\n this.stickyContentIntersectionObserver?.disconnect();\n this.unobserveTitleMutation?.();\n }\n\n delegateRefreshEvent(event: any): void {\n this.refresh.emit({\n complete: event.target.complete.bind(event.target),\n });\n }\n\n getMaxWidthClasses() {\n if (!this.maxWidth) {\n return '';\n }\n if (this.maxWidth === 'default') {\n return '';\n }\n return `max-width-${this.maxWidth}`;\n }\n\n onTitleClick(event: PointerEvent) {\n if (this.toolbarTitleClick.observed) {\n this.toolbarTitleClick.emit(event);\n } else {\n this.header?.titleClick.emit(event);\n }\n }\n\n private removeWrapper() {\n const parent = this.elementRef.nativeElement.parentNode;\n this.renderer.removeChild(parent, this.elementRef.nativeElement);\n this.renderer.appendChild(parent, this.ionHeaderElement.nativeElement);\n this.renderer.appendChild(parent, this.ionContentElement.nativeElement);\n this.renderer.appendChild(parent, this.ionFooterElement.nativeElement);\n }\n\n private onEnter() {\n if (this.isActive) return;\n this.isActive = true;\n\n this.enter.emit();\n\n this.patchIonLastFocused();\n\n this.observeTitle();\n this.observeActions();\n this.setHTMLDocumentTitle(this.header?.title || this.title || this.toolbarTitle);\n this.observeTitleDOMChanges();\n }\n\n private onLeave() {\n if (!this.isActive) return;\n this.isActive = false;\n\n this.leave.emit();\n\n this.unobserveTitle();\n this.unobserveActions();\n this.unobserveTitleMutation?.();\n\n if (this.tabBarBottomHidden && this.tabsComponent) {\n this.tabsComponent.tabBarBottomHidden = false;\n }\n }\n\n private interceptBackButtonClicksSetup() {\n if (this.backButtonOverride) {\n this.backButton.onClick = (event: Event) => {\n event.preventDefault();\n this.backButtonOverride.navigateBack(this.routerOutlet, this.navCtrl, this.defaultBackHref);\n };\n }\n\n // Intercept back-button click events, defaulting to the built-in click-handler.\n if (this.backButtonClick.observers.length === 0) {\n this.backButtonClick\n .pipe(takeUntil(this.ngOnDestroy$))\n .subscribe(this.backButton.onClick.bind(this.backButton));\n }\n this.backButton.onClick = (event: Event) => {\n this.backButtonClick.emit(event);\n };\n }\n\n private patchIonLastFocused() {\n const ionLastFocus: HTMLElement =\n this.ionContentElement.nativeElement.querySelector('[ion-last-focus=\"true\"]');\n\n // When a focusManagerPriority is set, Ionic handles moving focus back to the element that presented the current view.\n // Unfortunately, we need to schedule a removal of tabindex=\"-1\" from ionLastFocus element after Ionic might have set it\n // to work around elements becoming inaccessible after navigating back: https://github.com/ionic-team/ionic-framework/issues/29875\n setTimeout(() => {\n if (ionLastFocus?.getAttribute('tabindex') !== '-1') return;\n this.renderer.removeAttribute(ionLastFocus, 'tabindex');\n });\n }\n\n private initializeStickyIntersectionObserver() {\n if (this.stickyContentTemplate) {\n // Sticky content present - start observing for stickiness\n if (!this.stickyContentIntersectionObserver) {\n this.stickyContentIntersectionObserver = this.createStickyContentIntersectionObserver();\n }\n setTimeout(() => {\n this.stickyContentIntersectionObserver.observe(this.stickyContentContainer.nativeElement);\n });\n }\n }\n\n private initializeHeader() {\n if (this.hasHeader === undefined && !!this.header) {\n this.hasHeader = true;\n // Header could later be removed from DOM (e.g. in virtual scrolling scenarios),\n // so store a reference to `header.titleActionIconTemplate` and `header.titleClick`:\n this.titleActionIconTemplate = this.header.titleActionIconTemplate;\n if (this.header.titleClick.observed && this.hasInteractiveTitle === undefined) {\n this.hasInteractiveTitle = true;\n }\n\n // Set document title from header immediately if present, then subscribe to changes\n this.setHTMLDocumentTitle(this.header.title);\n\n this.header.title$.pipe(takeUntil(this.ngOnDestroy$)).subscribe(() => {\n this.setHTMLDocumentTitle(this.header.title);\n });\n }\n }\n\n private initializeTitle() {\n if (this.hasHeader && this.isObservingTitle && !this.header?.titleElement) {\n // If we're already observing the header's title element, but it's no longer present,\n // it means it has been removed from DOM (e.g. in virtual scrolling scenarios).\n // Flip observing flag:\n this.isObservingTitle = false;\n }\n if (this.hasPageTitle) {\n if (!this.isObservingTitle && !!this.header?.titleElement) {\n // Header and title element re-attached to DOM - observe title:\n this.observeTitle();\n }\n\n // Ensures rest of initializeTitle() won't run, if already initialized\n return;\n }\n\n this.hasPageTitle =\n this.title !== undefined || !!this.customTitleTemplate || !!this.header?.title;\n this.toolbarTitleVisible = !this.hasPageTitle;\n this.hasPageSubtitle = this.subtitle !== undefined || !!this.customSubtitleTemplate;\n if (this.header?.title && !this.toolbarTitle) {\n this.toolbarTitle = this.header.title;\n this.header.title$.pipe(takeUntil(this.ngOnDestroy$)).subscribe((title) => {\n this.toolbarTitle = title;\n });\n }\n\n this.observeTitle();\n\n const defaultTitleTemplate = this.customTitleTemplate || this.simpleTitleTemplate;\n /* eslint-disable */\n // prettier-ignore\n this.toolbarTitleTemplate = this.customToolbarTitleTemplate\n ? this.customToolbarTitleTemplate\n : typeof this.toolbarTitle === 'string'\n ? this.simpleToolbarTitleTemplate\n : defaultTitleTemplate;\n\n if (this.toolbarTitleClick.observed && this.hasInteractiveTitle === undefined) {\n this.hasInteractiveTitle = true;\n }\n }\n\n private observeTitle() {\n if (!this.hasPageTitle) {\n // Nothing to observe\n return;\n }\n if (this.isObservingTitle) {\n // Already observing\n return;\n }\n\n // We are not actually observing the title until after the `whenContentReady` promise has resolved,\n // but since we've already checked that the page has a title in the guard above,\n // we'll - eagerly - set this flag now to prevent unnecessary re-runs of the rest of this method:\n this.isObservingTitle = true;\n\n if (!this.titleIntersectionObserver) {\n this.titleIntersectionObserver = new IntersectionObserver(\n (entries) => {\n // In rare scenarios we get more than 1 entry - use the last one:\n const lastEntry = entries[entries.length - 1];\n if (lastEntry) {\n const showToolbarTitle = !lastEntry.isIntersecting;\n // Only flip the flag and run Change Detection when changed:\n if (showToolbarTitle !== this.toolbarTitleVisible) {\n this.toolbarTitleVisible = showToolbarTitle;\n this.changeDetectorRef.detectChanges();\n }\n }\n },\n { root: this.ionContentElement.nativeElement }\n );\n }\n\n // Run outside Angular to prevent unnecessary triggering change detection\n // and - under certain conditions - an infinite loop when called within ngAfterContentChecked:\n this.zone.runOutsideAngular(() => {\n this.whenContentReady().then(() => {\n const titleElementRef = this.pageTitle || this.header?.titleElement;\n if (titleElementRef?.nativeElement) {\n this.titleIntersectionObserver.observe(titleElementRef.nativeElement);\n }\n });\n });\n }\n\n private unobserveTitle() {\n const titleElementRef = this.pageTitle || this.header?.titleElement;\n if (titleElementRef) {\n this.titleIntersectionObserver?.unobserve(titleElementRef.nativeElement);\n }\n this.isObservingTitle = false;\n }\n\n private observeTitleDOMChanges() {\n const globalKirbyConfig: KirbyConfig = getGlobalConfig();\n if (!globalKirbyConfig?.setHtmlDocTitle) return;\n if (this.isDocTitleSet) return; // we never want to observe if the document title is already set via any title properties (or already observed)\n\n const titleArea: HTMLElement | null = this.ionHeaderElement.nativeElement.querySelector(\n 'ion-toolbar ion-title .toolbar-title'\n );\n\n this.setHTMLDocumentTitle(titleArea.textContent);\n\n this.unobserveTitleMutation = observeContent(titleArea, () => {\n this.setHTMLDocumentTitle(titleArea.textContent);\n });\n }\n\n private setHTMLDocumentTitle(title: string) {\n const globalKirbyConfig: KirbyConfig = getGlobalConfig();\n if (!globalKirbyConfig?.setHtmlDocTitle || !title || title.trim() === '') return;\n this.htmlDocTitle.setTitle(title);\n this.isDocTitleSet = true;\n }\n\n private initializeActions() {\n if (this.headerActionsTemplate === undefined && !!this.header) {\n this.headerActionsTemplate = this.header.actionsTemplate;\n }\n if (this.hasHeader && this.isObservingActions && !this.header?.actionsElement) {\n // If we're already observing the header's actions element, but it's no longer present,\n // it means it has been removed from DOM (e.g. in virtual scrolling scenarios).\n // Flip observing flag:\n this.isObservingActions = false;\n }\n\n this.observeActions();\n\n this.customActions.forEach((pageAction) => {\n if (pageAction.isFixed) {\n this.fixedActionsTemplate = pageAction.template;\n } else if (pageAction.isSticky) {\n this.stickyActionsTemplate = pageAction.template;\n } else {\n this.pageActionsTemplate = pageAction.template;\n }\n });\n }\n\n private observeActions() {\n if (!this.header?.actionsElement) {\n // Nothing to observe\n return;\n }\n\n if (this.isObservingActions) {\n // Already observing\n return;\n }\n\n // We are not actually observing actions until after the `whenContentReady` promise has resolved,\n // but since we've already checked that there's an actions element present in the guard above,\n // we'll - eagerly - set this flag now to prevent unnecessary re-runs of the rest of this method:\n this.isObservingActions = true;\n\n if (!this.stickyActionsIntersectionObserver) {\n this.stickyActionsIntersectionObserver = new IntersectionObserver(\n (entries) => {\n // In rare scenarios we get more than 1 entry - use the last one:\n const lastEntry = entries[entries.length - 1];\n if (lastEntry) {\n const showToolbarActions = !lastEntry.isIntersecting;\n // Only flip the flag and run Change Detection when changed:\n if (showToolbarActions !== this.toolbarActionsVisible) {\n this.toolbarActionsVisible = showToolbarActions;\n this.changeDetectorRef.detectChanges();\n }\n }\n },\n { root: this.ionContentElement.nativeElement }\n );\n }\n\n // Run outside Angular to prevent unnecessary triggering change detection\n // and - under certain conditions - an infinite loop when called within ngAfterContentChecked:\n this.zone.runOutsideAngular(() => {\n this.whenContentReady().then(() => {\n if (this.header?.actionsElement?.nativeElement) {\n this.stickyActionsIntersectionObserver.observe(this.header.actionsElement.nativeElement);\n }\n });\n });\n }\n\n private unobserveActions() {\n if (this.header?.actionsElement) {\n this.stickyActionsIntersectionObserver?.unobserve(this.header.actionsElement.nativeElement);\n }\n this.isObservingActions = false;\n }\n\n private setActionButtonsWidth() {\n if (!this.ionToolbarButtonsElement) return;\n\n // Ensure ion-toolbar custom element has been defined (primarily when testing, but doesn't hurt):\n customElements.whenDefined(this.ionToolbarElement.nativeElement.localName).then(() => {\n // Ensure toolbar and buttons have been rendered and has dimensions:\n componentOnReady(this.ionToolbarElement.nativeElement, (toolbar) => {\n let startButtonsWidth = 0;\n let endButtonsWidth = 0;\n\n this.ionToolbarButtonsElement\n .map((ionButtonsElementRef) => ionButtonsElementRef.nativeElement)\n .forEach((ionButtonsElement) => {\n const style = getComputedStyle(ionButtonsElement);\n const margin = parseInt(style.marginLeft) + parseInt(style.marginRight);\n if (ionButtonsElement.getAttribute('slot') === 'start') {\n startButtonsWidth += ionButtonsElement.offsetWidth + margin;\n } else {\n endButtonsWidth += ionButtonsElement.offsetWidth + margin;\n }\n });\n\n const actionButtonsMaxWidth = Math.max(startButtonsWidth, endButtonsWidth);\n this.renderer.setStyle(\n toolbar,\n '--action-buttons-width',\n `${actionButtonsMaxWidth}px`,\n RendererStyleFlags2.DashCase\n );\n });\n });\n }\n\n private initializeContent() {\n this.customContent.forEach((content) => {\n if (content.isFixed) {\n this.fixedContentTemplate = content.template;\n } else {\n this.customContentTemplate = content.template;\n }\n });\n }\n\n private initializeStickyContent() {\n this.stickyContentTemplate = this.stickyContentRef;\n }\n\n private createStickyContentIntersectionObserver() {\n const options: IntersectionObserverInit = {\n root: this.ionContentElement.nativeElement,\n threshold: 1,\n };\n\n const callback: IntersectionObserverCallback = (entries) => {\n if (this.isStickyContentPinned !== !entries[0].isIntersecting) {\n this.isStickyContentPinned = !this.isStickyContentPinned;\n this.changeDetectorRef.detectChanges();\n }\n };\n return new IntersectionObserver(callback, options);\n }\n\n private getPathname(url: string) {\n return url.split('?')[0];\n }\n\n @HostListener('window:keyboardWillShow', ['$event'])\n _onKeyboardWillShow(info?: { keyboardHeight: number }) {\n if (info && info.keyboardHeight) {\n this.ionContentElement.nativeElement.style.setProperty(\n '--keyboard-offset',\n `${info.keyboardHeight}px`\n );\n }\n }\n\n @HostListener('window:keyboardWillHide')\n _onKeyboardWillHide() {\n this.ionContentElement.nativeElement.style.setProperty('--keyboard-offset', '0px');\n }\n\n @HostListener(`window:${selectedTabClickEvent}`)\n _onSelectedTabClick() {\n if (this.content) {\n this.content.scrollToTop(KirbyAnimation.Duration.LONG);\n }\n }\n}\n","<ion-header role=\"presentation\">\n <ion-toolbar\n [class.content-scrolled]=\"isContentScrolled\"\n [class.content-pinned]=\"isStickyContentPinned\"\n >\n <ion-buttons slot=\"start\">\n <ion-back-button\n text=\"\"\n [defaultHref]=\"defaultBackHref\"\n icon=\"assets/kirby/icons/svg/arrow-back.svg\"\n [style.visibility]=\"hideBackButton ? 'hidden' : null\"\n [attr.aria-label]=\"translations.get('back')\"\n ></ion-back-button>\n </ion-buttons>\n <ion-title [class.slide-and-fade-in]=\"toolbarTitleVisible\">\n <div class=\"toolbar-title\">\n @if (!titleActionIconTemplate && !hasInteractiveTitle) {\n <h1 class=\"kirby-text-normal-bold\">\n <ng-container *ngTemplateOutlet=\"toolbarTitleTemplate\"></ng-container>\n </h1>\n }\n @if (!!titleActionIconTemplate || hasInteractiveTitle) {\n <span\n [class.clickable]=\"hasInteractiveTitle\"\n [class.has-icon]=\"!!titleActionIconTemplate\"\n (click)=\"onTitleClick($event)\"\n >\n <h1 class=\"kirby-text-normal-bold\">\n <ng-container *ngTemplateOutlet=\"toolbarTitleTemplate\"></ng-container>\n </h1>\n <ng-container *ngTemplateOutlet=\"titleActionIconTemplate\"></ng-container>\n </span>\n }\n </div>\n </ion-title>\n @if (!!headerActionsTemplate) {\n <ion-buttons class=\"hide\" slot=\"primary\" [class.fade-in]=\"toolbarActionsVisible\">\n <ng-container\n *ngTemplateOutlet=\"headerActionsTemplate; injector: toolbarActionGroupInjector\"\n ></ng-container>\n </ion-buttons>\n }\n @if (!!stickyActionsTemplate) {\n <ion-buttons class=\"legacy-actions\" slot=\"primary\">\n <ng-container *ngTemplateOutlet=\"stickyActionsTemplate\"></ng-container>\n </ion-buttons>\n }\n @if (!!fixedActionsTemplate) {\n <ion-buttons class=\"legacy-actions\" slot=\"secondary\">\n <ng-container *ngTemplateOutlet=\"fixedActionsTemplate\"></ng-container>\n </ion-buttons>\n }\n </ion-toolbar>\n</ion-header>\n\n<ion-content\n scrollEvents=\"true\"\n forceOverscroll=\"false\"\n [class]=\"getMaxWidthClasses()\"\n [class.has-header]=\"hasHeader\"\n>\n @if (refresh.observers.length > 0) {\n <ion-refresher (ionRefresh)=\"delegateRefreshEvent($event)\" slot=\"fixed\">\n <kirby-spinner></kirby-spinner>\n </ion-refresher>\n }\n\n <!-- Page header -->\n @if (hasPageTitle && !hasHeader) {\n <div class=\"page-header-container\">\n <div\n class=\"page-header\"\n [ngClass]=\"{\n 'text-center': titleAlignment === 'center',\n 'text-right': titleAlignment === 'right',\n }\"\n >\n <div #pageTitle class=\"page-title\" [class.has-actions]=\"!!pageActionsTemplate\">\n <ng-container\n *ngTemplateOutlet=\"customTitleTemplate || defaultPageTitleTemplate\"\n ></ng-container>\n <ng-container\n *ngTemplateOutlet=\"pageActionsTemplate || defaultPageActionsTemplate\"\n ></ng-container>\n </div>\n @if (hasPageSubtitle) {\n <div class=\"page-subtitle\">\n <ng-container\n *ngTemplateOutlet=\"customSubtitleTemplate || defaultPageSubtitleTemplate\"\n ></ng-container>\n </div>\n }\n </div>\n </div>\n }\n\n <!-- Header -->\n @if (hasHeader) {\n <div class=\"page-header-container\">\n <ng-content select=\"kirby-header\"></ng-content>\n </div>\n }\n\n <!-- Sticky content -->\n @if (stickyContentTemplate) {\n <div\n #stickyContentContainer\n class=\"sticky-content-container\"\n [class.content-pinned]=\"isStickyContentPinned\"\n >\n <div>\n <ng-container *ngTemplateOutlet=\"stickyContentTemplate\"></ng-container>\n </div>\n </div>\n }\n\n <!-- Content -->\n <div class=\"content-inner\">\n <ng-container\n *ngTemplateOutlet=\"customContentTemplate || defaultContentTemplate\"\n ></ng-container>\n </div>\n\n @if (fixedContentTemplate) {\n <div slot=\"fixed\" class=\"fixed-content\">\n <div class=\"content-inner\">\n <ng-container *ngTemplateOutlet=\"fixedContentTemplate\"></ng-container>\n </div>\n </div>\n }\n</ion-content>\n\n<ion-footer>\n <ng-content select=\"kirby-page-footer\"></ng-content>\n</ion-footer>\n\n<ng-template #defaultPageTitleTemplate>\n <span [kirbyFitHeading]=\"fitHeadingConfig\" class=\"kirby-text-xlarge\">\n <ng-container *ngTemplateOutlet=\"simpleTitleTemplate\"></ng-container>\n </span>\n</ng-template>\n<ng-template #defaultPageSubtitleTemplate>\n <ng-container *ngTemplateOutlet=\"simpleSubtitleTemplate\"></ng-container>\n</ng-template>\n<ng-template #defaultPageActionsTemplate>\n <ng-content select=\"kirby-page-actions\"></ng-content>\n</ng-template>\n\n<ng-template #defaultContentTemplate>\n <ng-content select=\"kirby-page-content\"></ng-content>\n</ng-template>\n\n<ng-template #simpleTitleTemplate>{{ title }}</ng-template>\n<ng-template #simpleSubtitleTemplate>{{ subtitle }}</ng-template>\n<ng-template #simpleToolbarTitleTemplate>{{ toolbarTitle }}</ng-template>\n","import {\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n Input,\n OnDestroy,\n Optional,\n Renderer2,\n SkipSelf,\n} from '@angular/core';\n\nimport { PageComponent } from '../page.component';\n\n@Component({\n selector: 'kirby-page-footer',\n templateUrl: './page-footer.component.html',\n styleUrls: ['./page-footer.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class PageFooterComponent implements OnDestroy {\n @Input()\n hasPadding: boolean = true;\n\n constructor(\n @Optional() @SkipSelf() private pageComponent: PageComponent,\n private hostElement: ElementRef,\n private renderer: Renderer2\n ) {\n if (!pageComponent) {\n throw new Error('Page footer must reside inside of a Kirby page');\n }\n }\n\n close() {\n this.pageComponent.tabBarBottomHidden = false;\n this.renderer.removeChild(\n this.hostElement.nativeElement.parentElement,\n this.hostElement.nativeElement,\n true\n );\n }\n\n ngOnDestroy(): void {\n this.pageComponent.tabBarBottomHidden = false;\n }\n}\n","<div class=\"wrapper\" [class.padding]=\"hasPadding\">\n <ng-content></ng-content>\n</div>\n","import { CommonModule } from '@angular/common';\nimport { NgModule } from '@angular/core';\nimport { SpinnerModule } from '@kirbydesign/designsystem/spinner';\nimport { FitHeadingDirective } from '@kirbydesign/designsystem/shared';\n\nimport { HeaderModule } from '@kirbydesign/designsystem/header';\nimport {\n IonBackButton,\n IonButtons,\n IonContent,\n IonFooter,\n IonHeader,\n IonRefresher,\n IonTitle,\n IonToolbar,\n} from '@ionic/angular/standalone';\nimport { PageFooterComponent } from './page-footer/page-footer.component';\nimport {\n PageActionsComponent,\n PageActionsDirective,\n PageComponent,\n PageContentComponent,\n PageContentDirective,\n PageProgressComponent,\n PageStickyContentDirective,\n PageSubtitleDirective,\n PageTitleComponent,\n PageTitleDirective,\n PageToolbarTitleDirective,\n} from './page.component';\n\n@NgModule({\n imports: [\n CommonModule,\n FitHeadingDirective,\n SpinnerModule,\n HeaderModule,\n IonHeader,\n IonToolbar,\n IonButtons,\n IonBackButton,\n IonContent,\n IonTitle,\n IonRefresher,\n IonFooter,\n PageComponent,\n PageActionsComponent,\n PageActionsDirective,\n PageContentComponent,\n PageFooterComponent,\n PageContentDirective,\n PageProgressComponent,\n PageTitleComponent,\n PageTitleDirective,\n PageSubtitleDirective,\n PageToolbarTitleDirective,\n PageStickyContentDirective,\n ],\n exports: [\n PageComponent,\n PageActionsComponent,\n PageActionsDirective,\n PageContentComponent,\n PageFooterComponent,\n PageContentDirective,\n PageProgressComponent,\n PageTitleComponent,\n PageTitleDirective,\n PageSubtitleDirective,\n PageToolbarTitleDirective,\n FitHeadingDirective,\n PageStickyContentDirective,\n ],\n})\nexport class PageModule {}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public_api';\n"],"names":["i1.PageComponent"],"mappings":"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"}
1
+ {"version":3,"file":"kirbydesign-designsystem-page.mjs","sources":["../../page/src/page.component.ts","../../page/src/page.component.html","../../page/src/page-footer/page-footer.component.ts","../../page/src/page-footer/page-footer.component.html","../../page/src/page.module.ts","../../page/src/kirbydesign-designsystem-page.ts"],"sourcesContent":["import {\n AfterContentChecked,\n AfterViewInit,\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n ContentChild,\n ContentChildren,\n Directive,\n ElementRef,\n EventEmitter,\n HostBinding,\n HostListener,\n Inject,\n InjectionToken,\n Injector,\n Input,\n NgZone,\n OnChanges,\n OnDestroy,\n OnInit,\n Optional,\n Output,\n QueryList,\n Renderer2,\n RendererStyleFlags2,\n SimpleChanges,\n SkipSelf,\n TemplateRef,\n ViewChild,\n ViewChildren,\n} from '@angular/core';\nimport { NavigationEnd, NavigationStart, Router } from '@angular/router';\nimport {\n IonBackButton,\n IonButtons,\n IonContent,\n IonFooter,\n IonHeader,\n IonRefresher,\n IonRouterOutlet,\n IonTitle,\n IonToolbar,\n NavController,\n ScrollDetail,\n} from '@ionic/angular';\nimport { Title } from '@angular/platform-browser';\nimport { componentOnReady } from '@ionic/core';\nimport { selectedTabClickEvent, TabsComponent } from '@kirbydesign/designsystem/tabs';\nimport { fromEvent, Observable, Subject } from 'rxjs';\nimport { debounceTime, filter, map, takeUntil } from 'rxjs/operators';\n\nimport { ACTIONGROUP_CONFIG, ActionGroupConfig } from '@kirbydesign/designsystem/action-group';\nimport { KirbyConfig } from '@kirbydesign/designsystem/config';\nimport {\n HeaderActionsDirective,\n HeaderComponent,\n HeaderTitleActionIconDirective,\n} from '@kirbydesign/designsystem/header';\nimport { IonicElementPartHelper, KirbyAnimation } from '@kirbydesign/designsystem/helpers';\nimport {\n ModalElementComponent,\n ModalElementsAdvertiser,\n ModalElementType,\n ModalNavigationService,\n} from '@kirbydesign/designsystem/modal';\nimport {\n FitHeadingConfig,\n FitHeadingDirective,\n ResizeObserverService,\n TranslationService,\n} from '@kirbydesign/designsystem/shared';\nimport { UnobserveFn } from '@kirbydesign/designsystem/types';\nimport { getGlobalConfig } from '@kirbydesign/designsystem/config';\nimport { observeContent } from '@kirbydesign/designsystem/helpers';\nimport { NgClass, NgTemplateOutlet } from '@angular/common';\nimport { SpinnerComponent } from '@kirbydesign/designsystem/spinner';\n\n/**\n * Specify scroll event debounce time in ms and scrolled offset from top in pixels\n */\nconst contentScrollDebounceTimeInMS = 10;\nconst contentScrolledOffsetInPixels = 4;\n\ntype stickyConfig = { sticky: boolean };\ntype fixedConfig = { fixed: boolean };\ntype MaxWidth = 'default' | 'lg' | 'xl' | 'full';\n\nexport const PAGE_BACK_BUTTON_OVERRIDE = new InjectionToken<PageBackButtonOverride>(\n 'page-back-button-override'\n);\n\nexport interface PageBackButtonOverride {\n navigateBack: (\n routerOutlet: IonRouterOutlet,\n navCtrl: NavController,\n defaultBackHref: string\n ) => void;\n}\n\n/**\n * Event emitted when \"pull-to-refresh\" begins.\n */\nexport interface PullToRefreshEvent {\n /**\n * Invoke this callback-method when action to perform upon \"pull-to-refresh\" completes.\n */\n complete();\n}\n\n@Directive({ selector: '[kirbyPageTitle]' })\nexport class PageTitleDirective {}\n\n@Directive({ selector: '[kirbyPageSubtitle]' })\nexport class PageSubtitleDirective {}\n\n@Directive({ selector: '[kirbyPageToolbarTitle]' })\nexport class PageToolbarTitleDirective {}\n\n@Directive({ selector: '[kirbyPageActions]' })\nexport class PageActionsDirective {\n @Input('kirbyPageActions') config: stickyConfig | fixedConfig;\n private readonly stickyDefault = true;\n private readonly fixedDefault = false;\n\n constructor(public template: TemplateRef<any>) {\n console.warn(\n 'Defining Page Actions via *kirbyPageActions is deprecated and will be removed in Kirby v11. A Kirby Header with Actions should be used instead, as it has an improved API with better support for responsive layouts.'\n );\n }\n\n get isSticky(): boolean {\n return this.config ? (this.config as stickyConfig).sticky : this.stickyDefault;\n }\n\n get isFixed(): boolean {\n return this.config ? (this.config as fixedConfig).fixed : this.fixedDefault;\n }\n}\n\n@Directive({ selector: '[kirbyPageContent]' })\nexport class PageContentDirective {\n @Input('kirbyPageContent') config: fixedConfig;\n\n constructor(public template: TemplateRef<any>) {}\n\n get isFixed(): boolean {\n return this.config && this.config.fixed;\n }\n}\n\n@Directive({ selector: '[kirbyPageStickyContent]' })\nexport class PageStickyContentDirective {}\n\n@Component({\n selector: 'kirby-page-progress',\n template: `\n <ng-content></ng-content>\n `,\n styles: [\n `\n :host {\n display: flex;\n margin-inline-end: 4px; /* Add spacing to potential supplementary action button */\n }\n `,\n ],\n})\nexport class PageProgressComponent extends ModalElementComponent {\n // TODO: Find alternative implementation, which aligns with future page configuration / consumption\n // This implementation was chosen over expanding `moveChild` method in component wrapper with yet another scenario\n @HostBinding('attr.slot') slot = 'start';\n\n constructor(\n @Optional() modalElementsAdvertiser: ModalElementsAdvertiser,\n elementRef: ElementRef<HTMLElement>\n ) {\n super(ModalElementType.PAGE_PROGRESS, elementRef, modalElementsAdvertiser);\n }\n}\n@Component({\n selector: 'kirby-page-title',\n template: `\n <ng-content></ng-content>\n `,\n})\nexport class PageTitleComponent extends ModalElementComponent {\n constructor(\n elementRef: ElementRef<HTMLElement>,\n @Optional() modalElementsAdvertiser: ModalElementsAdvertiser\n ) {\n super(ModalElementType.TITLE, elementRef, modalElementsAdvertiser);\n }\n}\n\n@Component({\n selector: 'kirby-page-content',\n template: `\n <ng-content></ng-content>\n `,\n})\nexport class PageContentComponent {}\n\n@Component({\n selector: 'kirby-page-actions',\n template: `\n <ng-content select=\"button[kirby-button]\"></ng-content>\n `,\n styles: [\n `\n :host {\n display: inline-flex;\n column-gap: 8px;\n }\n `,\n ],\n})\nexport class PageActionsComponent {}\n\n@Component({\n selector: 'kirby-page',\n templateUrl: './page.component.html',\n styleUrls: ['./page.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n providers: [IonicElementPartHelper],\n imports: [\n IonHeader,\n IonToolbar,\n IonButtons,\n IonBackButton,\n IonTitle,\n NgTemplateOutlet,\n IonContent,\n IonRefresher,\n SpinnerComponent,\n NgClass,\n IonFooter,\n FitHeadingDirective,\n ],\n})\nexport class PageComponent\n implements OnInit, OnDestroy, AfterViewInit, AfterContentChecked, OnChanges\n{\n @Input() title: string;\n @Input() subtitle: string;\n @Input() toolbarTitle: string;\n @Input() titleAlignment: 'left' | 'center' | 'right' = 'left';\n @Input() defaultBackHref: string;\n @Input() hideBackButton: boolean;\n @Input() titleMaxLines: number;\n @Input() hasInteractiveTitle: boolean;\n\n @Input() set maxWidth(width: MaxWidth) {\n this._maxWidth = width;\n }\n\n get maxWidth(): MaxWidth {\n return this._maxWidth;\n }\n\n private _maxWidth: MaxWidth = 'default';\n\n private _tabBarBottomHidden: boolean;\n public get tabBarBottomHidden(): boolean {\n return this._tabBarBottomHidden;\n }\n @Input()\n public set tabBarBottomHidden(value: boolean) {\n if (this.tabsComponent) {\n // as we are setting a class on tabs, we need this to happen in a separate cd cycle\n setTimeout(() => {\n this.tabsComponent.tabBarBottomHidden = value;\n this.changeDetectorRef.markForCheck();\n });\n }\n this._tabBarBottomHidden = value;\n }\n\n @Output() enter = new EventEmitter<void>();\n @Output() leave = new EventEmitter<void>();\n @Output() refresh = new EventEmitter<PullToRefreshEvent>();\n @Output() backButtonClick = new EventEmitter<Event>();\n @Output() toolbarTitleClick = new EventEmitter<PointerEvent>();\n\n @ViewChild(IonContent, { static: true }) private content?: IonContent;\n @ViewChild(IonContent, { static: true, read: ElementRef })\n private ionContentElement: ElementRef<HTMLIonContentElement>;\n @ViewChild(IonHeader, { static: true, read: ElementRef })\n ionHeaderElement: ElementRef<HTMLIonHeaderElement>;\n @ViewChild(IonFooter, { static: true, read: ElementRef })\n private ionFooterElement: ElementRef<HTMLIonFooterElement>;\n @ViewChild(IonToolbar, { static: true, read: ElementRef })\n private ionToolbarElement: ElementRef<HTMLIonToolbarElement>;\n @ViewChildren(IonButtons, { read: ElementRef })\n private ionToolbarButtonsElement: QueryList<ElementRef<HTMLIonButtonsElement>>;\n @ViewChild(IonBackButton, { static: false })\n private backButton: IonBackButton;\n @ViewChild('pageTitle', { static: false, read: ElementRef })\n private pageTitle: ElementRef;\n @ViewChild('stickyContentContainer', { static: false, read: ElementRef })\n private stickyContentContainer: ElementRef;\n\n @ViewChild('simpleTitleTemplate', { static: true, read: TemplateRef })\n private simpleTitleTemplate: TemplateRef<any>;\n @ViewChild('simpleToolbarTitleTemplate', { static: true, read: TemplateRef })\n private simpleToolbarTitleTemplate: TemplateRef<any>;\n @ContentChild(PageToolbarTitleDirective, { static: false, read: TemplateRef })\n private customToolbarTitleTemplate: TemplateRef<any>;\n @ContentChild(PageTitleDirective, { static: false, read: TemplateRef })\n customTitleTemplate: TemplateRef<any>;\n @ContentChild(PageSubtitleDirective, { static: false, read: TemplateRef })\n customSubtitleTemplate: TemplateRef<any>;\n @ContentChildren(PageActionsDirective)\n customActions: QueryList<PageActionsDirective>;\n @ContentChildren(PageContentDirective)\n private customContent: QueryList<PageContentDirective>;\n @ContentChild(PageStickyContentDirective, { static: false, read: TemplateRef })\n private stickyContentRef: TemplateRef<any>;\n @ContentChild(HeaderComponent)\n header?: HeaderComponent;\n\n hasHeader: boolean;\n hasPageTitle: boolean;\n hasPageSubtitle: boolean;\n toolbarTitleVisible: boolean;\n toolbarActionsVisible: boolean;\n isContentScrolled: boolean;\n isStickyContentPinned = false;\n\n fitHeadingConfig: FitHeadingConfig;\n\n toolbarTitleTemplate: TemplateRef<any>;\n customContentTemplate: TemplateRef<any>;\n pageActionsTemplate: TemplateRef<any>;\n fixedContentTemplate: TemplateRef<any>;\n stickyActionsTemplate: TemplateRef<any>;\n fixedActionsTemplate: TemplateRef<any>;\n stickyContentTemplate: TemplateRef<PageStickyContentDirective>;\n headerActionsTemplate: TemplateRef<HeaderActionsDirective>;\n titleActionIconTemplate: TemplateRef<HeaderTitleActionIconDirective>;\n\n private titleIntersectionObserver?: IntersectionObserver;\n private stickyActionsIntersectionObserver?: IntersectionObserver;\n private stickyContentIntersectionObserver?: IntersectionObserver;\n private isObservingTitle = false;\n private isObservingActions = false;\n private isDocTitleSet = false;\n\n private unobserveTitleMutation: UnobserveFn;\n\n private url: string;\n private isActive: boolean;\n\n private ngOnDestroy$: Subject<void> = new Subject<void>();\n private contentScrolled$: Observable<ScrollDetail>;\n\n private navigationStart$: Observable<NavigationStart> = this.router.events.pipe(\n filter((event): event is NavigationStart => event instanceof NavigationStart),\n takeUntil(this.ngOnDestroy$)\n );\n\n private navigationEnd$: Observable<NavigationEnd> = this.router.events.pipe(\n filter((event): event is NavigationEnd => event instanceof NavigationEnd),\n takeUntil(this.ngOnDestroy$)\n );\n\n toolbarActionGroupInjector: Injector;\n\n constructor(\n private elementRef: ElementRef,\n private injector: Injector,\n private renderer: Renderer2,\n private router: Router,\n private changeDetectorRef: ChangeDetectorRef,\n private zone: NgZone,\n private modalNavigationService: ModalNavigationService,\n private resizeObserverService: ResizeObserverService,\n @Optional() @SkipSelf() private tabsComponent: TabsComponent,\n @Optional()\n @Inject(PAGE_BACK_BUTTON_OVERRIDE)\n private backButtonOverride: PageBackButtonOverride,\n @Optional()\n private routerOutlet: IonRouterOutlet,\n @Optional()\n private navCtrl: NavController,\n private ionicElementPartHelper: IonicElementPartHelper,\n public translations: TranslationService,\n private htmlDocTitle: Title\n ) {}\n\n private contentReadyPromise: Promise<void>;\n private whenContentReady() {\n if (!this.contentReadyPromise) {\n this.contentReadyPromise = new Promise((resolve) => {\n this.resizeObserverService.observe(this.ionContentElement, (entry) => {\n if (entry.contentRect.height > 0) {\n this.resizeObserverService.unobserve(this.ionContentElement);\n resolve();\n }\n });\n });\n }\n return this.contentReadyPromise;\n }\n\n ngOnInit(): void {\n this.removeWrapper();\n this.ionicElementPartHelper.setPart(\n 'background',\n this.ionToolbarElement,\n '.toolbar-background'\n );\n\n const actionGroupConfig: ActionGroupConfig = {\n isCondensed: true,\n maxVisibleActions: 1,\n };\n this.toolbarActionGroupInjector = Injector.create({\n providers: [\n {\n provide: ACTIONGROUP_CONFIG,\n useValue: actionGroupConfig,\n },\n ],\n parent: this.injector,\n });\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n if (changes.titleMaxLines) {\n this.fitHeadingConfig = {\n maxLines: changes.titleMaxLines.currentValue,\n };\n }\n if (changes.subtitle && !changes.subtitle.isFirstChange) {\n this.subtitle = changes.title.currentValue;\n this.hasPageSubtitle = this.subtitle !== undefined;\n }\n if (changes.title || changes.toolbarTitle) {\n this.setHTMLDocumentTitle(this.title || this.toolbarTitle);\n }\n }\n\n ngAfterViewInit(): void {\n this.zone.runOutsideAngular(() => {\n this.contentScrolled$ = fromEvent<CustomEvent<ScrollDetail>>(\n this.ionContentElement.nativeElement,\n 'ionScroll'\n ).pipe(\n debounceTime(contentScrollDebounceTimeInMS),\n map((event) => event.detail),\n takeUntil(this.ngOnDestroy$)\n );\n\n this.contentScrolled$.subscribe((scrollInfo: ScrollDetail) => {\n if (scrollInfo.scrollTop > contentScrolledOffsetInPixels !== this.isContentScrolled) {\n this.isContentScrolled = !this.isContentScrolled;\n this.changeDetectorRef.detectChanges();\n }\n });\n });\n\n // This instance has observed a page enter so register the correct url for this instance\n this.url = this.router.url;\n this.onEnter();\n\n // Watch navigation events for page enter and leave\n this.navigationStart$.subscribe((event: NavigationStart) => {\n if (\n this.getPathname(event.url) !== this.getPathname(this.url) &&\n !this.modalNavigationService.isModalRoute(this.url) &&\n !this.modalNavigationService.isModalRoute(event.url)\n ) {\n this.onLeave();\n }\n });\n\n this.navigationEnd$.subscribe((event: NavigationEnd) => {\n if (this.getPathname(event.urlAfterRedirects) === this.getPathname(this.url)) {\n this.onEnter();\n }\n });\n\n this.interceptBackButtonClicksSetup();\n this.initializeStickyIntersectionObserver();\n this.setActionButtonsWidth();\n }\n\n ngAfterContentChecked(): void {\n this.initializeHeader();\n this.initializeTitle();\n this.initializeActions();\n this.initializeContent();\n this.initializeStickyContent();\n this.changeDetectorRef.detectChanges();\n }\n\n ngOnDestroy(): void {\n this.ngOnDestroy$.next();\n this.ngOnDestroy$.complete();\n\n this.titleIntersectionObserver?.disconnect();\n this.stickyActionsIntersectionObserver?.disconnect();\n this.stickyContentIntersectionObserver?.disconnect();\n this.unobserveTitleMutation?.();\n }\n\n delegateRefreshEvent(event: any): void {\n this.refresh.emit({\n complete: event.target.complete.bind(event.target),\n });\n }\n\n getMaxWidthClasses() {\n if (!this.maxWidth) {\n return '';\n }\n if (this.maxWidth === 'default') {\n return '';\n }\n return `max-width-${this.maxWidth}`;\n }\n\n onTitleClick(event: PointerEvent) {\n if (this.toolbarTitleClick.observed) {\n this.toolbarTitleClick.emit(event);\n } else {\n this.header?.titleClick.emit(event);\n }\n }\n\n private removeWrapper() {\n const parent = this.elementRef.nativeElement.parentNode;\n this.renderer.removeChild(parent, this.elementRef.nativeElement);\n this.renderer.appendChild(parent, this.ionHeaderElement.nativeElement);\n this.renderer.appendChild(parent, this.ionContentElement.nativeElement);\n this.renderer.appendChild(parent, this.ionFooterElement.nativeElement);\n }\n\n private onEnter() {\n if (this.isActive) return;\n this.isActive = true;\n\n this.enter.emit();\n\n this.patchIonLastFocused();\n\n this.observeTitle();\n this.observeActions();\n this.setHTMLDocumentTitle(this.header?.title || this.title || this.toolbarTitle);\n this.observeTitleDOMChanges();\n }\n\n private onLeave() {\n if (!this.isActive) return;\n this.isActive = false;\n\n this.leave.emit();\n\n this.unobserveTitle();\n this.unobserveActions();\n this.unobserveTitleMutation?.();\n\n if (this.tabBarBottomHidden && this.tabsComponent) {\n this.tabsComponent.tabBarBottomHidden = false;\n }\n }\n\n private interceptBackButtonClicksSetup() {\n if (this.backButtonOverride) {\n this.backButton.onClick = (event: Event) => {\n event.preventDefault();\n this.backButtonOverride.navigateBack(this.routerOutlet, this.navCtrl, this.defaultBackHref);\n };\n }\n\n // Intercept back-button click events, defaulting to the built-in click-handler.\n if (this.backButtonClick.observers.length === 0) {\n this.backButtonClick\n .pipe(takeUntil(this.ngOnDestroy$))\n .subscribe(this.backButton.onClick.bind(this.backButton));\n }\n this.backButton.onClick = (event: Event) => {\n this.backButtonClick.emit(event);\n };\n }\n\n private patchIonLastFocused() {\n const ionLastFocus: HTMLElement =\n this.ionContentElement.nativeElement.querySelector('[ion-last-focus=\"true\"]');\n\n // When a focusManagerPriority is set, Ionic handles moving focus back to the element that presented the current view.\n // Unfortunately, we need to schedule a removal of tabindex=\"-1\" from ionLastFocus element after Ionic might have set it\n // to work around elements becoming inaccessible after navigating back: https://github.com/ionic-team/ionic-framework/issues/29875\n setTimeout(() => {\n if (ionLastFocus?.getAttribute('tabindex') !== '-1') return;\n this.renderer.removeAttribute(ionLastFocus, 'tabindex');\n });\n }\n\n private initializeStickyIntersectionObserver() {\n if (this.stickyContentTemplate) {\n // Sticky content present - start observing for stickiness\n if (!this.stickyContentIntersectionObserver) {\n this.stickyContentIntersectionObserver = this.createStickyContentIntersectionObserver();\n }\n setTimeout(() => {\n this.stickyContentIntersectionObserver.observe(this.stickyContentContainer.nativeElement);\n });\n }\n }\n\n private initializeHeader() {\n if (this.hasHeader === undefined && !!this.header) {\n this.hasHeader = true;\n // Header could later be removed from DOM (e.g. in virtual scrolling scenarios),\n // so store a reference to `header.titleActionIconTemplate` and `header.titleClick`:\n this.titleActionIconTemplate = this.header.titleActionIconTemplate;\n if (this.header.titleClick.observed && this.hasInteractiveTitle === undefined) {\n this.hasInteractiveTitle = true;\n }\n\n // Set document title from header immediately if present, then subscribe to changes\n this.setHTMLDocumentTitle(this.header.title);\n\n this.header.title$.pipe(takeUntil(this.ngOnDestroy$)).subscribe(() => {\n this.setHTMLDocumentTitle(this.header.title);\n });\n }\n }\n\n private initializeTitle() {\n if (this.hasHeader && this.isObservingTitle && !this.header?.titleElement) {\n // If we're already observing the header's title element, but it's no longer present,\n // it means it has been removed from DOM (e.g. in virtual scrolling scenarios).\n // Flip observing flag:\n this.isObservingTitle = false;\n }\n if (this.hasPageTitle) {\n if (!this.isObservingTitle && !!this.header?.titleElement) {\n // Header and title element re-attached to DOM - observe title:\n this.observeTitle();\n }\n\n // Ensures rest of initializeTitle() won't run, if already initialized\n return;\n }\n\n this.hasPageTitle =\n this.title !== undefined || !!this.customTitleTemplate || !!this.header?.title;\n this.toolbarTitleVisible = !this.hasPageTitle;\n this.hasPageSubtitle = this.subtitle !== undefined || !!this.customSubtitleTemplate;\n if (this.header?.title && !this.toolbarTitle) {\n this.toolbarTitle = this.header.title;\n this.header.title$.pipe(takeUntil(this.ngOnDestroy$)).subscribe((title) => {\n this.toolbarTitle = title;\n });\n }\n\n this.observeTitle();\n\n const defaultTitleTemplate = this.customTitleTemplate || this.simpleTitleTemplate;\n /* eslint-disable */\n // prettier-ignore\n this.toolbarTitleTemplate = this.customToolbarTitleTemplate\n ? this.customToolbarTitleTemplate\n : typeof this.toolbarTitle === 'string'\n ? this.simpleToolbarTitleTemplate\n : defaultTitleTemplate;\n\n if (this.toolbarTitleClick.observed && this.hasInteractiveTitle === undefined) {\n this.hasInteractiveTitle = true;\n }\n }\n\n private observeTitle() {\n if (!this.hasPageTitle) {\n // Nothing to observe\n return;\n }\n if (this.isObservingTitle) {\n // Already observing\n return;\n }\n\n // We are not actually observing the title until after the `whenContentReady` promise has resolved,\n // but since we've already checked that the page has a title in the guard above,\n // we'll - eagerly - set this flag now to prevent unnecessary re-runs of the rest of this method:\n this.isObservingTitle = true;\n\n if (!this.titleIntersectionObserver) {\n this.titleIntersectionObserver = new IntersectionObserver(\n (entries) => {\n // In rare scenarios we get more than 1 entry - use the last one:\n const lastEntry = entries[entries.length - 1];\n if (lastEntry) {\n const showToolbarTitle = !lastEntry.isIntersecting;\n // Only flip the flag and run Change Detection when changed:\n if (showToolbarTitle !== this.toolbarTitleVisible) {\n this.toolbarTitleVisible = showToolbarTitle;\n this.changeDetectorRef.detectChanges();\n }\n }\n },\n { root: this.ionContentElement.nativeElement }\n );\n }\n\n // Run outside Angular to prevent unnecessary triggering change detection\n // and - under certain conditions - an infinite loop when called within ngAfterContentChecked:\n this.zone.runOutsideAngular(() => {\n this.whenContentReady().then(() => {\n const titleElementRef = this.pageTitle || this.header?.titleElement;\n if (titleElementRef?.nativeElement) {\n this.titleIntersectionObserver.observe(titleElementRef.nativeElement);\n }\n });\n });\n }\n\n private unobserveTitle() {\n const titleElementRef = this.pageTitle || this.header?.titleElement;\n if (titleElementRef) {\n this.titleIntersectionObserver?.unobserve(titleElementRef.nativeElement);\n }\n this.isObservingTitle = false;\n }\n\n private observeTitleDOMChanges() {\n const globalKirbyConfig: KirbyConfig = getGlobalConfig();\n if (!globalKirbyConfig?.setHtmlDocTitle) return;\n if (this.isDocTitleSet) return; // we never want to observe if the document title is already set via any title properties (or already observed)\n\n const titleArea: HTMLElement | null = this.ionHeaderElement.nativeElement.querySelector(\n 'ion-toolbar ion-title .toolbar-title'\n );\n\n this.setHTMLDocumentTitle(titleArea.textContent);\n\n this.unobserveTitleMutation = observeContent(titleArea, () => {\n this.setHTMLDocumentTitle(titleArea.textContent);\n });\n }\n\n private setHTMLDocumentTitle(title: string) {\n const globalKirbyConfig: KirbyConfig = getGlobalConfig();\n if (!globalKirbyConfig?.setHtmlDocTitle || !title || title.trim() === '') return;\n this.htmlDocTitle.setTitle(title);\n this.isDocTitleSet = true;\n }\n\n private initializeActions() {\n if (this.headerActionsTemplate === undefined && !!this.header) {\n this.headerActionsTemplate = this.header.actionsTemplate;\n }\n if (this.hasHeader && this.isObservingActions && !this.header?.actionsElement) {\n // If we're already observing the header's actions element, but it's no longer present,\n // it means it has been removed from DOM (e.g. in virtual scrolling scenarios).\n // Flip observing flag:\n this.isObservingActions = false;\n }\n\n this.observeActions();\n\n this.customActions.forEach((pageAction) => {\n if (pageAction.isFixed) {\n this.fixedActionsTemplate = pageAction.template;\n } else if (pageAction.isSticky) {\n this.stickyActionsTemplate = pageAction.template;\n } else {\n this.pageActionsTemplate = pageAction.template;\n }\n });\n }\n\n private observeActions() {\n if (!this.header?.actionsElement) {\n // Nothing to observe\n return;\n }\n\n if (this.isObservingActions) {\n // Already observing\n return;\n }\n\n // We are not actually observing actions until after the `whenContentReady` promise has resolved,\n // but since we've already checked that there's an actions element present in the guard above,\n // we'll - eagerly - set this flag now to prevent unnecessary re-runs of the rest of this method:\n this.isObservingActions = true;\n\n if (!this.stickyActionsIntersectionObserver) {\n this.stickyActionsIntersectionObserver = new IntersectionObserver(\n (entries) => {\n // In rare scenarios we get more than 1 entry - use the last one:\n const lastEntry = entries[entries.length - 1];\n if (lastEntry) {\n const showToolbarActions = !lastEntry.isIntersecting;\n // Only flip the flag and run Change Detection when changed:\n if (showToolbarActions !== this.toolbarActionsVisible) {\n this.toolbarActionsVisible = showToolbarActions;\n this.changeDetectorRef.detectChanges();\n }\n }\n },\n { root: this.ionContentElement.nativeElement }\n );\n }\n\n // Run outside Angular to prevent unnecessary triggering change detection\n // and - under certain conditions - an infinite loop when called within ngAfterContentChecked:\n this.zone.runOutsideAngular(() => {\n this.whenContentReady().then(() => {\n if (this.header?.actionsElement?.nativeElement) {\n this.stickyActionsIntersectionObserver.observe(this.header.actionsElement.nativeElement);\n }\n });\n });\n }\n\n private unobserveActions() {\n if (this.header?.actionsElement) {\n this.stickyActionsIntersectionObserver?.unobserve(this.header.actionsElement.nativeElement);\n }\n this.isObservingActions = false;\n }\n\n private setActionButtonsWidth() {\n if (!this.ionToolbarButtonsElement) return;\n\n // Ensure ion-toolbar custom element has been defined (primarily when testing, but doesn't hurt):\n customElements.whenDefined(this.ionToolbarElement.nativeElement.localName).then(() => {\n // Ensure toolbar and buttons have been rendered and has dimensions:\n componentOnReady(this.ionToolbarElement.nativeElement, (toolbar) => {\n let startButtonsWidth = 0;\n let endButtonsWidth = 0;\n\n this.ionToolbarButtonsElement\n .map((ionButtonsElementRef) => ionButtonsElementRef.nativeElement)\n .forEach((ionButtonsElement) => {\n const style = getComputedStyle(ionButtonsElement);\n const margin = parseInt(style.marginLeft) + parseInt(style.marginRight);\n if (ionButtonsElement.getAttribute('slot') === 'start') {\n startButtonsWidth += ionButtonsElement.offsetWidth + margin;\n } else {\n endButtonsWidth += ionButtonsElement.offsetWidth + margin;\n }\n });\n\n const actionButtonsMaxWidth = Math.max(startButtonsWidth, endButtonsWidth);\n this.renderer.setStyle(\n toolbar,\n '--action-buttons-width',\n `${actionButtonsMaxWidth}px`,\n RendererStyleFlags2.DashCase\n );\n });\n });\n }\n\n private initializeContent() {\n this.customContent.forEach((content) => {\n if (content.isFixed) {\n this.fixedContentTemplate = content.template;\n } else {\n this.customContentTemplate = content.template;\n }\n });\n }\n\n private initializeStickyContent() {\n this.stickyContentTemplate = this.stickyContentRef;\n }\n\n private createStickyContentIntersectionObserver() {\n const options: IntersectionObserverInit = {\n root: this.ionContentElement.nativeElement,\n threshold: 1,\n };\n\n const callback: IntersectionObserverCallback = (entries) => {\n if (this.isStickyContentPinned !== !entries[0].isIntersecting) {\n this.isStickyContentPinned = !this.isStickyContentPinned;\n this.changeDetectorRef.detectChanges();\n }\n };\n return new IntersectionObserver(callback, options);\n }\n\n private getPathname(url: string) {\n return url.split('?')[0];\n }\n\n @HostListener('window:keyboardWillShow', ['$event'])\n _onKeyboardWillShow(info?: { keyboardHeight: number }) {\n if (info && info.keyboardHeight) {\n this.ionContentElement.nativeElement.style.setProperty(\n '--keyboard-offset',\n `${info.keyboardHeight}px`\n );\n }\n }\n\n @HostListener('window:keyboardWillHide')\n _onKeyboardWillHide() {\n this.ionContentElement.nativeElement.style.setProperty('--keyboard-offset', '0px');\n }\n\n @HostListener(`window:${selectedTabClickEvent}`)\n _onSelectedTabClick() {\n if (this.content) {\n this.content.scrollToTop(KirbyAnimation.Duration.LONG);\n }\n }\n}\n","<ion-header role=\"presentation\">\n <ion-toolbar\n [class.content-scrolled]=\"isContentScrolled\"\n [class.content-pinned]=\"isStickyContentPinned\"\n >\n <ion-buttons slot=\"start\">\n <ion-back-button\n text=\"\"\n [defaultHref]=\"defaultBackHref\"\n icon=\"assets/kirby/icons/svg/arrow-back.svg\"\n [style.visibility]=\"hideBackButton ? 'hidden' : null\"\n [attr.aria-label]=\"translations.get('back')\"\n ></ion-back-button>\n </ion-buttons>\n <ion-title [class.slide-and-fade-in]=\"toolbarTitleVisible\">\n <div class=\"toolbar-title\">\n @if (!titleActionIconTemplate && !hasInteractiveTitle) {\n <h1 class=\"kirby-text-normal-bold\">\n <ng-container *ngTemplateOutlet=\"toolbarTitleTemplate\"></ng-container>\n </h1>\n }\n @if (!!titleActionIconTemplate || hasInteractiveTitle) {\n <span\n [class.clickable]=\"hasInteractiveTitle\"\n [class.has-icon]=\"!!titleActionIconTemplate\"\n (click)=\"onTitleClick($event)\"\n >\n <h1 class=\"kirby-text-normal-bold\">\n <ng-container *ngTemplateOutlet=\"toolbarTitleTemplate\"></ng-container>\n </h1>\n <ng-container *ngTemplateOutlet=\"titleActionIconTemplate\"></ng-container>\n </span>\n }\n </div>\n </ion-title>\n @if (!!headerActionsTemplate) {\n <ion-buttons class=\"hide\" slot=\"primary\" [class.fade-in]=\"toolbarActionsVisible\">\n <ng-container\n *ngTemplateOutlet=\"headerActionsTemplate; injector: toolbarActionGroupInjector\"\n ></ng-container>\n </ion-buttons>\n }\n @if (!!stickyActionsTemplate) {\n <ion-buttons class=\"legacy-actions\" slot=\"primary\">\n <ng-container *ngTemplateOutlet=\"stickyActionsTemplate\"></ng-container>\n </ion-buttons>\n }\n @if (!!fixedActionsTemplate) {\n <ion-buttons class=\"legacy-actions\" slot=\"secondary\">\n <ng-container *ngTemplateOutlet=\"fixedActionsTemplate\"></ng-container>\n </ion-buttons>\n }\n </ion-toolbar>\n</ion-header>\n\n<ion-content\n scrollEvents=\"true\"\n forceOverscroll=\"false\"\n [class]=\"getMaxWidthClasses()\"\n [class.has-header]=\"hasHeader\"\n>\n @if (refresh.observers.length > 0) {\n <ion-refresher (ionRefresh)=\"delegateRefreshEvent($event)\" slot=\"fixed\">\n <kirby-spinner></kirby-spinner>\n </ion-refresher>\n }\n\n <!-- Page header -->\n @if (hasPageTitle && !hasHeader) {\n <div class=\"page-header-container\">\n <div\n class=\"page-header\"\n [ngClass]=\"{\n 'text-center': titleAlignment === 'center',\n 'text-right': titleAlignment === 'right',\n }\"\n >\n <div #pageTitle class=\"page-title\" [class.has-actions]=\"!!pageActionsTemplate\">\n <ng-container\n *ngTemplateOutlet=\"customTitleTemplate || defaultPageTitleTemplate\"\n ></ng-container>\n <ng-container\n *ngTemplateOutlet=\"pageActionsTemplate || defaultPageActionsTemplate\"\n ></ng-container>\n </div>\n @if (hasPageSubtitle) {\n <div class=\"page-subtitle\">\n <ng-container\n *ngTemplateOutlet=\"customSubtitleTemplate || defaultPageSubtitleTemplate\"\n ></ng-container>\n </div>\n }\n </div>\n </div>\n }\n\n <!-- Header -->\n @if (hasHeader) {\n <div class=\"page-header-container\">\n <ng-content select=\"kirby-header\"></ng-content>\n </div>\n }\n\n <!-- Sticky content -->\n @if (stickyContentTemplate) {\n <div\n #stickyContentContainer\n class=\"sticky-content-container\"\n [class.content-pinned]=\"isStickyContentPinned\"\n >\n <div>\n <ng-container *ngTemplateOutlet=\"stickyContentTemplate\"></ng-container>\n </div>\n </div>\n }\n\n <!-- Content -->\n <div class=\"content-inner\">\n <ng-container\n *ngTemplateOutlet=\"customContentTemplate || defaultContentTemplate\"\n ></ng-container>\n </div>\n\n @if (fixedContentTemplate) {\n <div slot=\"fixed\" class=\"fixed-content\">\n <div class=\"content-inner\">\n <ng-container *ngTemplateOutlet=\"fixedContentTemplate\"></ng-container>\n </div>\n </div>\n }\n</ion-content>\n\n<ion-footer>\n <ng-content select=\"kirby-page-footer\"></ng-content>\n</ion-footer>\n\n<ng-template #defaultPageTitleTemplate>\n <span [kirbyFitHeading]=\"fitHeadingConfig\" class=\"kirby-text-xlarge\">\n <ng-container *ngTemplateOutlet=\"simpleTitleTemplate\"></ng-container>\n </span>\n</ng-template>\n<ng-template #defaultPageSubtitleTemplate>\n <ng-container *ngTemplateOutlet=\"simpleSubtitleTemplate\"></ng-container>\n</ng-template>\n<ng-template #defaultPageActionsTemplate>\n <ng-content select=\"kirby-page-actions\"></ng-content>\n</ng-template>\n\n<ng-template #defaultContentTemplate>\n <ng-content select=\"kirby-page-content\"></ng-content>\n</ng-template>\n\n<ng-template #simpleTitleTemplate>{{ title }}</ng-template>\n<ng-template #simpleSubtitleTemplate>{{ subtitle }}</ng-template>\n<ng-template #simpleToolbarTitleTemplate>{{ toolbarTitle }}</ng-template>\n","import {\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n Input,\n OnDestroy,\n Optional,\n Renderer2,\n SkipSelf,\n} from '@angular/core';\n\nimport { PageComponent } from '../page.component';\n\n@Component({\n selector: 'kirby-page-footer',\n templateUrl: './page-footer.component.html',\n styleUrls: ['./page-footer.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class PageFooterComponent implements OnDestroy {\n @Input()\n hasPadding: boolean = true;\n\n constructor(\n @Optional() @SkipSelf() private pageComponent: PageComponent,\n private hostElement: ElementRef,\n private renderer: Renderer2\n ) {\n if (!pageComponent) {\n throw new Error('Page footer must reside inside of a Kirby page');\n }\n }\n\n close() {\n this.pageComponent.tabBarBottomHidden = false;\n this.renderer.removeChild(\n this.hostElement.nativeElement.parentElement,\n this.hostElement.nativeElement,\n true\n );\n }\n\n ngOnDestroy(): void {\n this.pageComponent.tabBarBottomHidden = false;\n }\n}\n","<div class=\"wrapper\" [class.padding]=\"hasPadding\">\n <ng-content></ng-content>\n</div>\n","import { CommonModule } from '@angular/common';\nimport { NgModule } from '@angular/core';\nimport { SpinnerModule } from '@kirbydesign/designsystem/spinner';\nimport { FitHeadingDirective } from '@kirbydesign/designsystem/shared';\n\nimport { HeaderModule } from '@kirbydesign/designsystem/header';\nimport {\n IonBackButton,\n IonButtons,\n IonContent,\n IonFooter,\n IonHeader,\n IonRefresher,\n IonTitle,\n IonToolbar,\n} from '@ionic/angular';\nimport { PageFooterComponent } from './page-footer/page-footer.component';\nimport {\n PageActionsComponent,\n PageActionsDirective,\n PageComponent,\n PageContentComponent,\n PageContentDirective,\n PageProgressComponent,\n PageStickyContentDirective,\n PageSubtitleDirective,\n PageTitleComponent,\n PageTitleDirective,\n PageToolbarTitleDirective,\n} from './page.component';\n\n@NgModule({\n imports: [\n CommonModule,\n FitHeadingDirective,\n SpinnerModule,\n HeaderModule,\n IonHeader,\n IonToolbar,\n IonButtons,\n IonBackButton,\n IonContent,\n IonTitle,\n IonRefresher,\n IonFooter,\n PageComponent,\n PageActionsComponent,\n PageActionsDirective,\n PageContentComponent,\n PageFooterComponent,\n PageContentDirective,\n PageProgressComponent,\n PageTitleComponent,\n PageTitleDirective,\n PageSubtitleDirective,\n PageToolbarTitleDirective,\n PageStickyContentDirective,\n ],\n exports: [\n PageComponent,\n PageActionsComponent,\n PageActionsDirective,\n PageContentComponent,\n PageFooterComponent,\n PageContentDirective,\n PageProgressComponent,\n PageTitleComponent,\n PageTitleDirective,\n PageSubtitleDirective,\n PageToolbarTitleDirective,\n FitHeadingDirective,\n PageStickyContentDirective,\n ],\n})\nexport class PageModule {}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public_api';\n"],"names":["i1.PageComponent"],"mappings":"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"}
@@ -1,7 +1,21 @@
1
1
  import * as i0 from '@angular/core';
2
- import { ElementRef, EventEmitter, HostListener, Output, Input, ViewChild, Component } from '@angular/core';
2
+ import { ElementRef, EventEmitter, RendererStyleFlags2, HostListener, Output, Input, ViewChild, Component } from '@angular/core';
3
3
  import { DesignTokenHelper } from '@kirbydesign/designsystem/helpers';
4
4
 
5
+ function calculateVerticalPopoverPosition({ viewportHeight, targetTop, targetBottom, contentHeight, bodyPadding, }) {
6
+ const availableSpaceBelow = viewportHeight - targetBottom;
7
+ const availableSpaceAbove = targetTop;
8
+ const contentFitsBelow = availableSpaceBelow >= contentHeight + bodyPadding;
9
+ const opensUpwards = !contentFitsBelow && availableSpaceBelow < availableSpaceAbove;
10
+ const availableSpace = opensUpwards ? availableSpaceAbove : availableSpaceBelow;
11
+ const offset = opensUpwards ? viewportHeight - targetTop : targetBottom;
12
+ return {
13
+ opensUpwards,
14
+ offsetFromEdge: offset,
15
+ availableMaxHeightInDirection: availableSpace - bodyPadding,
16
+ };
17
+ }
18
+
5
19
  var HorizontalDirection;
6
20
  (function (HorizontalDirection) {
7
21
  HorizontalDirection["right"] = "right";
@@ -124,34 +138,35 @@ class PopoverComponent {
124
138
  this.renderer.setStyle(wrapperElement, oppositeDirection, `${pxValue}px`);
125
139
  }
126
140
  positionVertically(viewPort, wrapperElement, targetDimensions, wrapperDimensions) {
127
- const viewPortHeight = viewPort.innerHeight;
128
- const contentHeight = wrapperDimensions.height;
129
- const availableSpaceDown = viewPortHeight - targetDimensions.bottom;
130
- const availableSpaceUp = targetDimensions.top;
131
- const contentCanFitBelowTarget = availableSpaceDown >= contentHeight + this.POPOVER_BODY_PADDING;
132
- const isAvailableSpaceBelow = contentCanFitBelowTarget || availableSpaceDown >= availableSpaceUp;
133
- const [direction, oppositeDirection] = isAvailableSpaceBelow
134
- ? ['bottom', 'top']
135
- : ['top', 'bottom'];
136
- const pxValue = direction === 'bottom' ? targetDimensions.bottom : viewPortHeight - targetDimensions.top;
137
- this.renderer.removeStyle(wrapperElement, direction);
138
- this.renderer.setStyle(wrapperElement, oppositeDirection, `${pxValue}px`);
139
- if (direction === 'top') {
141
+ const { opensUpwards, offsetFromEdge, availableMaxHeightInDirection } = calculateVerticalPopoverPosition({
142
+ viewportHeight: viewPort.innerHeight,
143
+ targetTop: targetDimensions.top,
144
+ targetBottom: targetDimensions.bottom,
145
+ contentHeight: wrapperDimensions.height,
146
+ bodyPadding: this.POPOVER_BODY_PADDING,
147
+ });
148
+ const anchoredEdge = opensUpwards ? 'bottom' : 'top';
149
+ const oppositeEdge = opensUpwards ? 'top' : 'bottom';
150
+ this.renderer.removeStyle(wrapperElement, oppositeEdge);
151
+ this.renderer.setStyle(wrapperElement, anchoredEdge, `${offsetFromEdge}px`);
152
+ // Constrain content to the space available in the chosen direction so it can't grow outside the viewport.
153
+ this.renderer.setStyle(wrapperElement, '--kirby-popover-available-max-height', `${availableMaxHeightInDirection}px`, RendererStyleFlags2.DashCase);
154
+ if (opensUpwards) {
140
155
  // Ensure target is elevated above shadows in popover, i.e. content wrapped in Card:
141
156
  this.renderer.setStyle(this.targetElement, 'z-index', `${this.zIndex + 1}`);
142
157
  this.renderer.setStyle(this.targetElement, 'pointer-events', 'none');
143
158
  }
144
159
  }
145
- /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.18", ngImport: i0, type: PopoverComponent, deps: [{ token: i0.ElementRef }, { token: i0.Renderer2 }], target: i0.ɵɵFactoryTarget.Component }); }
146
- /** @nocollapse */ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.2.18", type: PopoverComponent, isStandalone: true, selector: "kirby-popover", inputs: { popout: "popout", target: "target" }, outputs: { willHide: "willHide" }, host: { listeners: { "window:resize": "_onWindowResize()" } }, viewQueries: [{ propertyName: "wrapperElement", first: true, predicate: ["wrapper"], descendants: true, read: ElementRef, static: true }], ngImport: i0, template: `
160
+ /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.23", ngImport: i0, type: PopoverComponent, deps: [{ token: i0.ElementRef }, { token: i0.Renderer2 }], target: i0.ɵɵFactoryTarget.Component }); }
161
+ /** @nocollapse */ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.2.23", type: PopoverComponent, isStandalone: true, selector: "kirby-popover", inputs: { popout: "popout", target: "target" }, outputs: { willHide: "willHide" }, host: { listeners: { "window:resize": "_onWindowResize()" } }, viewQueries: [{ propertyName: "wrapperElement", first: true, predicate: ["wrapper"], descendants: true, read: ElementRef, static: true }], ngImport: i0, template: `
147
162
  <div #wrapper class="wrapper"><ng-content></ng-content></div>
148
- `, isInline: true, styles: [".kirby-line-clamp{display:-webkit-box;-webkit-line-clamp:var(--line-clamp, none);-webkit-box-orient:vertical;overflow:hidden}:host{display:none;position:fixed;inset: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}\n"] }); }
163
+ `, isInline: true, styles: [":host{display:none;position:fixed;inset:0;z-index:var(--kirby-z-index-popover)}:host(.is-opening){display:block;visibility:hidden}:host(.is-open){display:block}.wrapper{position:fixed;margin-top:var(--kirby-spacing-xxxs);margin-bottom:var(--kirby-spacing-xxxs)}\n"] }); }
149
164
  }
150
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.18", ngImport: i0, type: PopoverComponent, decorators: [{
165
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.23", ngImport: i0, type: PopoverComponent, decorators: [{
151
166
  type: Component,
152
167
  args: [{ selector: 'kirby-popover', template: `
153
168
  <div #wrapper class="wrapper"><ng-content></ng-content></div>
154
- `, styles: [".kirby-line-clamp{display:-webkit-box;-webkit-line-clamp:var(--line-clamp, none);-webkit-box-orient:vertical;overflow:hidden}:host{display:none;position:fixed;inset: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}\n"] }]
169
+ `, styles: [":host{display:none;position:fixed;inset:0;z-index:var(--kirby-z-index-popover)}:host(.is-opening){display:block;visibility:hidden}:host(.is-open){display:block}.wrapper{position:fixed;margin-top:var(--kirby-spacing-xxxs);margin-bottom:var(--kirby-spacing-xxxs)}\n"] }]
155
170
  }], ctorParameters: () => [{ type: i0.ElementRef }, { type: i0.Renderer2 }], propDecorators: { wrapperElement: [{
156
171
  type: ViewChild,
157
172
  args: ['wrapper', { static: true, read: ElementRef }]
@@ -1 +1 @@
1
- {"version":3,"file":"kirbydesign-designsystem-popover.mjs","sources":["../../popover/src/popover.component.ts","../../popover/src/kirbydesign-designsystem-popover.ts"],"sourcesContent":["import {\n AfterViewInit,\n Component,\n ElementRef,\n EventEmitter,\n HostListener,\n Input,\n OnDestroy,\n Output,\n Renderer2,\n ViewChild,\n} from '@angular/core';\nimport { EventListenerDisposeFn } from '@kirbydesign/designsystem/types';\nimport { DesignTokenHelper } from '@kirbydesign/designsystem/helpers';\n\nexport enum HorizontalDirection {\n right = 'right',\n left = 'left',\n}\n\n@Component({\n selector: 'kirby-popover',\n template: `\n <div #wrapper class=\"wrapper\"><ng-content></ng-content></div>\n `,\n styleUrls: ['./popover.component.scss'],\n})\nexport class PopoverComponent implements AfterViewInit, OnDestroy {\n // removeEventListener same instance of event handler & options\n private readonly preventScrollEventListenerOptions = {\n passive: false,\n } as EventListenerOptions;\n\n private readonly POPOVER_BODY_PADDING = 12;\n\n private isShowing: boolean = false;\n private isFirstToLockScroll: boolean;\n private zIndex: number;\n private document: Document;\n private openingFrameId: ReturnType<typeof requestAnimationFrame> | null = null;\n\n @ViewChild('wrapper', { static: true, read: ElementRef })\n wrapperElement: ElementRef<HTMLDivElement>;\n\n @Input()\n popout: HorizontalDirection | `${HorizontalDirection}` = HorizontalDirection.right;\n\n @Input()\n target: HTMLElement | ElementRef<HTMLElement>;\n\n @Output()\n willHide = new EventEmitter<void>();\n\n private get targetElement(): HTMLElement {\n if (this.target instanceof ElementRef) {\n return this.target.nativeElement;\n } else {\n return this.target;\n }\n }\n\n @HostListener('window:resize')\n _onWindowResize() {\n this.hide();\n }\n\n private disposeTouchMoveListener: EventListenerDisposeFn;\n\n constructor(\n private elementRef: ElementRef<HTMLElement>,\n private renderer: Renderer2\n ) {\n this.document = elementRef.nativeElement.ownerDocument;\n }\n\n ngAfterViewInit(): void {\n this.placePopoverAboveClosestModal();\n this.renderer.removeChild(\n this.elementRef.nativeElement.parentElement,\n this.elementRef.nativeElement\n );\n }\n\n ngOnDestroy(): void {\n this.hide();\n }\n\n private placePopoverAboveClosestModal() {\n const closestIonModal = this.elementRef.nativeElement.closest('ion-modal');\n if (closestIonModal) {\n this.zIndex = parseInt((closestIonModal as HTMLElement).style.zIndex) + 1;\n this.elementRef.nativeElement.style.zIndex = `${this.zIndex}`;\n } else {\n this.zIndex = parseInt(DesignTokenHelper.zLayer('popover'));\n }\n }\n\n private static preventEventOutsidePopover(event: TouchEvent) {\n if (event.target instanceof HTMLElement) {\n const targetIsInPopover = !!event.target.closest('kirby-popover');\n if (!targetIsInPopover) {\n event.preventDefault();\n }\n }\n }\n\n private preventScroll() {\n this.isFirstToLockScroll = !this.document.body.classList.contains('backdrop-no-scroll');\n if (this.isFirstToLockScroll) {\n this.renderer.addClass(this.document.body, 'backdrop-no-scroll');\n }\n\n this.disposeTouchMoveListener = this.renderer.listen(\n this.document,\n 'touchmove',\n PopoverComponent.preventEventOutsidePopover,\n this.preventScrollEventListenerOptions\n );\n }\n\n private releaseScroll() {\n if (this.isFirstToLockScroll) {\n this.renderer.removeClass(this.document.body, 'backdrop-no-scroll');\n }\n\n this.disposeTouchMoveListener?.();\n }\n\n show() {\n this.renderer.addClass(this.elementRef.nativeElement, 'is-opening');\n this.renderer.appendChild(this.document.body, this.elementRef.nativeElement);\n\n this.preventScroll();\n this.isShowing = true;\n\n this.openingFrameId = requestAnimationFrame(() => {\n this.openingFrameId = null;\n if (!this.isShowing) return;\n this.positionWrapper();\n this.renderer.addClass(this.elementRef.nativeElement, 'is-open');\n this.renderer.removeClass(this.elementRef.nativeElement, 'is-opening');\n });\n }\n\n hide() {\n if (!this.isShowing) return;\n\n if (this.openingFrameId !== null) {\n cancelAnimationFrame(this.openingFrameId);\n this.openingFrameId = null;\n this.renderer.removeClass(this.elementRef.nativeElement, 'is-opening');\n }\n\n this.willHide.emit();\n this.renderer.removeChild(\n this.elementRef.nativeElement.parentElement,\n this.elementRef.nativeElement\n );\n this.releaseScroll();\n\n this.renderer.removeStyle(this.targetElement, 'z-index');\n this.renderer.removeStyle(this.targetElement, 'pointer-events');\n this.isShowing = false;\n }\n\n private positionWrapper() {\n const targetDimensions = this.targetElement.getBoundingClientRect();\n\n this.renderer.appendChild(this.document.body, this.elementRef.nativeElement);\n\n const wrapperElement = this.wrapperElement.nativeElement;\n const wrapperDimensions = wrapperElement.getBoundingClientRect();\n const viewport = wrapperElement.ownerDocument.defaultView;\n this.positionHorizontally(viewport, wrapperElement, targetDimensions, wrapperDimensions);\n this.positionVertically(viewport, wrapperElement, targetDimensions, wrapperDimensions);\n }\n\n private positionHorizontally(\n viewPort: Window,\n wrapperElement: HTMLDivElement,\n targetDimensions: DOMRect,\n wrapperDimensions: DOMRect\n ) {\n const viewPortWidth = viewPort.innerWidth;\n const contentWidth = wrapperDimensions.width;\n const availableSpaceRight = viewPortWidth - targetDimensions.left;\n const availableSpaceLeft = targetDimensions.right;\n const contentCanFitRightOfTarget =\n availableSpaceRight >= contentWidth + this.POPOVER_BODY_PADDING;\n const openRight = contentCanFitRightOfTarget || availableSpaceRight >= availableSpaceLeft;\n\n const [direction, oppositeDirection] =\n this.popout === HorizontalDirection.left || !openRight\n ? ['left', 'right']\n : ['right', 'left'];\n\n const pxValue =\n direction === 'left' ? viewPortWidth - targetDimensions.right : targetDimensions.left;\n\n this.renderer.removeStyle(wrapperElement, direction);\n this.renderer.setStyle(wrapperElement, oppositeDirection, `${pxValue}px`);\n }\n\n private positionVertically(\n viewPort: Window,\n wrapperElement: HTMLDivElement,\n targetDimensions: DOMRect,\n wrapperDimensions: DOMRect\n ) {\n const viewPortHeight = viewPort.innerHeight;\n const contentHeight = wrapperDimensions.height;\n const availableSpaceDown = viewPortHeight - targetDimensions.bottom;\n const availableSpaceUp = targetDimensions.top;\n const contentCanFitBelowTarget =\n availableSpaceDown >= contentHeight + this.POPOVER_BODY_PADDING;\n\n const isAvailableSpaceBelow =\n contentCanFitBelowTarget || availableSpaceDown >= availableSpaceUp;\n const [direction, oppositeDirection] = isAvailableSpaceBelow\n ? ['bottom', 'top']\n : ['top', 'bottom'];\n\n const pxValue =\n direction === 'bottom' ? targetDimensions.bottom : viewPortHeight - targetDimensions.top;\n\n this.renderer.removeStyle(wrapperElement, direction);\n this.renderer.setStyle(wrapperElement, oppositeDirection, `${pxValue}px`);\n\n if (direction === 'top') {\n // Ensure target is elevated above shadows in popover, i.e. content wrapped in Card:\n this.renderer.setStyle(this.targetElement, 'z-index', `${this.zIndex + 1}`);\n this.renderer.setStyle(this.targetElement, 'pointer-events', 'none');\n }\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public_api';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"kirbydesign-designsystem-popover.mjs","sources":["../../popover/src/popover.helper.ts","../../popover/src/popover.component.ts","../../popover/src/kirbydesign-designsystem-popover.ts"],"sourcesContent":["export interface VerticalPositionInput {\n viewportHeight: number;\n targetTop: number;\n targetBottom: number;\n contentHeight: number;\n bodyPadding: number;\n}\n\nexport interface VerticalPosition {\n opensUpwards: boolean;\n offsetFromEdge: number;\n availableMaxHeightInDirection: number;\n}\n\nexport function calculateVerticalPopoverPosition({\n viewportHeight,\n targetTop,\n targetBottom,\n contentHeight,\n bodyPadding,\n}: VerticalPositionInput): VerticalPosition {\n const availableSpaceBelow = viewportHeight - targetBottom;\n const availableSpaceAbove = targetTop;\n const contentFitsBelow = availableSpaceBelow >= contentHeight + bodyPadding;\n const opensUpwards = !contentFitsBelow && availableSpaceBelow < availableSpaceAbove;\n\n const availableSpace = opensUpwards ? availableSpaceAbove : availableSpaceBelow;\n const offset = opensUpwards ? viewportHeight - targetTop : targetBottom;\n\n return {\n opensUpwards,\n offsetFromEdge: offset,\n availableMaxHeightInDirection: availableSpace - bodyPadding,\n };\n}\n","import {\n AfterViewInit,\n Component,\n ElementRef,\n EventEmitter,\n HostListener,\n Input,\n OnDestroy,\n Output,\n Renderer2,\n RendererStyleFlags2,\n ViewChild,\n} from '@angular/core';\nimport { EventListenerDisposeFn } from '@kirbydesign/designsystem/types';\nimport { DesignTokenHelper } from '@kirbydesign/designsystem/helpers';\n\nimport { calculateVerticalPopoverPosition } from './popover.helper';\n\nexport enum HorizontalDirection {\n right = 'right',\n left = 'left',\n}\n\n@Component({\n selector: 'kirby-popover',\n template: `\n <div #wrapper class=\"wrapper\"><ng-content></ng-content></div>\n `,\n styleUrls: ['./popover.component.scss'],\n})\nexport class PopoverComponent implements AfterViewInit, OnDestroy {\n // removeEventListener same instance of event handler & options\n private readonly preventScrollEventListenerOptions = {\n passive: false,\n } as EventListenerOptions;\n\n private readonly POPOVER_BODY_PADDING = 12;\n\n private isShowing: boolean = false;\n private isFirstToLockScroll: boolean;\n private zIndex: number;\n private document: Document;\n private openingFrameId: ReturnType<typeof requestAnimationFrame> | null = null;\n\n @ViewChild('wrapper', { static: true, read: ElementRef })\n wrapperElement: ElementRef<HTMLDivElement>;\n\n @Input()\n popout: HorizontalDirection | `${HorizontalDirection}` = HorizontalDirection.right;\n\n @Input()\n target: HTMLElement | ElementRef<HTMLElement>;\n\n @Output()\n willHide = new EventEmitter<void>();\n\n private get targetElement(): HTMLElement {\n if (this.target instanceof ElementRef) {\n return this.target.nativeElement;\n } else {\n return this.target;\n }\n }\n\n @HostListener('window:resize')\n _onWindowResize() {\n this.hide();\n }\n\n private disposeTouchMoveListener: EventListenerDisposeFn;\n\n constructor(\n private elementRef: ElementRef<HTMLElement>,\n private renderer: Renderer2\n ) {\n this.document = elementRef.nativeElement.ownerDocument;\n }\n\n ngAfterViewInit(): void {\n this.placePopoverAboveClosestModal();\n this.renderer.removeChild(\n this.elementRef.nativeElement.parentElement,\n this.elementRef.nativeElement\n );\n }\n\n ngOnDestroy(): void {\n this.hide();\n }\n\n private placePopoverAboveClosestModal() {\n const closestIonModal = this.elementRef.nativeElement.closest('ion-modal');\n if (closestIonModal) {\n this.zIndex = parseInt((closestIonModal as HTMLElement).style.zIndex) + 1;\n this.elementRef.nativeElement.style.zIndex = `${this.zIndex}`;\n } else {\n this.zIndex = parseInt(DesignTokenHelper.zLayer('popover'));\n }\n }\n\n private static preventEventOutsidePopover(event: TouchEvent) {\n if (event.target instanceof HTMLElement) {\n const targetIsInPopover = !!event.target.closest('kirby-popover');\n if (!targetIsInPopover) {\n event.preventDefault();\n }\n }\n }\n\n private preventScroll() {\n this.isFirstToLockScroll = !this.document.body.classList.contains('backdrop-no-scroll');\n if (this.isFirstToLockScroll) {\n this.renderer.addClass(this.document.body, 'backdrop-no-scroll');\n }\n\n this.disposeTouchMoveListener = this.renderer.listen(\n this.document,\n 'touchmove',\n PopoverComponent.preventEventOutsidePopover,\n this.preventScrollEventListenerOptions\n );\n }\n\n private releaseScroll() {\n if (this.isFirstToLockScroll) {\n this.renderer.removeClass(this.document.body, 'backdrop-no-scroll');\n }\n\n this.disposeTouchMoveListener?.();\n }\n\n show() {\n this.renderer.addClass(this.elementRef.nativeElement, 'is-opening');\n this.renderer.appendChild(this.document.body, this.elementRef.nativeElement);\n\n this.preventScroll();\n this.isShowing = true;\n\n this.openingFrameId = requestAnimationFrame(() => {\n this.openingFrameId = null;\n if (!this.isShowing) return;\n this.positionWrapper();\n this.renderer.addClass(this.elementRef.nativeElement, 'is-open');\n this.renderer.removeClass(this.elementRef.nativeElement, 'is-opening');\n });\n }\n\n hide() {\n if (!this.isShowing) return;\n\n if (this.openingFrameId !== null) {\n cancelAnimationFrame(this.openingFrameId);\n this.openingFrameId = null;\n this.renderer.removeClass(this.elementRef.nativeElement, 'is-opening');\n }\n\n this.willHide.emit();\n this.renderer.removeChild(\n this.elementRef.nativeElement.parentElement,\n this.elementRef.nativeElement\n );\n this.releaseScroll();\n\n this.renderer.removeStyle(this.targetElement, 'z-index');\n this.renderer.removeStyle(this.targetElement, 'pointer-events');\n this.isShowing = false;\n }\n\n private positionWrapper() {\n const targetDimensions = this.targetElement.getBoundingClientRect();\n\n this.renderer.appendChild(this.document.body, this.elementRef.nativeElement);\n\n const wrapperElement = this.wrapperElement.nativeElement;\n const wrapperDimensions = wrapperElement.getBoundingClientRect();\n const viewport = wrapperElement.ownerDocument.defaultView;\n this.positionHorizontally(viewport, wrapperElement, targetDimensions, wrapperDimensions);\n this.positionVertically(viewport, wrapperElement, targetDimensions, wrapperDimensions);\n }\n\n private positionHorizontally(\n viewPort: Window,\n wrapperElement: HTMLDivElement,\n targetDimensions: DOMRect,\n wrapperDimensions: DOMRect\n ) {\n const viewPortWidth = viewPort.innerWidth;\n const contentWidth = wrapperDimensions.width;\n const availableSpaceRight = viewPortWidth - targetDimensions.left;\n const availableSpaceLeft = targetDimensions.right;\n const contentCanFitRightOfTarget =\n availableSpaceRight >= contentWidth + this.POPOVER_BODY_PADDING;\n const openRight = contentCanFitRightOfTarget || availableSpaceRight >= availableSpaceLeft;\n\n const [direction, oppositeDirection] =\n this.popout === HorizontalDirection.left || !openRight\n ? ['left', 'right']\n : ['right', 'left'];\n\n const pxValue =\n direction === 'left' ? viewPortWidth - targetDimensions.right : targetDimensions.left;\n\n this.renderer.removeStyle(wrapperElement, direction);\n this.renderer.setStyle(wrapperElement, oppositeDirection, `${pxValue}px`);\n }\n\n private positionVertically(\n viewPort: Window,\n wrapperElement: HTMLDivElement,\n targetDimensions: DOMRect,\n wrapperDimensions: DOMRect\n ) {\n const { opensUpwards, offsetFromEdge, availableMaxHeightInDirection } =\n calculateVerticalPopoverPosition({\n viewportHeight: viewPort.innerHeight,\n targetTop: targetDimensions.top,\n targetBottom: targetDimensions.bottom,\n contentHeight: wrapperDimensions.height,\n bodyPadding: this.POPOVER_BODY_PADDING,\n });\n\n const anchoredEdge = opensUpwards ? 'bottom' : 'top';\n const oppositeEdge = opensUpwards ? 'top' : 'bottom';\n\n this.renderer.removeStyle(wrapperElement, oppositeEdge);\n this.renderer.setStyle(wrapperElement, anchoredEdge, `${offsetFromEdge}px`);\n\n // Constrain content to the space available in the chosen direction so it can't grow outside the viewport.\n this.renderer.setStyle(\n wrapperElement,\n '--kirby-popover-available-max-height',\n `${availableMaxHeightInDirection}px`,\n RendererStyleFlags2.DashCase\n );\n\n if (opensUpwards) {\n // Ensure target is elevated above shadows in popover, i.e. content wrapped in Card:\n this.renderer.setStyle(this.targetElement, 'z-index', `${this.zIndex + 1}`);\n this.renderer.setStyle(this.targetElement, 'pointer-events', 'none');\n }\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public_api';\n"],"names":[],"mappings":"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"}