@kirbydesign/designsystem 12.0.0-dev-67d5287 → 12.0.0-dev-286cdc0

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 (96) hide show
  1. package/fesm2022/kirbydesign-designsystem-accordion.mjs +12 -12
  2. package/fesm2022/kirbydesign-designsystem-accordion.mjs.map +1 -1
  3. package/fesm2022/kirbydesign-designsystem-action-group.mjs +3 -3
  4. package/fesm2022/kirbydesign-designsystem-avatar.mjs +5 -5
  5. package/fesm2022/kirbydesign-designsystem-avatar.mjs.map +1 -1
  6. package/fesm2022/kirbydesign-designsystem-badge.mjs +5 -5
  7. package/fesm2022/kirbydesign-designsystem-badge.mjs.map +1 -1
  8. package/fesm2022/kirbydesign-designsystem-button.mjs +5 -5
  9. package/fesm2022/kirbydesign-designsystem-button.mjs.map +1 -1
  10. package/fesm2022/kirbydesign-designsystem-calendar.mjs +7 -7
  11. package/fesm2022/kirbydesign-designsystem-calendar.mjs.map +1 -1
  12. package/fesm2022/kirbydesign-designsystem-card.mjs +24 -24
  13. package/fesm2022/kirbydesign-designsystem-card.mjs.map +1 -1
  14. package/fesm2022/kirbydesign-designsystem-chart.mjs +22 -22
  15. package/fesm2022/kirbydesign-designsystem-checkbox.mjs +14 -6
  16. package/fesm2022/kirbydesign-designsystem-checkbox.mjs.map +1 -1
  17. package/fesm2022/kirbydesign-designsystem-data-table.mjs +7 -7
  18. package/fesm2022/kirbydesign-designsystem-divider.mjs +5 -5
  19. package/fesm2022/kirbydesign-designsystem-divider.mjs.map +1 -1
  20. package/fesm2022/kirbydesign-designsystem-dropdown.mjs +10 -10
  21. package/fesm2022/kirbydesign-designsystem-empty-state.mjs +19 -8
  22. package/fesm2022/kirbydesign-designsystem-empty-state.mjs.map +1 -1
  23. package/fesm2022/kirbydesign-designsystem-fab-sheet.mjs +3 -3
  24. package/fesm2022/kirbydesign-designsystem-flag.mjs +5 -5
  25. package/fesm2022/kirbydesign-designsystem-flag.mjs.map +1 -1
  26. package/fesm2022/kirbydesign-designsystem-form-field.mjs +32 -32
  27. package/fesm2022/kirbydesign-designsystem-form-field.mjs.map +1 -1
  28. package/fesm2022/kirbydesign-designsystem-gesture.mjs +3 -3
  29. package/fesm2022/kirbydesign-designsystem-header.mjs +19 -19
  30. package/fesm2022/kirbydesign-designsystem-helpers.mjs +9 -9
  31. package/fesm2022/kirbydesign-designsystem-icon.mjs +10 -10
  32. package/fesm2022/kirbydesign-designsystem-item-group.mjs +3 -3
  33. package/fesm2022/kirbydesign-designsystem-item-sliding.mjs +3 -3
  34. package/fesm2022/kirbydesign-designsystem-item.mjs +12 -12
  35. package/fesm2022/kirbydesign-designsystem-item.mjs.map +1 -1
  36. package/fesm2022/kirbydesign-designsystem-kirby-app.mjs +7 -7
  37. package/fesm2022/kirbydesign-designsystem-list.mjs +49 -46
  38. package/fesm2022/kirbydesign-designsystem-list.mjs.map +1 -1
  39. package/fesm2022/kirbydesign-designsystem-loading-overlay.mjs +8 -8
  40. package/fesm2022/kirbydesign-designsystem-loading-overlay.mjs.map +1 -1
  41. package/fesm2022/kirbydesign-designsystem-menu.mjs +5 -5
  42. package/fesm2022/kirbydesign-designsystem-menu.mjs.map +1 -1
  43. package/fesm2022/kirbydesign-designsystem-modal.mjs +59 -50
  44. package/fesm2022/kirbydesign-designsystem-modal.mjs.map +1 -1
  45. package/fesm2022/kirbydesign-designsystem-page.mjs +69 -48
  46. package/fesm2022/kirbydesign-designsystem-page.mjs.map +1 -1
  47. package/fesm2022/kirbydesign-designsystem-popover.mjs +3 -3
  48. package/fesm2022/kirbydesign-designsystem-progress-circle.mjs +6 -6
  49. package/fesm2022/kirbydesign-designsystem-radio.mjs +12 -12
  50. package/fesm2022/kirbydesign-designsystem-radio.mjs.map +1 -1
  51. package/fesm2022/kirbydesign-designsystem-range.mjs +5 -5
  52. package/fesm2022/kirbydesign-designsystem-range.mjs.map +1 -1
  53. package/fesm2022/kirbydesign-designsystem-reorder-list.mjs +5 -5
  54. package/fesm2022/kirbydesign-designsystem-reorder-list.mjs.map +1 -1
  55. package/fesm2022/kirbydesign-designsystem-router-outlet.mjs +7 -7
  56. package/fesm2022/kirbydesign-designsystem-section-header.mjs +3 -3
  57. package/fesm2022/kirbydesign-designsystem-segmented-control.mjs +5 -5
  58. package/fesm2022/kirbydesign-designsystem-segmented-control.mjs.map +1 -1
  59. package/fesm2022/kirbydesign-designsystem-shared-floating.mjs +16 -7
  60. package/fesm2022/kirbydesign-designsystem-shared-floating.mjs.map +1 -1
  61. package/fesm2022/kirbydesign-designsystem-shared-portal.mjs +3 -3
  62. package/fesm2022/kirbydesign-designsystem-shared.mjs +21 -21
  63. package/fesm2022/kirbydesign-designsystem-slide-button.mjs +3 -3
  64. package/fesm2022/kirbydesign-designsystem-slide.mjs +13 -13
  65. package/fesm2022/kirbydesign-designsystem-spinner.mjs +7 -7
  66. package/fesm2022/kirbydesign-designsystem-tab-navigation.mjs +12 -12
  67. package/fesm2022/kirbydesign-designsystem-tab-navigation.mjs.map +1 -1
  68. package/fesm2022/kirbydesign-designsystem-tabs.mjs +15 -15
  69. package/fesm2022/kirbydesign-designsystem-tabs.mjs.map +1 -1
  70. package/fesm2022/kirbydesign-designsystem-testing-base.mjs +305 -303
  71. package/fesm2022/kirbydesign-designsystem-testing-base.mjs.map +1 -1
  72. package/fesm2022/kirbydesign-designsystem-testing-jasmine.mjs +4 -4
  73. package/fesm2022/kirbydesign-designsystem-testing-jest.mjs +4 -4
  74. package/fesm2022/kirbydesign-designsystem-testing.mjs +4 -4
  75. package/fesm2022/kirbydesign-designsystem-toast.mjs +6 -6
  76. package/fesm2022/kirbydesign-designsystem-toggle-button.mjs +7 -7
  77. package/fesm2022/kirbydesign-designsystem-toggle.mjs +5 -5
  78. package/fesm2022/kirbydesign-designsystem-toggle.mjs.map +1 -1
  79. package/fesm2022/kirbydesign-designsystem-types.mjs +3 -3
  80. package/fesm2022/kirbydesign-designsystem.mjs +10 -10
  81. package/package.json +2 -2
  82. package/types/kirbydesign-designsystem-card.d.ts +2 -2
  83. package/types/kirbydesign-designsystem-card.d.ts.map +1 -1
  84. package/types/kirbydesign-designsystem-checkbox.d.ts +7 -1
  85. package/types/kirbydesign-designsystem-checkbox.d.ts.map +1 -1
  86. package/types/kirbydesign-designsystem-empty-state.d.ts +11 -0
  87. package/types/kirbydesign-designsystem-empty-state.d.ts.map +1 -1
  88. package/types/kirbydesign-designsystem-list.d.ts +5 -0
  89. package/types/kirbydesign-designsystem-list.d.ts.map +1 -1
  90. package/types/kirbydesign-designsystem-modal.d.ts +2 -1
  91. package/types/kirbydesign-designsystem-modal.d.ts.map +1 -1
  92. package/types/kirbydesign-designsystem-page.d.ts +4 -0
  93. package/types/kirbydesign-designsystem-page.d.ts.map +1 -1
  94. package/types/kirbydesign-designsystem-shared-floating.d.ts.map +1 -1
  95. package/types/kirbydesign-designsystem-testing-base.d.ts +5 -0
  96. package/types/kirbydesign-designsystem-testing-base.d.ts.map +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"kirbydesign-designsystem-page.mjs","names":[],"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"],"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 changeDetection: ChangeDetectionStrategy.Eager,\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 changeDetection: ChangeDetectionStrategy.Eager,\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 changeDetection: ChangeDetectionStrategy.Eager,\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 changeDetection: ChangeDetectionStrategy.Eager,\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 kirby-surface-raised\" [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"],"mappings":"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"}
1
+ {"version":3,"file":"kirbydesign-designsystem-page.mjs","names":[],"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"],"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, startWith, 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 changeDetection: ChangeDetectionStrategy.Eager,\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 changeDetection: ChangeDetectionStrategy.Eager,\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 changeDetection: ChangeDetectionStrategy.Eager,\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 changeDetection: ChangeDetectionStrategy.Eager,\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 private observedToolbarButtons = new Set<HTMLIonButtonsElement>();\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.subscribeToToolbarButtonsChanges();\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 this.unobserveToolbarButtons();\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 observeToolbarButtons() {\n this.unobserveToolbarButtons();\n\n this.ionToolbarButtonsElement.forEach(({ nativeElement: ionButtonsElement }) => {\n this.observedToolbarButtons.add(ionButtonsElement);\n this.resizeObserverService.observe(ionButtonsElement, () => this.setActionButtonsWidth());\n });\n }\n\n private subscribeToToolbarButtonsChanges() {\n this.ionToolbarButtonsElement.changes\n .pipe(startWith(this.ionToolbarButtonsElement), takeUntil(this.ngOnDestroy$))\n .subscribe(() => {\n this.observeToolbarButtons();\n this.setActionButtonsWidth();\n });\n }\n\n private unobserveToolbarButtons() {\n this.observedToolbarButtons.forEach((ionButtonsElement) =>\n this.resizeObserverService.unobserve(ionButtonsElement)\n );\n this.observedToolbarButtons.clear();\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 host: { class: 'kirby-surface-raised' },\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"],"mappings":"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AA,GAAA,mBAAA;GAAA,YAAA;GAAA,SAAA;GAAA,UAAA;GAAA,MAAA;GAAU,MAAA,CAAA;GAAA,QAAA,GAAA,gBAAA;EAAA,CAAA;CAAA;CAAV;EAAA,KAAA,OAAA,GAAA,oBAAA;GAAA,YAAA;GAAA,SAAA;GAAA,UAAA;GAAA,MAAA;GAAU,SAAA;IAzCnB;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;GAA0B;GAAA,SAAA;IAG1B;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;GAA0B;EAAA,CAAA;CAAA;CAGjB;EAAA,KAAA,OAAA,GAAA,oBAAA;GAAA,YAAA;GAAA,SAAA;GAAA,UAAA;GAAA,MAAA;GAAU,SAAA;IAzCnB;IAEA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;GAAa;EAAA,CAAA;CAAA;;AA6BJ,GAAA,yBAAA;CAAA,YAAA;CAAA,SAAA;CAAA,UAAA;CAAA,MAAA;CAAU,YAAA,CAAA;EA3CtB,MAAA;EAAS,MAAA,CAAA;GACR,SAAS;IACP;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;GACD;GACD,SAAS;IACP;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;GACD;EACF,CAAA"}
@@ -132,7 +132,7 @@ var PopoverComponent = class PopoverComponent {
132
132
  static {
133
133
  this.ɵfac = i0.ɵɵngDeclareFactory({
134
134
  minVersion: "12.0.0",
135
- version: "22.2.2",
135
+ version: "22.2.3",
136
136
  ngImport: i0,
137
137
  type: PopoverComponent,
138
138
  deps: [{ token: i0.ElementRef }, { token: i0.Renderer2 }],
@@ -142,7 +142,7 @@ var PopoverComponent = class PopoverComponent {
142
142
  static {
143
143
  this.ɵcmp = i0.ɵɵngDeclareComponent({
144
144
  minVersion: "14.0.0",
145
- version: "22.2.2",
145
+ version: "22.2.3",
146
146
  type: PopoverComponent,
147
147
  isStandalone: true,
148
148
  selector: "kirby-popover",
@@ -172,7 +172,7 @@ var PopoverComponent = class PopoverComponent {
172
172
  };
173
173
  i0.ɵɵngDeclareClassMetadata({
174
174
  minVersion: "12.0.0",
175
- version: "22.2.2",
175
+ version: "22.2.3",
176
176
  ngImport: i0,
177
177
  type: PopoverComponent,
178
178
  decorators: [{
@@ -28,7 +28,7 @@ var ProgressCircleRingComponent = class ProgressCircleRingComponent {
28
28
  static {
29
29
  this.ɵfac = i0.ɵɵngDeclareFactory({
30
30
  minVersion: "12.0.0",
31
- version: "22.2.2",
31
+ version: "22.2.3",
32
32
  ngImport: i0,
33
33
  type: ProgressCircleRingComponent,
34
34
  deps: [],
@@ -38,7 +38,7 @@ var ProgressCircleRingComponent = class ProgressCircleRingComponent {
38
38
  static {
39
39
  this.ɵcmp = i0.ɵɵngDeclareComponent({
40
40
  minVersion: "14.0.0",
41
- version: "22.2.2",
41
+ version: "22.2.3",
42
42
  type: ProgressCircleRingComponent,
43
43
  isStandalone: true,
44
44
  selector: "kirby-progress-circle-ring",
@@ -60,7 +60,7 @@ var ProgressCircleRingComponent = class ProgressCircleRingComponent {
60
60
  };
61
61
  i0.ɵɵngDeclareClassMetadata({
62
62
  minVersion: "12.0.0",
63
- version: "22.2.2",
63
+ version: "22.2.3",
64
64
  ngImport: i0,
65
65
  type: ProgressCircleRingComponent,
66
66
  decorators: [{
@@ -126,7 +126,7 @@ var ProgressCircleComponent = class ProgressCircleComponent {
126
126
  static {
127
127
  this.ɵfac = i0.ɵɵngDeclareFactory({
128
128
  minVersion: "12.0.0",
129
- version: "22.2.2",
129
+ version: "22.2.3",
130
130
  ngImport: i0,
131
131
  type: ProgressCircleComponent,
132
132
  deps: [{ token: i0.ElementRef }, { token: i0.ChangeDetectorRef }],
@@ -136,7 +136,7 @@ var ProgressCircleComponent = class ProgressCircleComponent {
136
136
  static {
137
137
  this.ɵcmp = i0.ɵɵngDeclareComponent({
138
138
  minVersion: "14.0.0",
139
- version: "22.2.2",
139
+ version: "22.2.3",
140
140
  type: ProgressCircleComponent,
141
141
  isStandalone: true,
142
142
  selector: "kirby-progress-circle",
@@ -174,7 +174,7 @@ var ProgressCircleComponent = class ProgressCircleComponent {
174
174
  };
175
175
  i0.ɵɵngDeclareClassMetadata({
176
176
  minVersion: "12.0.0",
177
- version: "22.2.2",
177
+ version: "22.2.3",
178
178
  ngImport: i0,
179
179
  type: ProgressCircleComponent,
180
180
  decorators: [{
@@ -44,7 +44,7 @@ var RadioComponent = class RadioComponent {
44
44
  static {
45
45
  this.ɵfac = i0.ɵɵngDeclareFactory({
46
46
  minVersion: "12.0.0",
47
- version: "22.2.2",
47
+ version: "22.2.3",
48
48
  ngImport: i0,
49
49
  type: RadioComponent,
50
50
  deps: [{ token: i0.ElementRef }, { token: i1.IonicElementPartHelper }],
@@ -54,7 +54,7 @@ var RadioComponent = class RadioComponent {
54
54
  static {
55
55
  this.ɵcmp = i0.ɵɵngDeclareComponent({
56
56
  minVersion: "17.0.0",
57
- version: "22.2.2",
57
+ version: "22.2.3",
58
58
  type: RadioComponent,
59
59
  isStandalone: true,
60
60
  selector: "kirby-radio",
@@ -80,7 +80,7 @@ var RadioComponent = class RadioComponent {
80
80
  }],
81
81
  ngImport: i0,
82
82
  template: "<ion-radio\n [value]=\"value\"\n [disabled]=\"disabled\"\n mode=\"md\"\n [labelPlacement]=\"_labelPlacement\"\n [justify]=\"_justify\"\n>\n @if (_labelText) {\n <span class=\"hidden-label\">{{ _labelText }}</span>\n }\n @if (text) {\n <span [attr.aria-hidden]=\"_labelText ? true : undefined\">{{ text }}</span>\n }\n <span class=\"default-content\" [attr.aria-hidden]=\"_labelText ? true : undefined\">\n <ng-content></ng-content>\n </span>\n</ion-radio>\n",
83
- styles: [".kirby-line-clamp{display:-webkit-box;-webkit-line-clamp:var(--line-clamp, none);-webkit-box-orient:vertical;overflow:hidden}:host{display:flex}:host[disabled] ion-radio::part(label-text-wrapper),:host[disabled] ion-radio::part(native-wrapper){opacity:.4}:host:has(ion-radio.in-item.radio-justify-space-between){width:100%}:host.has-hidden-label:has(ion-radio.in-item){position:initial}:host.has-hidden-label:has(ion-radio.in-item) ion-radio{position:initial}:host.has-hidden-label:has(ion-radio.in-item) ion-radio::part(label){position:initial}:host.has-hidden-label:has(ion-radio.in-item) ion-radio.radio-label-placement-start::part(label-text-wrapper),:host.has-hidden-label:has(ion-radio.in-item) ion-radio.radio-label-placement-end::part(label-text-wrapper){margin-inline:0}:host.has-hidden-label[slot=end] ion-radio{margin-inline-start:12px}:host.has-hidden-label .hidden-label{position:absolute;inset:0;opacity:0}:host.xs ion-radio:not(.in-item)::part(label){padding-block:calc((32px - var(--kirby-spacing-m)) * .5)}:host.sm ion-radio:not(.in-item)::part(label){padding-block:calc((44px - var(--kirby-spacing-m)) * .5)}:host.md ion-radio:not(.in-item)::part(label){padding-block:calc((56px - var(--kirby-spacing-m)) * .5)}ion-radio{box-sizing:border-box;--border-width: 1px;--color: var(--kirby-color-border-raised);--color-checked: var(--kirby-color-border-raised)}@media(hover:hover){ion-radio:hover{--color: var(--kirby-color-border-raised-hover);--color-checked: var(--kirby-color-border-raised-hover)}ion-radio:hover::part(container){background-color:var(--kirby-color-fill-raised-hover)}ion-radio:hover::part(mark){--color-checked: var(--kirby-color-fill-engaged-hover)}}ion-radio:active{--color: var(--kirby-color-border-raised-active);--color-checked: var(--kirby-color-border-raised-active)}ion-radio:active::part(container){background-color:var(--kirby-color-fill-raised-active)}ion-radio:active::part(mark){--color-checked: var(--kirby-color-fill-engaged-active)}ion-radio:focus-visible{--color: var(--kirby-color-border-focus);--color-checked: var(--kirby-color-border-focus)}ion-radio:focus-visible::part(container){transition:box-shadow 80ms linear;box-shadow:var(--kirby-focus-ring-sm-combined-inset)}ion-radio::part(container){transition:all 80ms linear 0ms;transition-property:background-color,box-shadow;background-color:var(--kirby-color-fill-raised);margin:var(--kirby-spacing-xxxxs);width:20px;height:20px}ion-radio::part(mark){--color-checked: var(--kirby-color-fill-engaged);width:var(--kirby-spacing-xs);height:var(--kirby-spacing-xs)}ion-radio::part(label){align-items:start;padding-inline:16px;line-height:var(--kirby-line-height-n)}ion-radio::part(label-text-wrapper){margin-inline:12px 0;white-space:pre-line}ion-radio::part(native-wrapper){height:var(--kirby-relative-size-m)}ion-radio.in-item::part(label){align-items:center;padding-inline:0}ion-radio.in-item::part(label-text-wrapper){margin-block:0}ion-radio.in-item.radio-label-placement-start::part(label-text-wrapper){margin-inline:0 var(--kirby-spacing-xxs)}ion-radio.in-item.radio-label-placement-end::part(label-text-wrapper){margin-inline:var(--kirby-spacing-xxs) 0}ion-radio :host-context(kirby-radio-group.error) ion-radio,ion-radio :host-context(kirby-radio-group.ng-touched.ng-invalid) ion-radio{--color: var(--kirby-color-border-raised-danger);--color-checked: var(--kirby-color-border-raised-danger)}ion-radio :host-context(kirby-radio-group.error) ion-radio::part(container),ion-radio :host-context(kirby-radio-group.ng-touched.ng-invalid) ion-radio::part(container){box-shadow:var(--kirby-error-ring-combined-inset)}ion-radio :host-context(kirby-radio-group.error) ion-radio:focus-visible,ion-radio :host-context(kirby-radio-group.ng-touched.ng-invalid) ion-radio:focus-visible{--color: var(--kirby-color-border-focus);--color-checked: var(--kirby-color-border-focus)}ion-radio :host-context(kirby-radio-group.error) ion-radio:focus-visible::part(container),ion-radio :host-context(kirby-radio-group.ng-touched.ng-invalid) ion-radio:focus-visible::part(container){box-shadow:var(--kirby-focus-ring-sm-combined-inset)}:host-context(kirby-item){z-index:var(--kirby-z-index-default)}:host-context(kirby-item) ion-radio{margin:0}:host-context(kirby-item)[slot=start]{margin-block:0;margin-inline-end:12px}\n"],
83
+ styles: [".kirby-line-clamp{display:-webkit-box;-webkit-line-clamp:var(--line-clamp, none);-webkit-box-orient:vertical;overflow:hidden}:host{display:flex}:host[disabled] ion-radio::part(label-text-wrapper),:host[disabled] ion-radio::part(native-wrapper){opacity:var(--kirby-opacity-40)}:host:has(ion-radio.in-item.radio-justify-space-between){width:100%}:host.has-hidden-label:has(ion-radio.in-item){position:initial}:host.has-hidden-label:has(ion-radio.in-item) ion-radio{position:initial}:host.has-hidden-label:has(ion-radio.in-item) ion-radio::part(label){position:initial}:host.has-hidden-label:has(ion-radio.in-item) ion-radio.radio-label-placement-start::part(label-text-wrapper),:host.has-hidden-label:has(ion-radio.in-item) ion-radio.radio-label-placement-end::part(label-text-wrapper){margin-inline:0}:host.has-hidden-label[slot=end] ion-radio{margin-inline-start:12px}:host.has-hidden-label .hidden-label{position:absolute;inset:0;opacity:0}:host.xs ion-radio:not(.in-item)::part(label){padding-block:calc((32px - var(--kirby-spacing-m)) * .5)}:host.sm ion-radio:not(.in-item)::part(label){padding-block:calc((44px - var(--kirby-spacing-m)) * .5)}:host.md ion-radio:not(.in-item)::part(label){padding-block:calc((56px - var(--kirby-spacing-m)) * .5)}ion-radio{box-sizing:border-box;--border-width: var(--kirby-stroke-xs);--color: var(--kirby-color-border-raised);--color-checked: var(--kirby-color-border-raised)}@media(hover:hover){ion-radio:hover{--color: var(--kirby-color-border-raised-hover);--color-checked: var(--kirby-color-border-raised-hover)}ion-radio:hover::part(container){background-color:var(--kirby-color-fill-raised-hover)}ion-radio:hover::part(mark){--color-checked: var(--kirby-color-fill-engaged-hover)}}ion-radio:active{--color: var(--kirby-color-border-raised-active);--color-checked: var(--kirby-color-border-raised-active)}ion-radio:active::part(container){background-color:var(--kirby-color-fill-raised-active)}ion-radio:active::part(mark){--color-checked: var(--kirby-color-fill-engaged-active)}ion-radio:focus-visible{--color: var(--kirby-color-border-focus);--color-checked: var(--kirby-color-border-focus)}ion-radio:focus-visible::part(container){transition:box-shadow 80ms linear;box-shadow:var(--kirby-focus-ring-sm-combined-inset)}ion-radio::part(container){transition:all 80ms linear 0ms;transition-property:background-color,box-shadow;background-color:var(--kirby-color-fill-raised);margin:var(--kirby-spacing-xxxxs);width:20px;height:20px}ion-radio::part(mark){--color-checked: var(--kirby-color-fill-engaged);width:var(--kirby-spacing-xs);height:var(--kirby-spacing-xs)}ion-radio::part(label){align-items:start;padding-inline:16px;line-height:var(--kirby-line-height-n)}ion-radio::part(label-text-wrapper){margin-inline:12px 0;white-space:pre-line}ion-radio::part(native-wrapper){height:var(--kirby-relative-size-m)}ion-radio.in-item::part(label){align-items:center;padding-inline:0}ion-radio.in-item::part(label-text-wrapper){margin-block:0}ion-radio.in-item.radio-label-placement-start::part(label-text-wrapper){margin-inline:0 var(--kirby-spacing-xxs)}ion-radio.in-item.radio-label-placement-end::part(label-text-wrapper){margin-inline:var(--kirby-spacing-xxs) 0}ion-radio :host-context(kirby-radio-group.error) ion-radio,ion-radio :host-context(kirby-radio-group.ng-touched.ng-invalid) ion-radio{--color: var(--kirby-color-border-raised-danger);--color-checked: var(--kirby-color-border-raised-danger)}ion-radio :host-context(kirby-radio-group.error) ion-radio::part(container),ion-radio :host-context(kirby-radio-group.ng-touched.ng-invalid) ion-radio::part(container){box-shadow:var(--kirby-error-ring-combined-inset)}ion-radio :host-context(kirby-radio-group.error) ion-radio:focus-visible,ion-radio :host-context(kirby-radio-group.ng-touched.ng-invalid) ion-radio:focus-visible{--color: var(--kirby-color-border-focus);--color-checked: var(--kirby-color-border-focus)}ion-radio :host-context(kirby-radio-group.error) ion-radio:focus-visible::part(container),ion-radio :host-context(kirby-radio-group.ng-touched.ng-invalid) ion-radio:focus-visible::part(container){box-shadow:var(--kirby-focus-ring-sm-combined-inset)}:host-context(kirby-item){z-index:var(--kirby-z-index-default)}:host-context(kirby-item) ion-radio{margin:0}:host-context(kirby-item)[slot=start]{margin-block:0;margin-inline-end:12px}\n"],
84
84
  dependencies: [{
85
85
  kind: "component",
86
86
  type: IonRadio,
@@ -103,7 +103,7 @@ var RadioComponent = class RadioComponent {
103
103
  };
104
104
  i0.ɵɵngDeclareClassMetadata({
105
105
  minVersion: "12.0.0",
106
- version: "22.2.2",
106
+ version: "22.2.3",
107
107
  ngImport: i0,
108
108
  type: RadioComponent,
109
109
  decorators: [{
@@ -114,7 +114,7 @@ i0.ɵɵngDeclareClassMetadata({
114
114
  providers: [IonicElementPartHelper],
115
115
  imports: [IonRadio],
116
116
  template: "<ion-radio\n [value]=\"value\"\n [disabled]=\"disabled\"\n mode=\"md\"\n [labelPlacement]=\"_labelPlacement\"\n [justify]=\"_justify\"\n>\n @if (_labelText) {\n <span class=\"hidden-label\">{{ _labelText }}</span>\n }\n @if (text) {\n <span [attr.aria-hidden]=\"_labelText ? true : undefined\">{{ text }}</span>\n }\n <span class=\"default-content\" [attr.aria-hidden]=\"_labelText ? true : undefined\">\n <ng-content></ng-content>\n </span>\n</ion-radio>\n",
117
- styles: [".kirby-line-clamp{display:-webkit-box;-webkit-line-clamp:var(--line-clamp, none);-webkit-box-orient:vertical;overflow:hidden}:host{display:flex}:host[disabled] ion-radio::part(label-text-wrapper),:host[disabled] ion-radio::part(native-wrapper){opacity:.4}:host:has(ion-radio.in-item.radio-justify-space-between){width:100%}:host.has-hidden-label:has(ion-radio.in-item){position:initial}:host.has-hidden-label:has(ion-radio.in-item) ion-radio{position:initial}:host.has-hidden-label:has(ion-radio.in-item) ion-radio::part(label){position:initial}:host.has-hidden-label:has(ion-radio.in-item) ion-radio.radio-label-placement-start::part(label-text-wrapper),:host.has-hidden-label:has(ion-radio.in-item) ion-radio.radio-label-placement-end::part(label-text-wrapper){margin-inline:0}:host.has-hidden-label[slot=end] ion-radio{margin-inline-start:12px}:host.has-hidden-label .hidden-label{position:absolute;inset:0;opacity:0}:host.xs ion-radio:not(.in-item)::part(label){padding-block:calc((32px - var(--kirby-spacing-m)) * .5)}:host.sm ion-radio:not(.in-item)::part(label){padding-block:calc((44px - var(--kirby-spacing-m)) * .5)}:host.md ion-radio:not(.in-item)::part(label){padding-block:calc((56px - var(--kirby-spacing-m)) * .5)}ion-radio{box-sizing:border-box;--border-width: 1px;--color: var(--kirby-color-border-raised);--color-checked: var(--kirby-color-border-raised)}@media(hover:hover){ion-radio:hover{--color: var(--kirby-color-border-raised-hover);--color-checked: var(--kirby-color-border-raised-hover)}ion-radio:hover::part(container){background-color:var(--kirby-color-fill-raised-hover)}ion-radio:hover::part(mark){--color-checked: var(--kirby-color-fill-engaged-hover)}}ion-radio:active{--color: var(--kirby-color-border-raised-active);--color-checked: var(--kirby-color-border-raised-active)}ion-radio:active::part(container){background-color:var(--kirby-color-fill-raised-active)}ion-radio:active::part(mark){--color-checked: var(--kirby-color-fill-engaged-active)}ion-radio:focus-visible{--color: var(--kirby-color-border-focus);--color-checked: var(--kirby-color-border-focus)}ion-radio:focus-visible::part(container){transition:box-shadow 80ms linear;box-shadow:var(--kirby-focus-ring-sm-combined-inset)}ion-radio::part(container){transition:all 80ms linear 0ms;transition-property:background-color,box-shadow;background-color:var(--kirby-color-fill-raised);margin:var(--kirby-spacing-xxxxs);width:20px;height:20px}ion-radio::part(mark){--color-checked: var(--kirby-color-fill-engaged);width:var(--kirby-spacing-xs);height:var(--kirby-spacing-xs)}ion-radio::part(label){align-items:start;padding-inline:16px;line-height:var(--kirby-line-height-n)}ion-radio::part(label-text-wrapper){margin-inline:12px 0;white-space:pre-line}ion-radio::part(native-wrapper){height:var(--kirby-relative-size-m)}ion-radio.in-item::part(label){align-items:center;padding-inline:0}ion-radio.in-item::part(label-text-wrapper){margin-block:0}ion-radio.in-item.radio-label-placement-start::part(label-text-wrapper){margin-inline:0 var(--kirby-spacing-xxs)}ion-radio.in-item.radio-label-placement-end::part(label-text-wrapper){margin-inline:var(--kirby-spacing-xxs) 0}ion-radio :host-context(kirby-radio-group.error) ion-radio,ion-radio :host-context(kirby-radio-group.ng-touched.ng-invalid) ion-radio{--color: var(--kirby-color-border-raised-danger);--color-checked: var(--kirby-color-border-raised-danger)}ion-radio :host-context(kirby-radio-group.error) ion-radio::part(container),ion-radio :host-context(kirby-radio-group.ng-touched.ng-invalid) ion-radio::part(container){box-shadow:var(--kirby-error-ring-combined-inset)}ion-radio :host-context(kirby-radio-group.error) ion-radio:focus-visible,ion-radio :host-context(kirby-radio-group.ng-touched.ng-invalid) ion-radio:focus-visible{--color: var(--kirby-color-border-focus);--color-checked: var(--kirby-color-border-focus)}ion-radio :host-context(kirby-radio-group.error) ion-radio:focus-visible::part(container),ion-radio :host-context(kirby-radio-group.ng-touched.ng-invalid) ion-radio:focus-visible::part(container){box-shadow:var(--kirby-focus-ring-sm-combined-inset)}:host-context(kirby-item){z-index:var(--kirby-z-index-default)}:host-context(kirby-item) ion-radio{margin:0}:host-context(kirby-item)[slot=start]{margin-block:0;margin-inline-end:12px}\n"]
117
+ styles: [".kirby-line-clamp{display:-webkit-box;-webkit-line-clamp:var(--line-clamp, none);-webkit-box-orient:vertical;overflow:hidden}:host{display:flex}:host[disabled] ion-radio::part(label-text-wrapper),:host[disabled] ion-radio::part(native-wrapper){opacity:var(--kirby-opacity-40)}:host:has(ion-radio.in-item.radio-justify-space-between){width:100%}:host.has-hidden-label:has(ion-radio.in-item){position:initial}:host.has-hidden-label:has(ion-radio.in-item) ion-radio{position:initial}:host.has-hidden-label:has(ion-radio.in-item) ion-radio::part(label){position:initial}:host.has-hidden-label:has(ion-radio.in-item) ion-radio.radio-label-placement-start::part(label-text-wrapper),:host.has-hidden-label:has(ion-radio.in-item) ion-radio.radio-label-placement-end::part(label-text-wrapper){margin-inline:0}:host.has-hidden-label[slot=end] ion-radio{margin-inline-start:12px}:host.has-hidden-label .hidden-label{position:absolute;inset:0;opacity:0}:host.xs ion-radio:not(.in-item)::part(label){padding-block:calc((32px - var(--kirby-spacing-m)) * .5)}:host.sm ion-radio:not(.in-item)::part(label){padding-block:calc((44px - var(--kirby-spacing-m)) * .5)}:host.md ion-radio:not(.in-item)::part(label){padding-block:calc((56px - var(--kirby-spacing-m)) * .5)}ion-radio{box-sizing:border-box;--border-width: var(--kirby-stroke-xs);--color: var(--kirby-color-border-raised);--color-checked: var(--kirby-color-border-raised)}@media(hover:hover){ion-radio:hover{--color: var(--kirby-color-border-raised-hover);--color-checked: var(--kirby-color-border-raised-hover)}ion-radio:hover::part(container){background-color:var(--kirby-color-fill-raised-hover)}ion-radio:hover::part(mark){--color-checked: var(--kirby-color-fill-engaged-hover)}}ion-radio:active{--color: var(--kirby-color-border-raised-active);--color-checked: var(--kirby-color-border-raised-active)}ion-radio:active::part(container){background-color:var(--kirby-color-fill-raised-active)}ion-radio:active::part(mark){--color-checked: var(--kirby-color-fill-engaged-active)}ion-radio:focus-visible{--color: var(--kirby-color-border-focus);--color-checked: var(--kirby-color-border-focus)}ion-radio:focus-visible::part(container){transition:box-shadow 80ms linear;box-shadow:var(--kirby-focus-ring-sm-combined-inset)}ion-radio::part(container){transition:all 80ms linear 0ms;transition-property:background-color,box-shadow;background-color:var(--kirby-color-fill-raised);margin:var(--kirby-spacing-xxxxs);width:20px;height:20px}ion-radio::part(mark){--color-checked: var(--kirby-color-fill-engaged);width:var(--kirby-spacing-xs);height:var(--kirby-spacing-xs)}ion-radio::part(label){align-items:start;padding-inline:16px;line-height:var(--kirby-line-height-n)}ion-radio::part(label-text-wrapper){margin-inline:12px 0;white-space:pre-line}ion-radio::part(native-wrapper){height:var(--kirby-relative-size-m)}ion-radio.in-item::part(label){align-items:center;padding-inline:0}ion-radio.in-item::part(label-text-wrapper){margin-block:0}ion-radio.in-item.radio-label-placement-start::part(label-text-wrapper){margin-inline:0 var(--kirby-spacing-xxs)}ion-radio.in-item.radio-label-placement-end::part(label-text-wrapper){margin-inline:var(--kirby-spacing-xxs) 0}ion-radio :host-context(kirby-radio-group.error) ion-radio,ion-radio :host-context(kirby-radio-group.ng-touched.ng-invalid) ion-radio{--color: var(--kirby-color-border-raised-danger);--color-checked: var(--kirby-color-border-raised-danger)}ion-radio :host-context(kirby-radio-group.error) ion-radio::part(container),ion-radio :host-context(kirby-radio-group.ng-touched.ng-invalid) ion-radio::part(container){box-shadow:var(--kirby-error-ring-combined-inset)}ion-radio :host-context(kirby-radio-group.error) ion-radio:focus-visible,ion-radio :host-context(kirby-radio-group.ng-touched.ng-invalid) ion-radio:focus-visible{--color: var(--kirby-color-border-focus);--color-checked: var(--kirby-color-border-focus)}ion-radio :host-context(kirby-radio-group.error) ion-radio:focus-visible::part(container),ion-radio :host-context(kirby-radio-group.ng-touched.ng-invalid) ion-radio:focus-visible::part(container){box-shadow:var(--kirby-focus-ring-sm-combined-inset)}:host-context(kirby-item){z-index:var(--kirby-z-index-default)}:host-context(kirby-item) ion-radio{margin:0}:host-context(kirby-item)[slot=start]{margin-block:0;margin-inline-end:12px}\n"]
118
118
  }]
119
119
  }],
120
120
  ctorParameters: () => [{ type: i0.ElementRef }, { type: i1.IonicElementPartHelper }],
@@ -308,7 +308,7 @@ var RadioGroupComponent = class RadioGroupComponent {
308
308
  static {
309
309
  this.ɵfac = i0.ɵɵngDeclareFactory({
310
310
  minVersion: "12.0.0",
311
- version: "22.2.2",
311
+ version: "22.2.3",
312
312
  ngImport: i0,
313
313
  type: RadioGroupComponent,
314
314
  deps: [
@@ -322,7 +322,7 @@ var RadioGroupComponent = class RadioGroupComponent {
322
322
  static {
323
323
  this.ɵcmp = i0.ɵɵngDeclareComponent({
324
324
  minVersion: "17.0.0",
325
- version: "22.2.2",
325
+ version: "22.2.3",
326
326
  type: RadioGroupComponent,
327
327
  isStandalone: true,
328
328
  selector: "kirby-radio-group",
@@ -412,7 +412,7 @@ var RadioGroupComponent = class RadioGroupComponent {
412
412
  };
413
413
  i0.ɵɵngDeclareClassMetadata({
414
414
  minVersion: "12.0.0",
415
- version: "22.2.2",
415
+ version: "22.2.3",
416
416
  ngImport: i0,
417
417
  type: RadioGroupComponent,
418
418
  decorators: [{
@@ -478,7 +478,7 @@ var RadioModule = class RadioModule {
478
478
  static {
479
479
  this.ɵfac = i0.ɵɵngDeclareFactory({
480
480
  minVersion: "12.0.0",
481
- version: "22.2.2",
481
+ version: "22.2.3",
482
482
  ngImport: i0,
483
483
  type: RadioModule,
484
484
  deps: [],
@@ -488,7 +488,7 @@ var RadioModule = class RadioModule {
488
488
  static {
489
489
  this.ɵmod = i0.ɵɵngDeclareNgModule({
490
490
  minVersion: "14.0.0",
491
- version: "22.2.2",
491
+ version: "22.2.3",
492
492
  ngImport: i0,
493
493
  type: RadioModule,
494
494
  imports: [
@@ -504,7 +504,7 @@ var RadioModule = class RadioModule {
504
504
  static {
505
505
  this.ɵinj = i0.ɵɵngDeclareInjector({
506
506
  minVersion: "12.0.0",
507
- version: "22.2.2",
507
+ version: "22.2.3",
508
508
  ngImport: i0,
509
509
  type: RadioModule,
510
510
  imports: [
@@ -518,7 +518,7 @@ var RadioModule = class RadioModule {
518
518
  };
519
519
  i0.ɵɵngDeclareClassMetadata({
520
520
  minVersion: "12.0.0",
521
- version: "22.2.2",
521
+ version: "22.2.3",
522
522
  ngImport: i0,
523
523
  type: RadioModule,
524
524
  decorators: [{