@kirbydesign/designsystem 11.11.3-dev-e7cb27f → 12.0.0-dev-67d5287

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 (282) hide show
  1. package/fesm2022/kirbydesign-designsystem-accordion.mjs +246 -135
  2. package/fesm2022/kirbydesign-designsystem-accordion.mjs.map +1 -1
  3. package/fesm2022/kirbydesign-designsystem-action-group.mjs +229 -134
  4. package/fesm2022/kirbydesign-designsystem-action-group.mjs.map +1 -1
  5. package/fesm2022/kirbydesign-designsystem-avatar.mjs +102 -55
  6. package/fesm2022/kirbydesign-designsystem-avatar.mjs.map +1 -1
  7. package/fesm2022/kirbydesign-designsystem-badge.mjs +85 -42
  8. package/fesm2022/kirbydesign-designsystem-badge.mjs.map +1 -1
  9. package/fesm2022/kirbydesign-designsystem-button.mjs +203 -170
  10. package/fesm2022/kirbydesign-designsystem-button.mjs.map +1 -1
  11. package/fesm2022/kirbydesign-designsystem-calendar.mjs +524 -516
  12. package/fesm2022/kirbydesign-designsystem-calendar.mjs.map +1 -1
  13. package/fesm2022/kirbydesign-designsystem-card.mjs +439 -205
  14. package/fesm2022/kirbydesign-designsystem-card.mjs.map +1 -1
  15. package/fesm2022/kirbydesign-designsystem-chart.mjs +1388 -1469
  16. package/fesm2022/kirbydesign-designsystem-chart.mjs.map +1 -1
  17. package/fesm2022/kirbydesign-designsystem-checkbox.mjs +215 -176
  18. package/fesm2022/kirbydesign-designsystem-checkbox.mjs.map +1 -1
  19. package/fesm2022/kirbydesign-designsystem-config.mjs +50 -96
  20. package/fesm2022/kirbydesign-designsystem-config.mjs.map +1 -1
  21. package/fesm2022/kirbydesign-designsystem-data-table.mjs +180 -83
  22. package/fesm2022/kirbydesign-designsystem-data-table.mjs.map +1 -1
  23. package/fesm2022/kirbydesign-designsystem-divider.mjs +46 -19
  24. package/fesm2022/kirbydesign-designsystem-divider.mjs.map +1 -1
  25. package/fesm2022/kirbydesign-designsystem-dropdown.mjs +878 -752
  26. package/fesm2022/kirbydesign-designsystem-dropdown.mjs.map +1 -1
  27. package/fesm2022/kirbydesign-designsystem-empty-state.mjs +164 -91
  28. package/fesm2022/kirbydesign-designsystem-empty-state.mjs.map +1 -1
  29. package/fesm2022/kirbydesign-designsystem-fab-sheet.mjs +213 -85
  30. package/fesm2022/kirbydesign-designsystem-fab-sheet.mjs.map +1 -1
  31. package/fesm2022/kirbydesign-designsystem-flag.mjs +67 -33
  32. package/fesm2022/kirbydesign-designsystem-flag.mjs.map +1 -1
  33. package/fesm2022/kirbydesign-designsystem-form-field.mjs +1260 -901
  34. package/fesm2022/kirbydesign-designsystem-form-field.mjs.map +1 -1
  35. package/fesm2022/kirbydesign-designsystem-gesture.mjs +38 -23
  36. package/fesm2022/kirbydesign-designsystem-gesture.mjs.map +1 -1
  37. package/fesm2022/kirbydesign-designsystem-header.mjs +422 -182
  38. package/fesm2022/kirbydesign-designsystem-header.mjs.map +1 -1
  39. package/fesm2022/kirbydesign-designsystem-helpers-scss.mjs +16 -14
  40. package/fesm2022/kirbydesign-designsystem-helpers-scss.mjs.map +1 -1
  41. package/fesm2022/kirbydesign-designsystem-helpers.mjs +251 -361
  42. package/fesm2022/kirbydesign-designsystem-helpers.mjs.map +1 -1
  43. package/fesm2022/kirbydesign-designsystem-icon.mjs +881 -303
  44. package/fesm2022/kirbydesign-designsystem-icon.mjs.map +1 -1
  45. package/fesm2022/kirbydesign-designsystem-item-group.mjs +52 -23
  46. package/fesm2022/kirbydesign-designsystem-item-group.mjs.map +1 -1
  47. package/fesm2022/kirbydesign-designsystem-item-sliding.mjs +147 -43
  48. package/fesm2022/kirbydesign-designsystem-item-sliding.mjs.map +1 -1
  49. package/fesm2022/kirbydesign-designsystem-item.mjs +395 -151
  50. package/fesm2022/kirbydesign-designsystem-item.mjs.map +1 -1
  51. package/fesm2022/kirbydesign-designsystem-kirby-app.mjs +136 -54
  52. package/fesm2022/kirbydesign-designsystem-kirby-app.mjs.map +1 -1
  53. package/fesm2022/kirbydesign-designsystem-list.mjs +1185 -697
  54. package/fesm2022/kirbydesign-designsystem-list.mjs.map +1 -1
  55. package/fesm2022/kirbydesign-designsystem-loading-overlay.mjs +166 -76
  56. package/fesm2022/kirbydesign-designsystem-loading-overlay.mjs.map +1 -1
  57. package/fesm2022/kirbydesign-designsystem-menu.mjs +420 -311
  58. package/fesm2022/kirbydesign-designsystem-menu.mjs.map +1 -1
  59. package/fesm2022/kirbydesign-designsystem-modal.mjs +2467 -1912
  60. package/fesm2022/kirbydesign-designsystem-modal.mjs.map +1 -1
  61. package/fesm2022/kirbydesign-designsystem-page.mjs +1505 -923
  62. package/fesm2022/kirbydesign-designsystem-page.mjs.map +1 -1
  63. package/fesm2022/kirbydesign-designsystem-popover.mjs +203 -183
  64. package/fesm2022/kirbydesign-designsystem-popover.mjs.map +1 -1
  65. package/fesm2022/kirbydesign-designsystem-progress-circle.mjs +209 -121
  66. package/fesm2022/kirbydesign-designsystem-progress-circle.mjs.map +1 -1
  67. package/fesm2022/kirbydesign-designsystem-radio.mjs +537 -365
  68. package/fesm2022/kirbydesign-designsystem-radio.mjs.map +1 -1
  69. package/fesm2022/kirbydesign-designsystem-range.mjs +207 -150
  70. package/fesm2022/kirbydesign-designsystem-range.mjs.map +1 -1
  71. package/fesm2022/kirbydesign-designsystem-reorder-list.mjs +217 -104
  72. package/fesm2022/kirbydesign-designsystem-reorder-list.mjs.map +1 -1
  73. package/fesm2022/kirbydesign-designsystem-router-outlet.mjs +113 -38
  74. package/fesm2022/kirbydesign-designsystem-router-outlet.mjs.map +1 -1
  75. package/fesm2022/kirbydesign-designsystem-section-header.mjs +56 -18
  76. package/fesm2022/kirbydesign-designsystem-section-header.mjs.map +1 -1
  77. package/fesm2022/kirbydesign-designsystem-segmented-control.mjs +276 -232
  78. package/fesm2022/kirbydesign-designsystem-segmented-control.mjs.map +1 -1
  79. package/fesm2022/kirbydesign-designsystem-shared-floating.mjs +319 -382
  80. package/fesm2022/kirbydesign-designsystem-shared-floating.mjs.map +1 -1
  81. package/fesm2022/kirbydesign-designsystem-shared-portal.mjs +73 -84
  82. package/fesm2022/kirbydesign-designsystem-shared-portal.mjs.map +1 -1
  83. package/fesm2022/kirbydesign-designsystem-shared.mjs +665 -529
  84. package/fesm2022/kirbydesign-designsystem-shared.mjs.map +1 -1
  85. package/fesm2022/kirbydesign-designsystem-slide-button.mjs +140 -91
  86. package/fesm2022/kirbydesign-designsystem-slide-button.mjs.map +1 -1
  87. package/fesm2022/kirbydesign-designsystem-slide.mjs +360 -158
  88. package/fesm2022/kirbydesign-designsystem-slide.mjs.map +1 -1
  89. package/fesm2022/kirbydesign-designsystem-spinner.mjs +90 -32
  90. package/fesm2022/kirbydesign-designsystem-spinner.mjs.map +1 -1
  91. package/fesm2022/kirbydesign-designsystem-tab-navigation.mjs +348 -181
  92. package/fesm2022/kirbydesign-designsystem-tab-navigation.mjs.map +1 -1
  93. package/fesm2022/kirbydesign-designsystem-tabs.mjs +286 -121
  94. package/fesm2022/kirbydesign-designsystem-tabs.mjs.map +1 -1
  95. package/fesm2022/kirbydesign-designsystem-testing-base.mjs +6232 -3164
  96. package/fesm2022/kirbydesign-designsystem-testing-base.mjs.map +1 -1
  97. package/fesm2022/kirbydesign-designsystem-testing-jasmine.mjs +118 -95
  98. package/fesm2022/kirbydesign-designsystem-testing-jasmine.mjs.map +1 -1
  99. package/fesm2022/kirbydesign-designsystem-testing-jest.mjs +128 -101
  100. package/fesm2022/kirbydesign-designsystem-testing-jest.mjs.map +1 -1
  101. package/fesm2022/kirbydesign-designsystem-testing.mjs +236 -243
  102. package/fesm2022/kirbydesign-designsystem-testing.mjs.map +1 -1
  103. package/fesm2022/kirbydesign-designsystem-toast.mjs +98 -62
  104. package/fesm2022/kirbydesign-designsystem-toast.mjs.map +1 -1
  105. package/fesm2022/kirbydesign-designsystem-toggle-button.mjs +155 -127
  106. package/fesm2022/kirbydesign-designsystem-toggle-button.mjs.map +1 -1
  107. package/fesm2022/kirbydesign-designsystem-toggle.mjs +180 -150
  108. package/fesm2022/kirbydesign-designsystem-toggle.mjs.map +1 -1
  109. package/fesm2022/kirbydesign-designsystem-types.mjs +39 -24
  110. package/fesm2022/kirbydesign-designsystem-types.mjs.map +1 -1
  111. package/fesm2022/kirbydesign-designsystem.mjs +516 -407
  112. package/fesm2022/kirbydesign-designsystem.mjs.map +1 -1
  113. package/icons/svg/megaphone.svg +3 -0
  114. package/package.json +10 -10
  115. package/readme.md +37 -0
  116. package/types/kirbydesign-designsystem-accordion.d.ts +72 -39
  117. package/types/kirbydesign-designsystem-accordion.d.ts.map +1 -1
  118. package/types/kirbydesign-designsystem-action-group.d.ts +46 -39
  119. package/types/kirbydesign-designsystem-action-group.d.ts.map +1 -1
  120. package/types/kirbydesign-designsystem-avatar.d.ts +62 -26
  121. package/types/kirbydesign-designsystem-avatar.d.ts.map +1 -1
  122. package/types/kirbydesign-designsystem-badge.d.ts +30 -19
  123. package/types/kirbydesign-designsystem-badge.d.ts.map +1 -1
  124. package/types/kirbydesign-designsystem-button.d.ts +70 -45
  125. package/types/kirbydesign-designsystem-button.d.ts.map +1 -1
  126. package/types/kirbydesign-designsystem-calendar.d.ts +193 -132
  127. package/types/kirbydesign-designsystem-calendar.d.ts.map +1 -1
  128. package/types/kirbydesign-designsystem-card.d.ts +130 -66
  129. package/types/kirbydesign-designsystem-card.d.ts.map +1 -1
  130. package/types/kirbydesign-designsystem-chart.d.ts +198 -172
  131. package/types/kirbydesign-designsystem-chart.d.ts.map +1 -1
  132. package/types/kirbydesign-designsystem-checkbox.d.ts +96 -68
  133. package/types/kirbydesign-designsystem-checkbox.d.ts.map +1 -1
  134. package/types/kirbydesign-designsystem-config.d.ts +17 -21
  135. package/types/kirbydesign-designsystem-config.d.ts.map +1 -1
  136. package/types/kirbydesign-designsystem-data-table.d.ts +46 -26
  137. package/types/kirbydesign-designsystem-data-table.d.ts.map +1 -1
  138. package/types/kirbydesign-designsystem-divider.d.ts +11 -9
  139. package/types/kirbydesign-designsystem-divider.d.ts.map +1 -1
  140. package/types/kirbydesign-designsystem-dropdown.d.ts +219 -166
  141. package/types/kirbydesign-designsystem-dropdown.d.ts.map +1 -1
  142. package/types/kirbydesign-designsystem-empty-state.d.ts +47 -35
  143. package/types/kirbydesign-designsystem-empty-state.d.ts.map +1 -1
  144. package/types/kirbydesign-designsystem-fab-sheet.d.ts +34 -28
  145. package/types/kirbydesign-designsystem-fab-sheet.d.ts.map +1 -1
  146. package/types/kirbydesign-designsystem-flag.d.ts +18 -13
  147. package/types/kirbydesign-designsystem-flag.d.ts.map +1 -1
  148. package/types/kirbydesign-designsystem-form-field.d.ts +409 -242
  149. package/types/kirbydesign-designsystem-form-field.d.ts.map +1 -1
  150. package/types/kirbydesign-designsystem-gesture.d.ts +41 -46
  151. package/types/kirbydesign-designsystem-gesture.d.ts.map +1 -1
  152. package/types/kirbydesign-designsystem-header.d.ts +102 -64
  153. package/types/kirbydesign-designsystem-header.d.ts.map +1 -1
  154. package/types/kirbydesign-designsystem-helpers-scss.d.ts +6 -8
  155. package/types/kirbydesign-designsystem-helpers-scss.d.ts.map +1 -1
  156. package/types/kirbydesign-designsystem-helpers.d.ts +83 -97
  157. package/types/kirbydesign-designsystem-helpers.d.ts.map +1 -1
  158. package/types/kirbydesign-designsystem-icon.d.ts +63 -59
  159. package/types/kirbydesign-designsystem-icon.d.ts.map +1 -1
  160. package/types/kirbydesign-designsystem-item-group.d.ts +6 -9
  161. package/types/kirbydesign-designsystem-item-group.d.ts.map +1 -1
  162. package/types/kirbydesign-designsystem-item-sliding.d.ts +30 -26
  163. package/types/kirbydesign-designsystem-item-sliding.d.ts.map +1 -1
  164. package/types/kirbydesign-designsystem-item.d.ts +93 -54
  165. package/types/kirbydesign-designsystem-item.d.ts.map +1 -1
  166. package/types/kirbydesign-designsystem-kirby-app.d.ts +18 -19
  167. package/types/kirbydesign-designsystem-kirby-app.d.ts.map +1 -1
  168. package/types/kirbydesign-designsystem-list.d.ts +387 -263
  169. package/types/kirbydesign-designsystem-list.d.ts.map +1 -1
  170. package/types/kirbydesign-designsystem-loading-overlay.d.ts +35 -24
  171. package/types/kirbydesign-designsystem-loading-overlay.d.ts.map +1 -1
  172. package/types/kirbydesign-designsystem-menu.d.ts +119 -69
  173. package/types/kirbydesign-designsystem-menu.d.ts.map +1 -1
  174. package/types/kirbydesign-designsystem-modal.d.ts +577 -455
  175. package/types/kirbydesign-designsystem-modal.d.ts.map +1 -1
  176. package/types/kirbydesign-designsystem-page.d.ts +304 -229
  177. package/types/kirbydesign-designsystem-page.d.ts.map +1 -1
  178. package/types/kirbydesign-designsystem-popover.d.ts +48 -40
  179. package/types/kirbydesign-designsystem-popover.d.ts.map +1 -1
  180. package/types/kirbydesign-designsystem-progress-circle.d.ts +60 -38
  181. package/types/kirbydesign-designsystem-progress-circle.d.ts.map +1 -1
  182. package/types/kirbydesign-designsystem-radio.d.ts +147 -98
  183. package/types/kirbydesign-designsystem-radio.d.ts.map +1 -1
  184. package/types/kirbydesign-designsystem-range.d.ts +90 -45
  185. package/types/kirbydesign-designsystem-range.d.ts.map +1 -1
  186. package/types/kirbydesign-designsystem-reorder-list.d.ts +44 -32
  187. package/types/kirbydesign-designsystem-reorder-list.d.ts.map +1 -1
  188. package/types/kirbydesign-designsystem-router-outlet.d.ts +23 -18
  189. package/types/kirbydesign-designsystem-router-outlet.d.ts.map +1 -1
  190. package/types/kirbydesign-designsystem-section-header.d.ts +5 -8
  191. package/types/kirbydesign-designsystem-section-header.d.ts.map +1 -1
  192. package/types/kirbydesign-designsystem-segmented-control.d.ts +123 -100
  193. package/types/kirbydesign-designsystem-segmented-control.d.ts.map +1 -1
  194. package/types/kirbydesign-designsystem-shared-floating.d.ts +183 -128
  195. package/types/kirbydesign-designsystem-shared-floating.d.ts.map +1 -1
  196. package/types/kirbydesign-designsystem-shared-portal.d.ts +29 -28
  197. package/types/kirbydesign-designsystem-shared-portal.d.ts.map +1 -1
  198. package/types/kirbydesign-designsystem-shared.d.ts +143 -139
  199. package/types/kirbydesign-designsystem-shared.d.ts.map +1 -1
  200. package/types/kirbydesign-designsystem-slide-button.d.ts +43 -34
  201. package/types/kirbydesign-designsystem-slide-button.d.ts.map +1 -1
  202. package/types/kirbydesign-designsystem-slide.d.ts +80 -59
  203. package/types/kirbydesign-designsystem-slide.d.ts.map +1 -1
  204. package/types/kirbydesign-designsystem-spinner.d.ts +13 -14
  205. package/types/kirbydesign-designsystem-spinner.d.ts.map +1 -1
  206. package/types/kirbydesign-designsystem-tab-navigation.d.ts +78 -55
  207. package/types/kirbydesign-designsystem-tab-navigation.d.ts.map +1 -1
  208. package/types/kirbydesign-designsystem-tabs.d.ts +50 -45
  209. package/types/kirbydesign-designsystem-tabs.d.ts.map +1 -1
  210. package/types/kirbydesign-designsystem-testing-base.d.ts +2430 -815
  211. package/types/kirbydesign-designsystem-testing-base.d.ts.map +1 -1
  212. package/types/kirbydesign-designsystem-testing-jasmine.d.ts +9 -10
  213. package/types/kirbydesign-designsystem-testing-jasmine.d.ts.map +1 -1
  214. package/types/kirbydesign-designsystem-testing-jest.d.ts +9 -10
  215. package/types/kirbydesign-designsystem-testing-jest.d.ts.map +1 -1
  216. package/types/kirbydesign-designsystem-testing.d.ts +52 -58
  217. package/types/kirbydesign-designsystem-testing.d.ts.map +1 -1
  218. package/types/kirbydesign-designsystem-toast.d.ts +25 -31
  219. package/types/kirbydesign-designsystem-toast.d.ts.map +1 -1
  220. package/types/kirbydesign-designsystem-toggle-button.d.ts +62 -56
  221. package/types/kirbydesign-designsystem-toggle-button.d.ts.map +1 -1
  222. package/types/kirbydesign-designsystem-toggle.d.ts +71 -63
  223. package/types/kirbydesign-designsystem-toggle.d.ts.map +1 -1
  224. package/types/kirbydesign-designsystem-types.d.ts +15 -22
  225. package/types/kirbydesign-designsystem-types.d.ts.map +1 -1
  226. package/types/kirbydesign-designsystem.d.ts +135 -123
  227. package/types/kirbydesign-designsystem.d.ts.map +1 -1
  228. package/accordion/package.json +0 -4
  229. package/action-group/package.json +0 -4
  230. package/avatar/package.json +0 -4
  231. package/badge/package.json +0 -4
  232. package/button/package.json +0 -4
  233. package/calendar/package.json +0 -4
  234. package/card/package.json +0 -4
  235. package/chart/package.json +0 -4
  236. package/checkbox/package.json +0 -4
  237. package/config/package.json +0 -4
  238. package/data-table/package.json +0 -4
  239. package/divider/package.json +0 -4
  240. package/dropdown/package.json +0 -4
  241. package/empty-state/package.json +0 -4
  242. package/fab-sheet/package.json +0 -4
  243. package/flag/package.json +0 -4
  244. package/form-field/package.json +0 -4
  245. package/gesture/package.json +0 -4
  246. package/header/package.json +0 -4
  247. package/helpers/package.json +0 -4
  248. package/helpers/scss/package.json +0 -4
  249. package/icon/package.json +0 -4
  250. package/item/package.json +0 -4
  251. package/item-group/package.json +0 -4
  252. package/item-sliding/package.json +0 -4
  253. package/kirby-app/package.json +0 -4
  254. package/list/package.json +0 -4
  255. package/loading-overlay/package.json +0 -4
  256. package/menu/package.json +0 -4
  257. package/modal/package.json +0 -4
  258. package/page/package.json +0 -4
  259. package/popover/package.json +0 -4
  260. package/progress-circle/package.json +0 -4
  261. package/radio/package.json +0 -4
  262. package/range/package.json +0 -4
  263. package/reorder-list/package.json +0 -4
  264. package/router-outlet/package.json +0 -4
  265. package/section-header/package.json +0 -4
  266. package/segmented-control/package.json +0 -4
  267. package/shared/floating/package.json +0 -4
  268. package/shared/package.json +0 -4
  269. package/shared/portal/package.json +0 -4
  270. package/slide/package.json +0 -4
  271. package/slide-button/package.json +0 -4
  272. package/spinner/package.json +0 -4
  273. package/tab-navigation/package.json +0 -4
  274. package/tabs/package.json +0 -4
  275. package/testing/package.json +0 -4
  276. package/testing-base/package.json +0 -4
  277. package/testing-jasmine/package.json +0 -4
  278. package/testing-jest/package.json +0 -4
  279. package/toast/package.json +0 -4
  280. package/toggle/package.json +0 -4
  281. package/toggle-button/package.json +0 -4
  282. package/types/package.json +0 -4
@@ -1,936 +1,1518 @@
1
- import * as i0 from '@angular/core';
2
- import { InjectionToken, Directive, Input, HostBinding, Optional, Component, EventEmitter, Injector, RendererStyleFlags2, ElementRef, TemplateRef, HostListener, ContentChild, ContentChildren, ViewChild, ViewChildren, Output, SkipSelf, Inject, ChangeDetectionStrategy, NgModule } from '@angular/core';
3
- import * as i2 from '@angular/router';
4
- import { NavigationStart, NavigationEnd } from '@angular/router';
5
- import * as i5 from '@ionic/angular';
6
- import { IonHeader, IonToolbar, IonButtons, IonBackButton, IonTitle, IonContent, IonRefresher, IonFooter } from '@ionic/angular';
7
- import { componentOnReady } from '@ionic/core';
8
- import * as i4 from '@kirbydesign/designsystem/tabs';
9
- import { selectedTabClickEvent } from '@kirbydesign/designsystem/tabs';
10
- import { Subject, fromEvent } from 'rxjs';
11
- import { filter, takeUntil, debounceTime, map } from 'rxjs/operators';
12
- import { ACTIONGROUP_CONFIG } from '@kirbydesign/designsystem/action-group';
13
- import { HeaderComponent, HeaderModule } from '@kirbydesign/designsystem/header';
14
- import * as i6 from '@kirbydesign/designsystem/helpers';
15
- import { observeContent, KirbyAnimation, IonicElementPartHelper } from '@kirbydesign/designsystem/helpers';
16
- import * as i1 from '@kirbydesign/designsystem/modal';
17
- import { ModalElementComponent, ModalElementType } from '@kirbydesign/designsystem/modal';
18
- import * as i3 from '@kirbydesign/designsystem/shared';
19
- import { FitHeadingDirective } from '@kirbydesign/designsystem/shared';
20
- import { getGlobalConfig } from '@kirbydesign/designsystem/config';
21
- import { NgTemplateOutlet, NgClass, CommonModule } from '@angular/common';
22
- import { SpinnerComponent, SpinnerModule } from '@kirbydesign/designsystem/spinner';
23
- import * as i7 from '@angular/platform-browser';
24
-
25
- /**
26
- * Specify scroll event debounce time in ms and scrolled offset from top in pixels
27
- */
1
+ import * as i0 from "@angular/core";
2
+ import { ChangeDetectionStrategy, Component, ContentChild, ContentChildren, Directive, ElementRef, EventEmitter, HostBinding, HostListener, Inject, InjectionToken, Injector, Input, NgModule, Optional, Output, RendererStyleFlags2, SkipSelf, TemplateRef, ViewChild, ViewChildren } from "@angular/core";
3
+ import * as i2 from "@angular/router";
4
+ import { NavigationEnd, NavigationStart } from "@angular/router";
5
+ import * as i5 from "@ionic/angular";
6
+ import { IonBackButton, IonButtons, IonContent, IonFooter, IonHeader, IonRefresher, IonTitle, IonToolbar } from "@ionic/angular";
7
+ import { componentOnReady } from "@ionic/core";
8
+ import * as i4 from "@kirbydesign/designsystem/tabs";
9
+ import { selectedTabClickEvent } from "@kirbydesign/designsystem/tabs";
10
+ import { Subject, fromEvent } from "rxjs";
11
+ import { debounceTime, filter, map, takeUntil } from "rxjs/operators";
12
+ import { ACTIONGROUP_CONFIG } from "@kirbydesign/designsystem/action-group";
13
+ import { HeaderComponent, HeaderModule } from "@kirbydesign/designsystem/header";
14
+ import * as i6 from "@kirbydesign/designsystem/helpers";
15
+ import { IonicElementPartHelper, KirbyAnimation, observeContent } from "@kirbydesign/designsystem/helpers";
16
+ import * as i1 from "@kirbydesign/designsystem/modal";
17
+ import { ModalElementComponent, ModalElementType } from "@kirbydesign/designsystem/modal";
18
+ import * as i3 from "@kirbydesign/designsystem/shared";
19
+ import { FitHeadingDirective } from "@kirbydesign/designsystem/shared";
20
+ import { getGlobalConfig } from "@kirbydesign/designsystem/config";
21
+ import { CommonModule, NgClass, NgTemplateOutlet } from "@angular/common";
22
+ import { SpinnerComponent, SpinnerModule } from "@kirbydesign/designsystem/spinner";
23
+ import * as i7 from "@angular/platform-browser";
28
24
  const contentScrollDebounceTimeInMS = 10;
29
25
  const contentScrolledOffsetInPixels = 4;
30
- const PAGE_BACK_BUTTON_OVERRIDE = new InjectionToken('page-back-button-override');
31
- class PageTitleDirective {
32
- /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.23", ngImport: i0, type: PageTitleDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
33
- /** @nocollapse */ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.23", type: PageTitleDirective, isStandalone: true, selector: "[kirbyPageTitle]", ngImport: i0 }); }
34
- }
35
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.23", ngImport: i0, type: PageTitleDirective, decorators: [{
36
- type: Directive,
37
- args: [{ selector: '[kirbyPageTitle]' }]
38
- }] });
39
- class PageSubtitleDirective {
40
- /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.23", ngImport: i0, type: PageSubtitleDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
41
- /** @nocollapse */ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.23", type: PageSubtitleDirective, isStandalone: true, selector: "[kirbyPageSubtitle]", ngImport: i0 }); }
42
- }
43
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.23", ngImport: i0, type: PageSubtitleDirective, decorators: [{
44
- type: Directive,
45
- args: [{ selector: '[kirbyPageSubtitle]' }]
46
- }] });
47
- class PageToolbarTitleDirective {
48
- /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.23", ngImport: i0, type: PageToolbarTitleDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
49
- /** @nocollapse */ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.23", type: PageToolbarTitleDirective, isStandalone: true, selector: "[kirbyPageToolbarTitle]", ngImport: i0 }); }
50
- }
51
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.23", ngImport: i0, type: PageToolbarTitleDirective, decorators: [{
52
- type: Directive,
53
- args: [{ selector: '[kirbyPageToolbarTitle]' }]
54
- }] });
55
- class PageActionsDirective {
56
- constructor(template) {
57
- this.template = template;
58
- this.stickyDefault = true;
59
- this.fixedDefault = false;
60
- console.warn('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.');
61
- }
62
- get isSticky() {
63
- return this.config ? this.config.sticky : this.stickyDefault;
64
- }
65
- get isFixed() {
66
- return this.config ? this.config.fixed : this.fixedDefault;
67
- }
68
- /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.23", ngImport: i0, type: PageActionsDirective, deps: [{ token: i0.TemplateRef }], target: i0.ɵɵFactoryTarget.Directive }); }
69
- /** @nocollapse */ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.23", type: PageActionsDirective, isStandalone: true, selector: "[kirbyPageActions]", inputs: { config: ["kirbyPageActions", "config"] }, ngImport: i0 }); }
70
- }
71
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.23", ngImport: i0, type: PageActionsDirective, decorators: [{
72
- type: Directive,
73
- args: [{ selector: '[kirbyPageActions]' }]
74
- }], ctorParameters: () => [{ type: i0.TemplateRef }], propDecorators: { config: [{
75
- type: Input,
76
- args: ['kirbyPageActions']
77
- }] } });
78
- class PageContentDirective {
79
- constructor(template) {
80
- this.template = template;
81
- }
82
- get isFixed() {
83
- return this.config && this.config.fixed;
84
- }
85
- /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.23", ngImport: i0, type: PageContentDirective, deps: [{ token: i0.TemplateRef }], target: i0.ɵɵFactoryTarget.Directive }); }
86
- /** @nocollapse */ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.23", type: PageContentDirective, isStandalone: true, selector: "[kirbyPageContent]", inputs: { config: ["kirbyPageContent", "config"] }, ngImport: i0 }); }
87
- }
88
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.23", ngImport: i0, type: PageContentDirective, decorators: [{
89
- type: Directive,
90
- args: [{ selector: '[kirbyPageContent]' }]
91
- }], ctorParameters: () => [{ type: i0.TemplateRef }], propDecorators: { config: [{
92
- type: Input,
93
- args: ['kirbyPageContent']
94
- }] } });
95
- class PageStickyContentDirective {
96
- /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.23", ngImport: i0, type: PageStickyContentDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
97
- /** @nocollapse */ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.23", type: PageStickyContentDirective, isStandalone: true, selector: "[kirbyPageStickyContent]", ngImport: i0 }); }
98
- }
99
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.23", ngImport: i0, type: PageStickyContentDirective, decorators: [{
100
- type: Directive,
101
- args: [{ selector: '[kirbyPageStickyContent]' }]
102
- }] });
103
- class PageProgressComponent extends ModalElementComponent {
104
- constructor(modalElementsAdvertiser, elementRef) {
105
- super(ModalElementType.PAGE_PROGRESS, elementRef, modalElementsAdvertiser);
106
- // TODO: Find alternative implementation, which aligns with future page configuration / consumption
107
- // This implementation was chosen over expanding `moveChild` method in component wrapper with yet another scenario
108
- this.slot = 'start';
109
- }
110
- /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.23", ngImport: i0, type: PageProgressComponent, deps: [{ token: i1.ModalElementsAdvertiser, optional: true }, { token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Component }); }
111
- /** @nocollapse */ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.2.23", type: PageProgressComponent, isStandalone: true, selector: "kirby-page-progress", host: { properties: { "attr.slot": "this.slot" } }, usesInheritance: true, ngImport: i0, template: `
26
+ const PAGE_BACK_BUTTON_OVERRIDE = new InjectionToken("page-back-button-override");
27
+ var PageTitleDirective = class PageTitleDirective {
28
+ static {
29
+ this.ɵfac = i0.ɵɵngDeclareFactory({
30
+ minVersion: "12.0.0",
31
+ version: "22.2.2",
32
+ ngImport: i0,
33
+ type: PageTitleDirective,
34
+ deps: [],
35
+ target: i0.ɵɵFactoryTarget.Directive
36
+ });
37
+ }
38
+ static {
39
+ this.ɵdir = i0.ɵɵngDeclareDirective({
40
+ minVersion: "14.0.0",
41
+ version: "22.2.2",
42
+ type: PageTitleDirective,
43
+ isStandalone: true,
44
+ selector: "[kirbyPageTitle]",
45
+ ngImport: i0
46
+ });
47
+ }
48
+ };
49
+ i0.ɵɵngDeclareClassMetadata({
50
+ minVersion: "12.0.0",
51
+ version: "22.2.2",
52
+ ngImport: i0,
53
+ type: PageTitleDirective,
54
+ decorators: [{
55
+ type: Directive,
56
+ args: [{ selector: "[kirbyPageTitle]" }]
57
+ }]
58
+ });
59
+ var PageSubtitleDirective = class PageSubtitleDirective {
60
+ static {
61
+ this.ɵfac = i0.ɵɵngDeclareFactory({
62
+ minVersion: "12.0.0",
63
+ version: "22.2.2",
64
+ ngImport: i0,
65
+ type: PageSubtitleDirective,
66
+ deps: [],
67
+ target: i0.ɵɵFactoryTarget.Directive
68
+ });
69
+ }
70
+ static {
71
+ this.ɵdir = i0.ɵɵngDeclareDirective({
72
+ minVersion: "14.0.0",
73
+ version: "22.2.2",
74
+ type: PageSubtitleDirective,
75
+ isStandalone: true,
76
+ selector: "[kirbyPageSubtitle]",
77
+ ngImport: i0
78
+ });
79
+ }
80
+ };
81
+ i0.ɵɵngDeclareClassMetadata({
82
+ minVersion: "12.0.0",
83
+ version: "22.2.2",
84
+ ngImport: i0,
85
+ type: PageSubtitleDirective,
86
+ decorators: [{
87
+ type: Directive,
88
+ args: [{ selector: "[kirbyPageSubtitle]" }]
89
+ }]
90
+ });
91
+ var PageToolbarTitleDirective = class PageToolbarTitleDirective {
92
+ static {
93
+ this.ɵfac = i0.ɵɵngDeclareFactory({
94
+ minVersion: "12.0.0",
95
+ version: "22.2.2",
96
+ ngImport: i0,
97
+ type: PageToolbarTitleDirective,
98
+ deps: [],
99
+ target: i0.ɵɵFactoryTarget.Directive
100
+ });
101
+ }
102
+ static {
103
+ this.ɵdir = i0.ɵɵngDeclareDirective({
104
+ minVersion: "14.0.0",
105
+ version: "22.2.2",
106
+ type: PageToolbarTitleDirective,
107
+ isStandalone: true,
108
+ selector: "[kirbyPageToolbarTitle]",
109
+ ngImport: i0
110
+ });
111
+ }
112
+ };
113
+ i0.ɵɵngDeclareClassMetadata({
114
+ minVersion: "12.0.0",
115
+ version: "22.2.2",
116
+ ngImport: i0,
117
+ type: PageToolbarTitleDirective,
118
+ decorators: [{
119
+ type: Directive,
120
+ args: [{ selector: "[kirbyPageToolbarTitle]" }]
121
+ }]
122
+ });
123
+ var PageActionsDirective = class PageActionsDirective {
124
+ constructor(template) {
125
+ this.template = template;
126
+ this.stickyDefault = true;
127
+ this.fixedDefault = false;
128
+ console.warn("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.");
129
+ }
130
+ get isSticky() {
131
+ return this.config ? this.config.sticky : this.stickyDefault;
132
+ }
133
+ get isFixed() {
134
+ return this.config ? this.config.fixed : this.fixedDefault;
135
+ }
136
+ static {
137
+ this.ɵfac = i0.ɵɵngDeclareFactory({
138
+ minVersion: "12.0.0",
139
+ version: "22.2.2",
140
+ ngImport: i0,
141
+ type: PageActionsDirective,
142
+ deps: [{ token: i0.TemplateRef }],
143
+ target: i0.ɵɵFactoryTarget.Directive
144
+ });
145
+ }
146
+ static {
147
+ this.ɵdir = i0.ɵɵngDeclareDirective({
148
+ minVersion: "14.0.0",
149
+ version: "22.2.2",
150
+ type: PageActionsDirective,
151
+ isStandalone: true,
152
+ selector: "[kirbyPageActions]",
153
+ inputs: { config: ["kirbyPageActions", "config"] },
154
+ ngImport: i0
155
+ });
156
+ }
157
+ };
158
+ i0.ɵɵngDeclareClassMetadata({
159
+ minVersion: "12.0.0",
160
+ version: "22.2.2",
161
+ ngImport: i0,
162
+ type: PageActionsDirective,
163
+ decorators: [{
164
+ type: Directive,
165
+ args: [{ selector: "[kirbyPageActions]" }]
166
+ }],
167
+ ctorParameters: () => [{ type: i0.TemplateRef }],
168
+ propDecorators: { config: [{
169
+ type: Input,
170
+ args: ["kirbyPageActions"]
171
+ }] }
172
+ });
173
+ var PageContentDirective = class PageContentDirective {
174
+ constructor(template) {
175
+ this.template = template;
176
+ }
177
+ get isFixed() {
178
+ return this.config && this.config.fixed;
179
+ }
180
+ static {
181
+ this.ɵfac = i0.ɵɵngDeclareFactory({
182
+ minVersion: "12.0.0",
183
+ version: "22.2.2",
184
+ ngImport: i0,
185
+ type: PageContentDirective,
186
+ deps: [{ token: i0.TemplateRef }],
187
+ target: i0.ɵɵFactoryTarget.Directive
188
+ });
189
+ }
190
+ static {
191
+ this.ɵdir = i0.ɵɵngDeclareDirective({
192
+ minVersion: "14.0.0",
193
+ version: "22.2.2",
194
+ type: PageContentDirective,
195
+ isStandalone: true,
196
+ selector: "[kirbyPageContent]",
197
+ inputs: { config: ["kirbyPageContent", "config"] },
198
+ ngImport: i0
199
+ });
200
+ }
201
+ };
202
+ i0.ɵɵngDeclareClassMetadata({
203
+ minVersion: "12.0.0",
204
+ version: "22.2.2",
205
+ ngImport: i0,
206
+ type: PageContentDirective,
207
+ decorators: [{
208
+ type: Directive,
209
+ args: [{ selector: "[kirbyPageContent]" }]
210
+ }],
211
+ ctorParameters: () => [{ type: i0.TemplateRef }],
212
+ propDecorators: { config: [{
213
+ type: Input,
214
+ args: ["kirbyPageContent"]
215
+ }] }
216
+ });
217
+ var PageStickyContentDirective = class PageStickyContentDirective {
218
+ static {
219
+ this.ɵfac = i0.ɵɵngDeclareFactory({
220
+ minVersion: "12.0.0",
221
+ version: "22.2.2",
222
+ ngImport: i0,
223
+ type: PageStickyContentDirective,
224
+ deps: [],
225
+ target: i0.ɵɵFactoryTarget.Directive
226
+ });
227
+ }
228
+ static {
229
+ this.ɵdir = i0.ɵɵngDeclareDirective({
230
+ minVersion: "14.0.0",
231
+ version: "22.2.2",
232
+ type: PageStickyContentDirective,
233
+ isStandalone: true,
234
+ selector: "[kirbyPageStickyContent]",
235
+ ngImport: i0
236
+ });
237
+ }
238
+ };
239
+ i0.ɵɵngDeclareClassMetadata({
240
+ minVersion: "12.0.0",
241
+ version: "22.2.2",
242
+ ngImport: i0,
243
+ type: PageStickyContentDirective,
244
+ decorators: [{
245
+ type: Directive,
246
+ args: [{ selector: "[kirbyPageStickyContent]" }]
247
+ }]
248
+ });
249
+ var PageProgressComponent = class PageProgressComponent extends ModalElementComponent {
250
+ constructor(modalElementsAdvertiser, elementRef) {
251
+ super(ModalElementType.PAGE_PROGRESS, elementRef, modalElementsAdvertiser);
252
+ this.slot = "start";
253
+ }
254
+ static {
255
+ this.ɵfac = i0.ɵɵngDeclareFactory({
256
+ minVersion: "12.0.0",
257
+ version: "22.2.2",
258
+ ngImport: i0,
259
+ type: PageProgressComponent,
260
+ deps: [{
261
+ token: i1.ModalElementsAdvertiser,
262
+ optional: true
263
+ }, { token: i0.ElementRef }],
264
+ target: i0.ɵɵFactoryTarget.Component
265
+ });
266
+ }
267
+ static {
268
+ this.ɵcmp = i0.ɵɵngDeclareComponent({
269
+ minVersion: "14.0.0",
270
+ version: "22.2.2",
271
+ type: PageProgressComponent,
272
+ isStandalone: true,
273
+ selector: "kirby-page-progress",
274
+ host: { properties: { "attr.slot": "this.slot" } },
275
+ usesInheritance: true,
276
+ ngImport: i0,
277
+ template: `
112
278
  <ng-content></ng-content>
113
- `, isInline: true, styles: [":host{display:flex;margin-inline-end:4px}\n"] }); }
114
- }
115
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.23", ngImport: i0, type: PageProgressComponent, decorators: [{
116
- type: Component,
117
- args: [{ selector: 'kirby-page-progress', template: `
279
+ `,
280
+ isInline: true,
281
+ styles: [":host{display:flex;margin-inline-end:4px}\n"],
282
+ changeDetection: i0.ChangeDetectionStrategy.Eager
283
+ });
284
+ }
285
+ };
286
+ i0.ɵɵngDeclareClassMetadata({
287
+ minVersion: "12.0.0",
288
+ version: "22.2.2",
289
+ ngImport: i0,
290
+ type: PageProgressComponent,
291
+ decorators: [{
292
+ type: Component,
293
+ args: [{
294
+ selector: "kirby-page-progress",
295
+ template: `
118
296
  <ng-content></ng-content>
119
- `, styles: [":host{display:flex;margin-inline-end:4px}\n"] }]
120
- }], ctorParameters: () => [{ type: i1.ModalElementsAdvertiser, decorators: [{
121
- type: Optional
122
- }] }, { type: i0.ElementRef }], propDecorators: { slot: [{
123
- type: HostBinding,
124
- args: ['attr.slot']
125
- }] } });
126
- class PageTitleComponent extends ModalElementComponent {
127
- constructor(elementRef, modalElementsAdvertiser) {
128
- super(ModalElementType.TITLE, elementRef, modalElementsAdvertiser);
129
- }
130
- /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.23", ngImport: i0, type: PageTitleComponent, deps: [{ token: i0.ElementRef }, { token: i1.ModalElementsAdvertiser, optional: true }], target: i0.ɵɵFactoryTarget.Component }); }
131
- /** @nocollapse */ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.2.23", type: PageTitleComponent, isStandalone: true, selector: "kirby-page-title", usesInheritance: true, ngImport: i0, template: `
297
+ `,
298
+ changeDetection: ChangeDetectionStrategy.Eager,
299
+ styles: [":host{display:flex;margin-inline-end:4px}\n"]
300
+ }]
301
+ }],
302
+ ctorParameters: () => [{
303
+ type: i1.ModalElementsAdvertiser,
304
+ decorators: [{ type: Optional }]
305
+ }, { type: i0.ElementRef }],
306
+ propDecorators: { slot: [{
307
+ type: HostBinding,
308
+ args: ["attr.slot"]
309
+ }] }
310
+ });
311
+ var PageTitleComponent = class PageTitleComponent extends ModalElementComponent {
312
+ constructor(elementRef, modalElementsAdvertiser) {
313
+ super(ModalElementType.TITLE, elementRef, modalElementsAdvertiser);
314
+ }
315
+ static {
316
+ this.ɵfac = i0.ɵɵngDeclareFactory({
317
+ minVersion: "12.0.0",
318
+ version: "22.2.2",
319
+ ngImport: i0,
320
+ type: PageTitleComponent,
321
+ deps: [{ token: i0.ElementRef }, {
322
+ token: i1.ModalElementsAdvertiser,
323
+ optional: true
324
+ }],
325
+ target: i0.ɵɵFactoryTarget.Component
326
+ });
327
+ }
328
+ static {
329
+ this.ɵcmp = i0.ɵɵngDeclareComponent({
330
+ minVersion: "14.0.0",
331
+ version: "22.2.2",
332
+ type: PageTitleComponent,
333
+ isStandalone: true,
334
+ selector: "kirby-page-title",
335
+ usesInheritance: true,
336
+ ngImport: i0,
337
+ template: `
132
338
  <ng-content></ng-content>
133
- `, isInline: true }); }
134
- }
135
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.23", ngImport: i0, type: PageTitleComponent, decorators: [{
136
- type: Component,
137
- args: [{
138
- selector: 'kirby-page-title',
139
- template: `
339
+ `,
340
+ isInline: true,
341
+ changeDetection: i0.ChangeDetectionStrategy.Eager
342
+ });
343
+ }
344
+ };
345
+ i0.ɵɵngDeclareClassMetadata({
346
+ minVersion: "12.0.0",
347
+ version: "22.2.2",
348
+ ngImport: i0,
349
+ type: PageTitleComponent,
350
+ decorators: [{
351
+ type: Component,
352
+ args: [{
353
+ selector: "kirby-page-title",
354
+ template: `
140
355
  <ng-content></ng-content>
141
356
  `,
142
- }]
143
- }], ctorParameters: () => [{ type: i0.ElementRef }, { type: i1.ModalElementsAdvertiser, decorators: [{
144
- type: Optional
145
- }] }] });
146
- class PageContentComponent {
147
- /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.23", ngImport: i0, type: PageContentComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
148
- /** @nocollapse */ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.2.23", type: PageContentComponent, isStandalone: true, selector: "kirby-page-content", ngImport: i0, template: `
357
+ changeDetection: ChangeDetectionStrategy.Eager
358
+ }]
359
+ }],
360
+ ctorParameters: () => [{ type: i0.ElementRef }, {
361
+ type: i1.ModalElementsAdvertiser,
362
+ decorators: [{ type: Optional }]
363
+ }]
364
+ });
365
+ var PageContentComponent = class PageContentComponent {
366
+ static {
367
+ this.ɵfac = i0.ɵɵngDeclareFactory({
368
+ minVersion: "12.0.0",
369
+ version: "22.2.2",
370
+ ngImport: i0,
371
+ type: PageContentComponent,
372
+ deps: [],
373
+ target: i0.ɵɵFactoryTarget.Component
374
+ });
375
+ }
376
+ static {
377
+ this.ɵcmp = i0.ɵɵngDeclareComponent({
378
+ minVersion: "14.0.0",
379
+ version: "22.2.2",
380
+ type: PageContentComponent,
381
+ isStandalone: true,
382
+ selector: "kirby-page-content",
383
+ ngImport: i0,
384
+ template: `
149
385
  <ng-content></ng-content>
150
- `, isInline: true }); }
151
- }
152
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.23", ngImport: i0, type: PageContentComponent, decorators: [{
153
- type: Component,
154
- args: [{
155
- selector: 'kirby-page-content',
156
- template: `
386
+ `,
387
+ isInline: true,
388
+ changeDetection: i0.ChangeDetectionStrategy.Eager
389
+ });
390
+ }
391
+ };
392
+ i0.ɵɵngDeclareClassMetadata({
393
+ minVersion: "12.0.0",
394
+ version: "22.2.2",
395
+ ngImport: i0,
396
+ type: PageContentComponent,
397
+ decorators: [{
398
+ type: Component,
399
+ args: [{
400
+ selector: "kirby-page-content",
401
+ template: `
157
402
  <ng-content></ng-content>
158
403
  `,
159
- }]
160
- }] });
161
- class PageActionsComponent {
162
- /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.23", ngImport: i0, type: PageActionsComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
163
- /** @nocollapse */ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.2.23", type: PageActionsComponent, isStandalone: true, selector: "kirby-page-actions", ngImport: i0, template: `
404
+ changeDetection: ChangeDetectionStrategy.Eager
405
+ }]
406
+ }]
407
+ });
408
+ var PageActionsComponent = class PageActionsComponent {
409
+ static {
410
+ this.ɵfac = i0.ɵɵngDeclareFactory({
411
+ minVersion: "12.0.0",
412
+ version: "22.2.2",
413
+ ngImport: i0,
414
+ type: PageActionsComponent,
415
+ deps: [],
416
+ target: i0.ɵɵFactoryTarget.Component
417
+ });
418
+ }
419
+ static {
420
+ this.ɵcmp = i0.ɵɵngDeclareComponent({
421
+ minVersion: "14.0.0",
422
+ version: "22.2.2",
423
+ type: PageActionsComponent,
424
+ isStandalone: true,
425
+ selector: "kirby-page-actions",
426
+ ngImport: i0,
427
+ template: `
164
428
  <ng-content select="button[kirby-button]"></ng-content>
165
- `, isInline: true, styles: [":host{display:inline-flex;column-gap:8px}\n"] }); }
166
- }
167
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.23", ngImport: i0, type: PageActionsComponent, decorators: [{
168
- type: Component,
169
- args: [{ selector: 'kirby-page-actions', template: `
429
+ `,
430
+ isInline: true,
431
+ styles: [":host{display:inline-flex;column-gap:8px}\n"],
432
+ changeDetection: i0.ChangeDetectionStrategy.Eager
433
+ });
434
+ }
435
+ };
436
+ i0.ɵɵngDeclareClassMetadata({
437
+ minVersion: "12.0.0",
438
+ version: "22.2.2",
439
+ ngImport: i0,
440
+ type: PageActionsComponent,
441
+ decorators: [{
442
+ type: Component,
443
+ args: [{
444
+ selector: "kirby-page-actions",
445
+ template: `
170
446
  <ng-content select="button[kirby-button]"></ng-content>
171
- `, styles: [":host{display:inline-flex;column-gap:8px}\n"] }]
172
- }] });
173
- class PageComponent {
174
- set maxWidth(width) {
175
- this._maxWidth = width;
176
- }
177
- get maxWidth() {
178
- return this._maxWidth;
179
- }
180
- get tabBarBottomHidden() {
181
- return this._tabBarBottomHidden;
182
- }
183
- set tabBarBottomHidden(value) {
184
- if (this.tabsComponent) {
185
- // as we are setting a class on tabs, we need this to happen in a separate cd cycle
186
- setTimeout(() => {
187
- this.tabsComponent.tabBarBottomHidden = value;
188
- this.changeDetectorRef.markForCheck();
189
- });
190
- }
191
- this._tabBarBottomHidden = value;
192
- }
193
- constructor(elementRef, injector, renderer, router, changeDetectorRef, zone, modalNavigationService, resizeObserverService, tabsComponent, backButtonOverride, routerOutlet, navCtrl, ionicElementPartHelper, translations, htmlDocTitle) {
194
- this.elementRef = elementRef;
195
- this.injector = injector;
196
- this.renderer = renderer;
197
- this.router = router;
198
- this.changeDetectorRef = changeDetectorRef;
199
- this.zone = zone;
200
- this.modalNavigationService = modalNavigationService;
201
- this.resizeObserverService = resizeObserverService;
202
- this.tabsComponent = tabsComponent;
203
- this.backButtonOverride = backButtonOverride;
204
- this.routerOutlet = routerOutlet;
205
- this.navCtrl = navCtrl;
206
- this.ionicElementPartHelper = ionicElementPartHelper;
207
- this.translations = translations;
208
- this.htmlDocTitle = htmlDocTitle;
209
- this.titleAlignment = 'left';
210
- this._maxWidth = 'default';
211
- this.enter = new EventEmitter();
212
- this.leave = new EventEmitter();
213
- this.refresh = new EventEmitter();
214
- this.backButtonClick = new EventEmitter();
215
- this.toolbarTitleClick = new EventEmitter();
216
- this.isStickyContentPinned = false;
217
- this.isObservingTitle = false;
218
- this.isObservingActions = false;
219
- this.isDocTitleSet = false;
220
- this.observedToolbarButtons = new Set();
221
- this.ngOnDestroy$ = new Subject();
222
- this.navigationStart$ = this.router.events.pipe(filter((event) => event instanceof NavigationStart), takeUntil(this.ngOnDestroy$));
223
- this.navigationEnd$ = this.router.events.pipe(filter((event) => event instanceof NavigationEnd), takeUntil(this.ngOnDestroy$));
224
- }
225
- whenContentReady() {
226
- if (!this.contentReadyPromise) {
227
- this.contentReadyPromise = new Promise((resolve) => {
228
- this.resizeObserverService.observe(this.ionContentElement, (entry) => {
229
- if (entry.contentRect.height > 0) {
230
- this.resizeObserverService.unobserve(this.ionContentElement);
231
- resolve();
232
- }
233
- });
234
- });
235
- }
236
- return this.contentReadyPromise;
237
- }
238
- ngOnInit() {
239
- this.removeWrapper();
240
- this.ionicElementPartHelper.setPart('background', this.ionToolbarElement, '.toolbar-background');
241
- const actionGroupConfig = {
242
- isCondensed: true,
243
- maxVisibleActions: 1,
244
- };
245
- this.toolbarActionGroupInjector = Injector.create({
246
- providers: [
247
- {
248
- provide: ACTIONGROUP_CONFIG,
249
- useValue: actionGroupConfig,
250
- },
251
- ],
252
- parent: this.injector,
253
- });
254
- }
255
- ngOnChanges(changes) {
256
- if (changes.titleMaxLines) {
257
- this.fitHeadingConfig = {
258
- maxLines: changes.titleMaxLines.currentValue,
259
- };
260
- }
261
- if (changes.subtitle && !changes.subtitle.isFirstChange) {
262
- this.subtitle = changes.title.currentValue;
263
- this.hasPageSubtitle = this.subtitle !== undefined;
264
- }
265
- if (changes.title || changes.toolbarTitle) {
266
- this.setHTMLDocumentTitle(this.title || this.toolbarTitle);
267
- }
268
- }
269
- ngAfterViewInit() {
270
- this.zone.runOutsideAngular(() => {
271
- this.contentScrolled$ = fromEvent(this.ionContentElement.nativeElement, 'ionScroll').pipe(debounceTime(contentScrollDebounceTimeInMS), map((event) => event.detail), takeUntil(this.ngOnDestroy$));
272
- this.contentScrolled$.subscribe((scrollInfo) => {
273
- if (scrollInfo.scrollTop > contentScrolledOffsetInPixels !== this.isContentScrolled) {
274
- this.isContentScrolled = !this.isContentScrolled;
275
- this.changeDetectorRef.detectChanges();
276
- }
277
- });
278
- });
279
- // This instance has observed a page enter so register the correct url for this instance
280
- this.url = this.router.url;
281
- this.onEnter();
282
- // Watch navigation events for page enter and leave
283
- this.navigationStart$.subscribe((event) => {
284
- if (this.getPathname(event.url) !== this.getPathname(this.url) &&
285
- !this.modalNavigationService.isModalRoute(this.url) &&
286
- !this.modalNavigationService.isModalRoute(event.url)) {
287
- this.onLeave();
288
- }
289
- });
290
- this.navigationEnd$.subscribe((event) => {
291
- if (this.getPathname(event.urlAfterRedirects) === this.getPathname(this.url)) {
292
- this.onEnter();
293
- }
294
- });
295
- this.interceptBackButtonClicksSetup();
296
- this.initializeStickyIntersectionObserver();
297
- this.observeToolbarButtons();
298
- this.ionToolbarButtonsElement.changes.pipe(takeUntil(this.ngOnDestroy$)).subscribe(() => {
299
- this.observeToolbarButtons();
300
- this.setActionButtonsWidth();
301
- });
302
- this.setActionButtonsWidth();
303
- }
304
- ngAfterContentChecked() {
305
- this.initializeHeader();
306
- this.initializeTitle();
307
- this.initializeActions();
308
- this.initializeContent();
309
- this.initializeStickyContent();
310
- this.changeDetectorRef.detectChanges();
311
- }
312
- ngOnDestroy() {
313
- this.ngOnDestroy$.next();
314
- this.ngOnDestroy$.complete();
315
- this.titleIntersectionObserver?.disconnect();
316
- this.stickyActionsIntersectionObserver?.disconnect();
317
- this.stickyContentIntersectionObserver?.disconnect();
318
- this.unobserveTitleMutation?.();
319
- this.unobserveToolbarButtons();
320
- }
321
- delegateRefreshEvent(event) {
322
- this.refresh.emit({
323
- complete: event.target.complete.bind(event.target),
324
- });
325
- }
326
- getMaxWidthClasses() {
327
- if (!this.maxWidth) {
328
- return '';
329
- }
330
- if (this.maxWidth === 'default') {
331
- return '';
332
- }
333
- return `max-width-${this.maxWidth}`;
334
- }
335
- onTitleClick(event) {
336
- if (this.toolbarTitleClick.observed) {
337
- this.toolbarTitleClick.emit(event);
338
- }
339
- else {
340
- this.header?.titleClick.emit(event);
341
- }
342
- }
343
- removeWrapper() {
344
- const parent = this.elementRef.nativeElement.parentNode;
345
- this.renderer.removeChild(parent, this.elementRef.nativeElement);
346
- this.renderer.appendChild(parent, this.ionHeaderElement.nativeElement);
347
- this.renderer.appendChild(parent, this.ionContentElement.nativeElement);
348
- this.renderer.appendChild(parent, this.ionFooterElement.nativeElement);
349
- }
350
- onEnter() {
351
- if (this.isActive)
352
- return;
353
- this.isActive = true;
354
- this.enter.emit();
355
- this.patchIonLastFocused();
356
- this.observeTitle();
357
- this.observeActions();
358
- this.setHTMLDocumentTitle(this.header?.title || this.title || this.toolbarTitle);
359
- this.observeTitleDOMChanges();
360
- }
361
- onLeave() {
362
- if (!this.isActive)
363
- return;
364
- this.isActive = false;
365
- this.leave.emit();
366
- this.unobserveTitle();
367
- this.unobserveActions();
368
- this.unobserveTitleMutation?.();
369
- if (this.tabBarBottomHidden && this.tabsComponent) {
370
- this.tabsComponent.tabBarBottomHidden = false;
371
- }
372
- }
373
- interceptBackButtonClicksSetup() {
374
- if (this.backButtonOverride) {
375
- this.backButton.onClick = (event) => {
376
- event.preventDefault();
377
- this.backButtonOverride.navigateBack(this.routerOutlet, this.navCtrl, this.defaultBackHref);
378
- };
379
- }
380
- // Intercept back-button click events, defaulting to the built-in click-handler.
381
- if (this.backButtonClick.observers.length === 0) {
382
- this.backButtonClick
383
- .pipe(takeUntil(this.ngOnDestroy$))
384
- .subscribe(this.backButton.onClick.bind(this.backButton));
385
- }
386
- this.backButton.onClick = (event) => {
387
- this.backButtonClick.emit(event);
388
- };
389
- }
390
- patchIonLastFocused() {
391
- const ionLastFocus = this.ionContentElement.nativeElement.querySelector('[ion-last-focus="true"]');
392
- // When a focusManagerPriority is set, Ionic handles moving focus back to the element that presented the current view.
393
- // Unfortunately, we need to schedule a removal of tabindex="-1" from ionLastFocus element after Ionic might have set it
394
- // to work around elements becoming inaccessible after navigating back: https://github.com/ionic-team/ionic-framework/issues/29875
395
- setTimeout(() => {
396
- if (ionLastFocus?.getAttribute('tabindex') !== '-1')
397
- return;
398
- this.renderer.removeAttribute(ionLastFocus, 'tabindex');
399
- });
400
- }
401
- initializeStickyIntersectionObserver() {
402
- if (this.stickyContentTemplate) {
403
- // Sticky content present - start observing for stickiness
404
- if (!this.stickyContentIntersectionObserver) {
405
- this.stickyContentIntersectionObserver = this.createStickyContentIntersectionObserver();
406
- }
407
- setTimeout(() => {
408
- this.stickyContentIntersectionObserver.observe(this.stickyContentContainer.nativeElement);
409
- });
410
- }
411
- }
412
- initializeHeader() {
413
- if (this.hasHeader === undefined && !!this.header) {
414
- this.hasHeader = true;
415
- // Header could later be removed from DOM (e.g. in virtual scrolling scenarios),
416
- // so store a reference to `header.titleActionIconTemplate` and `header.titleClick`:
417
- this.titleActionIconTemplate = this.header.titleActionIconTemplate;
418
- if (this.header.titleClick.observed && this.hasInteractiveTitle === undefined) {
419
- this.hasInteractiveTitle = true;
420
- }
421
- // Set document title from header immediately if present, then subscribe to changes
422
- this.setHTMLDocumentTitle(this.header.title);
423
- this.header.title$.pipe(takeUntil(this.ngOnDestroy$)).subscribe(() => {
424
- this.setHTMLDocumentTitle(this.header.title);
425
- });
426
- }
427
- }
428
- initializeTitle() {
429
- if (this.hasHeader && this.isObservingTitle && !this.header?.titleElement) {
430
- // If we're already observing the header's title element, but it's no longer present,
431
- // it means it has been removed from DOM (e.g. in virtual scrolling scenarios).
432
- // Flip observing flag:
433
- this.isObservingTitle = false;
434
- }
435
- if (this.hasPageTitle) {
436
- if (!this.isObservingTitle && !!this.header?.titleElement) {
437
- // Header and title element re-attached to DOM - observe title:
438
- this.observeTitle();
439
- }
440
- // Ensures rest of initializeTitle() won't run, if already initialized
441
- return;
442
- }
443
- this.hasPageTitle =
444
- this.title !== undefined || !!this.customTitleTemplate || !!this.header?.title;
445
- this.toolbarTitleVisible = !this.hasPageTitle;
446
- this.hasPageSubtitle = this.subtitle !== undefined || !!this.customSubtitleTemplate;
447
- if (this.header?.title && !this.toolbarTitle) {
448
- this.toolbarTitle = this.header.title;
449
- this.header.title$.pipe(takeUntil(this.ngOnDestroy$)).subscribe((title) => {
450
- this.toolbarTitle = title;
451
- });
452
- }
453
- this.observeTitle();
454
- const defaultTitleTemplate = this.customTitleTemplate || this.simpleTitleTemplate;
455
- /* eslint-disable */
456
- // prettier-ignore
457
- this.toolbarTitleTemplate = this.customToolbarTitleTemplate
458
- ? this.customToolbarTitleTemplate
459
- : typeof this.toolbarTitle === 'string'
460
- ? this.simpleToolbarTitleTemplate
461
- : defaultTitleTemplate;
462
- if (this.toolbarTitleClick.observed && this.hasInteractiveTitle === undefined) {
463
- this.hasInteractiveTitle = true;
464
- }
465
- }
466
- observeTitle() {
467
- if (!this.hasPageTitle) {
468
- // Nothing to observe
469
- return;
470
- }
471
- if (this.isObservingTitle) {
472
- // Already observing
473
- return;
474
- }
475
- // We are not actually observing the title until after the `whenContentReady` promise has resolved,
476
- // but since we've already checked that the page has a title in the guard above,
477
- // we'll - eagerly - set this flag now to prevent unnecessary re-runs of the rest of this method:
478
- this.isObservingTitle = true;
479
- if (!this.titleIntersectionObserver) {
480
- this.titleIntersectionObserver = new IntersectionObserver((entries) => {
481
- // In rare scenarios we get more than 1 entry - use the last one:
482
- const lastEntry = entries[entries.length - 1];
483
- if (lastEntry) {
484
- const showToolbarTitle = !lastEntry.isIntersecting;
485
- // Only flip the flag and run Change Detection when changed:
486
- if (showToolbarTitle !== this.toolbarTitleVisible) {
487
- this.toolbarTitleVisible = showToolbarTitle;
488
- this.changeDetectorRef.detectChanges();
489
- }
490
- }
491
- }, { root: this.ionContentElement.nativeElement });
492
- }
493
- // Run outside Angular to prevent unnecessary triggering change detection
494
- // and - under certain conditions - an infinite loop when called within ngAfterContentChecked:
495
- this.zone.runOutsideAngular(() => {
496
- this.whenContentReady().then(() => {
497
- const titleElementRef = this.pageTitle || this.header?.titleElement;
498
- if (titleElementRef?.nativeElement) {
499
- this.titleIntersectionObserver.observe(titleElementRef.nativeElement);
500
- }
501
- });
502
- });
503
- }
504
- unobserveTitle() {
505
- const titleElementRef = this.pageTitle || this.header?.titleElement;
506
- if (titleElementRef) {
507
- this.titleIntersectionObserver?.unobserve(titleElementRef.nativeElement);
508
- }
509
- this.isObservingTitle = false;
510
- }
511
- observeTitleDOMChanges() {
512
- const globalKirbyConfig = getGlobalConfig();
513
- if (!globalKirbyConfig?.setHtmlDocTitle)
514
- return;
515
- if (this.isDocTitleSet)
516
- return; // we never want to observe if the document title is already set via any title properties (or already observed)
517
- const titleArea = this.ionHeaderElement.nativeElement.querySelector('ion-toolbar ion-title .toolbar-title');
518
- this.setHTMLDocumentTitle(titleArea.textContent);
519
- this.unobserveTitleMutation = observeContent(titleArea, () => {
520
- this.setHTMLDocumentTitle(titleArea.textContent);
521
- });
522
- }
523
- setHTMLDocumentTitle(title) {
524
- const globalKirbyConfig = getGlobalConfig();
525
- if (!globalKirbyConfig?.setHtmlDocTitle || !title || title.trim() === '')
526
- return;
527
- this.htmlDocTitle.setTitle(title);
528
- this.isDocTitleSet = true;
529
- }
530
- initializeActions() {
531
- if (this.headerActionsTemplate === undefined && !!this.header) {
532
- this.headerActionsTemplate = this.header.actionsTemplate;
533
- }
534
- if (this.hasHeader && this.isObservingActions && !this.header?.actionsElement) {
535
- // If we're already observing the header's actions element, but it's no longer present,
536
- // it means it has been removed from DOM (e.g. in virtual scrolling scenarios).
537
- // Flip observing flag:
538
- this.isObservingActions = false;
539
- }
540
- this.observeActions();
541
- this.customActions.forEach((pageAction) => {
542
- if (pageAction.isFixed) {
543
- this.fixedActionsTemplate = pageAction.template;
544
- }
545
- else if (pageAction.isSticky) {
546
- this.stickyActionsTemplate = pageAction.template;
547
- }
548
- else {
549
- this.pageActionsTemplate = pageAction.template;
550
- }
551
- });
552
- }
553
- observeActions() {
554
- if (!this.header?.actionsElement) {
555
- // Nothing to observe
556
- return;
557
- }
558
- if (this.isObservingActions) {
559
- // Already observing
560
- return;
561
- }
562
- // We are not actually observing actions until after the `whenContentReady` promise has resolved,
563
- // but since we've already checked that there's an actions element present in the guard above,
564
- // we'll - eagerly - set this flag now to prevent unnecessary re-runs of the rest of this method:
565
- this.isObservingActions = true;
566
- if (!this.stickyActionsIntersectionObserver) {
567
- this.stickyActionsIntersectionObserver = new IntersectionObserver((entries) => {
568
- // In rare scenarios we get more than 1 entry - use the last one:
569
- const lastEntry = entries[entries.length - 1];
570
- if (lastEntry) {
571
- const showToolbarActions = !lastEntry.isIntersecting;
572
- // Only flip the flag and run Change Detection when changed:
573
- if (showToolbarActions !== this.toolbarActionsVisible) {
574
- this.toolbarActionsVisible = showToolbarActions;
575
- this.changeDetectorRef.detectChanges();
576
- }
577
- }
578
- }, { root: this.ionContentElement.nativeElement });
579
- }
580
- // Run outside Angular to prevent unnecessary triggering change detection
581
- // and - under certain conditions - an infinite loop when called within ngAfterContentChecked:
582
- this.zone.runOutsideAngular(() => {
583
- this.whenContentReady().then(() => {
584
- if (this.header?.actionsElement?.nativeElement) {
585
- this.stickyActionsIntersectionObserver.observe(this.header.actionsElement.nativeElement);
586
- }
587
- });
588
- });
589
- }
590
- unobserveActions() {
591
- if (this.header?.actionsElement) {
592
- this.stickyActionsIntersectionObserver?.unobserve(this.header.actionsElement.nativeElement);
593
- }
594
- this.isObservingActions = false;
595
- }
596
- setActionButtonsWidth() {
597
- if (!this.ionToolbarButtonsElement)
598
- return;
599
- // Ensure ion-toolbar custom element has been defined (primarily when testing, but doesn't hurt):
600
- customElements.whenDefined(this.ionToolbarElement.nativeElement.localName).then(() => {
601
- // Ensure toolbar and buttons have been rendered and has dimensions:
602
- componentOnReady(this.ionToolbarElement.nativeElement, (toolbar) => {
603
- let startButtonsWidth = 0;
604
- let endButtonsWidth = 0;
605
- this.ionToolbarButtonsElement
606
- .map((ionButtonsElementRef) => ionButtonsElementRef.nativeElement)
607
- .forEach((ionButtonsElement) => {
608
- const style = getComputedStyle(ionButtonsElement);
609
- const margin = parseInt(style.marginLeft) + parseInt(style.marginRight);
610
- if (ionButtonsElement.getAttribute('slot') === 'start') {
611
- startButtonsWidth += ionButtonsElement.offsetWidth + margin;
612
- }
613
- else {
614
- endButtonsWidth += ionButtonsElement.offsetWidth + margin;
615
- }
616
- });
617
- const actionButtonsMaxWidth = Math.max(startButtonsWidth, endButtonsWidth);
618
- this.renderer.setStyle(toolbar, '--action-buttons-width', `${actionButtonsMaxWidth}px`, RendererStyleFlags2.DashCase);
619
- });
620
- });
621
- }
622
- observeToolbarButtons() {
623
- this.unobserveToolbarButtons();
624
- this.ionToolbarButtonsElement.forEach(({ nativeElement: ionButtonsElement }) => {
625
- this.observedToolbarButtons.add(ionButtonsElement);
626
- this.resizeObserverService.observe(ionButtonsElement, () => this.setActionButtonsWidth());
627
- });
628
- }
629
- unobserveToolbarButtons() {
630
- this.observedToolbarButtons.forEach((ionButtonsElement) => this.resizeObserverService.unobserve(ionButtonsElement));
631
- this.observedToolbarButtons.clear();
632
- }
633
- initializeContent() {
634
- this.customContent.forEach((content) => {
635
- if (content.isFixed) {
636
- this.fixedContentTemplate = content.template;
637
- }
638
- else {
639
- this.customContentTemplate = content.template;
640
- }
641
- });
642
- }
643
- initializeStickyContent() {
644
- this.stickyContentTemplate = this.stickyContentRef;
645
- }
646
- createStickyContentIntersectionObserver() {
647
- const options = {
648
- root: this.ionContentElement.nativeElement,
649
- threshold: 1,
650
- };
651
- const callback = (entries) => {
652
- if (this.isStickyContentPinned !== !entries[0].isIntersecting) {
653
- this.isStickyContentPinned = !this.isStickyContentPinned;
654
- this.changeDetectorRef.detectChanges();
655
- }
656
- };
657
- return new IntersectionObserver(callback, options);
658
- }
659
- getPathname(url) {
660
- return url.split('?')[0];
661
- }
662
- _onKeyboardWillShow(info) {
663
- if (info && info.keyboardHeight) {
664
- this.ionContentElement.nativeElement.style.setProperty('--keyboard-offset', `${info.keyboardHeight}px`);
665
- }
666
- }
667
- _onKeyboardWillHide() {
668
- this.ionContentElement.nativeElement.style.setProperty('--keyboard-offset', '0px');
669
- }
670
- _onSelectedTabClick() {
671
- if (this.content) {
672
- this.content.scrollToTop(KirbyAnimation.Duration.LONG);
673
- }
674
- }
675
- /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.23", ngImport: i0, type: PageComponent, deps: [{ token: i0.ElementRef }, { token: i0.Injector }, { token: i0.Renderer2 }, { token: i2.Router }, { token: i0.ChangeDetectorRef }, { token: i0.NgZone }, { token: i1.ModalNavigationService }, { token: i3.ResizeObserverService }, { token: i4.TabsComponent, optional: true, skipSelf: true }, { token: PAGE_BACK_BUTTON_OVERRIDE, optional: true }, { token: i5.IonRouterOutlet, optional: true }, { token: i5.NavController, optional: true }, { token: i6.IonicElementPartHelper }, { token: i3.TranslationService }, { token: i7.Title }], target: i0.ɵɵFactoryTarget.Component }); }
676
- /** @nocollapse */ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.23", type: PageComponent, isStandalone: true, selector: "kirby-page", inputs: { title: "title", subtitle: "subtitle", toolbarTitle: "toolbarTitle", titleAlignment: "titleAlignment", defaultBackHref: "defaultBackHref", hideBackButton: "hideBackButton", titleMaxLines: "titleMaxLines", hasInteractiveTitle: "hasInteractiveTitle", maxWidth: "maxWidth", tabBarBottomHidden: "tabBarBottomHidden" }, outputs: { enter: "enter", leave: "leave", refresh: "refresh", backButtonClick: "backButtonClick", toolbarTitleClick: "toolbarTitleClick" }, host: { listeners: { "window:keyboardWillShow": "_onKeyboardWillShow($event)", "window:keyboardWillHide": "_onKeyboardWillHide()", "window:kirbySelectedTabClick": "_onSelectedTabClick()" } }, providers: [IonicElementPartHelper], queries: [{ propertyName: "customToolbarTitleTemplate", first: true, predicate: PageToolbarTitleDirective, descendants: true, read: TemplateRef }, { propertyName: "customTitleTemplate", first: true, predicate: PageTitleDirective, descendants: true, read: TemplateRef }, { propertyName: "customSubtitleTemplate", first: true, predicate: PageSubtitleDirective, descendants: true, read: TemplateRef }, { propertyName: "stickyContentRef", first: true, predicate: PageStickyContentDirective, descendants: true, read: TemplateRef }, { propertyName: "header", first: true, predicate: HeaderComponent, descendants: true }, { propertyName: "customActions", predicate: PageActionsDirective }, { propertyName: "customContent", predicate: PageContentDirective }], viewQueries: [{ propertyName: "content", first: true, predicate: IonContent, descendants: true, static: true }, { propertyName: "ionContentElement", first: true, predicate: IonContent, descendants: true, read: ElementRef, static: true }, { propertyName: "ionHeaderElement", first: true, predicate: IonHeader, descendants: true, read: ElementRef, static: true }, { propertyName: "ionFooterElement", first: true, predicate: IonFooter, descendants: true, read: ElementRef, static: true }, { propertyName: "ionToolbarElement", first: true, predicate: IonToolbar, descendants: true, read: ElementRef, static: true }, { propertyName: "backButton", first: true, predicate: IonBackButton, descendants: true }, { propertyName: "pageTitle", first: true, predicate: ["pageTitle"], descendants: true, read: ElementRef }, { propertyName: "stickyContentContainer", first: true, predicate: ["stickyContentContainer"], descendants: true, read: ElementRef }, { propertyName: "simpleTitleTemplate", first: true, predicate: ["simpleTitleTemplate"], descendants: true, read: TemplateRef, static: true }, { propertyName: "simpleToolbarTitleTemplate", first: true, predicate: ["simpleToolbarTitleTemplate"], descendants: true, read: TemplateRef, static: true }, { propertyName: "ionToolbarButtonsElement", predicate: IonButtons, descendants: true, read: ElementRef }], usesOnChanges: true, ngImport: i0, template: "<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", styles: [".kirby-line-clamp{display:-webkit-box;-webkit-line-clamp:var(--line-clamp, none);-webkit-box-orient:vertical;overflow:hidden}ion-header,ion-toolbar{box-sizing:border-box;--background: var(--kirby-background-color)}ion-title h1{font-size:min(var(--kirby-font-size-m),21.6px)}ion-toolbar{--border-width: 0 !important;--padding-start: var(--kirby-spacing-s);--padding-end: var(--kirby-spacing-s);--padding-top: 0;--padding-bottom: 0;--ion-toolbar-color: var(--kirby-black);--min-height: var(--kirby-spacing-xxxl)}@media(min-width:768px){ion-toolbar{--padding-start: var(--kirby-spacing-m);--padding-end: var(--kirby-spacing-m);--min-height: var(--kirby-spacing-xxxxxl)}}ion-toolbar:before{content:\"\";position:absolute;left:0;right:0;bottom:0;height:1px}ion-toolbar:before,ion-toolbar::part(background){transition:background-color 50ms linear}ion-toolbar.content-scrolled{--background: rgb(95.4094117647%, 95.4094117647%, 95.4094117647%)}ion-toolbar.content-scrolled:before,ion-toolbar.content-scrolled::part(background){transition-duration:var(--kirby-transition-duration-quick)}ion-toolbar.content-scrolled:not(.content-pinned):before{background-color:var(--kirby-medium)}ion-toolbar.content-pinned:before{transition:none}ion-toolbar ion-buttons[slot=start]{margin-right:var(--kirby-spacing-xxs)}ion-toolbar ion-buttons[slot=primary],ion-toolbar ion-buttons[slot=secondary]{margin-left:var(--kirby-spacing-xxs)}ion-toolbar ion-buttons[slot=secondary]{order:6}ion-toolbar ion-title{box-sizing:border-box;font-size:var(--kirby-font-size-n);font-weight:var(--kirby-font-weight-normal);padding-inline:calc(var(--action-buttons-width, var(--kirby-spacing-xl)var(--kirby-spacing-xxs)) + var(--padding-start))}ion-toolbar ion-title h1{margin-bottom:0}ion-toolbar ion-title.slide-and-fade-in .toolbar-title{scale:1;transform:translateY(0)}ion-toolbar ion-title .toolbar-title,ion-toolbar ion-title .toolbar-title>span.has-icon>span{text-overflow:ellipsis;white-space:nowrap;pointer-events:auto;overflow:hidden}ion-toolbar ion-title .toolbar-title{display:flex;align-items:center;justify-content:center;min-height:var(--kirby-spacing-xxxl);scale:0;transition-property:opacity,transform;transition-duration:.15s;transition-timing-function:var(--kirby-transition-easing-enter-exit);transform:translateY(10px)}ion-toolbar ion-title .toolbar-title span.clickable{cursor:pointer}ion-toolbar ion-title .toolbar-title span.has-icon{display:inline-flex;flex-direction:row;align-items:center;justify-content:center;max-width:100%}ion-toolbar ion-title .toolbar-title ::ng-deep>*{text-overflow:ellipsis;white-space:nowrap;pointer-events:auto;overflow:hidden}.hide{visibility:hidden;opacity:0;transition:opacity .1s linear}.hide.fade-in{visibility:inherit;opacity:1}@media(hover:hover){ion-back-button:hover{--state-layer-opacity: .08;--state-layer-background-color: var(--kirby-black);--background-hover: var(--state-layer-background-color);--background-hover-opacity: var(--state-layer-opacity)}}ion-back-button:active,ion-back-button.ion-activated{--state-layer-opacity: .16;--state-layer-background-color: var(--kirby-black);--background-activated: var(--state-layer-background-color);--background-activated-opacity: var(--state-layer-opacity)}ion-back-button{--color: var(--kirby-black);--background: var(--kirby-white);--icon-font-size: 24px;height:var(--kirby-spacing-xl);width:var(--kirby-spacing-xl);opacity:1}ion-back-button::part(icon){margin-inline:0}ion-back-button::part(native){opacity:1;border-radius:var(--kirby-border-radius-pill);overflow:hidden}ion-back-button:focus-visible::part(native){transition:all 80ms linear 0ms;box-shadow:var(--kirby-focus-ring-md-inset)}ion-back-button::part(native):after{transition:all 80ms linear 0ms}.page-header-container{max-width:var(--page-content-max-width, var(--kirby-page-content-max-width-default));margin:0 auto}.page-header{margin-left:var(--kirby-spacing-s);margin-top:var(--kirby-spacing-xxs);margin-bottom:var(--kirby-page-title-margin-bottom, var(--kirby-spacing-xl))}.page-header .page-title.has-actions{display:flex;justify-content:space-between;align-items:flex-start}.page-header .page-title h1,.page-header .page-title h2,.page-header .page-title h3,.page-header .page-title h4,.page-header .page-title h5,.page-header .page-title h6{margin:0}.page-header .page-subtitle{margin-top:var(--kirby-spacing-xxs)}.page-header.text-center{text-align:center;margin-left:0}.page-header.text-right{text-align:right}ion-content{--padding-top: var(--kirby-spacing-xs);--padding-start: var( --page-content-padding-start, calc(var(--kirby-spacing-s) + var(--ion-safe-area-left)) );--padding-end: var(--page-content-padding-end, var(--kirby-spacing-s));--background: var(--kirby-background-color);--color: var(--kirby-black)}@media(min-width:768px){ion-content{--padding-start: var(--page-content-padding-start, var(--kirby-spacing-xxl));--padding-end: var(--page-content-padding-end, var(--kirby-spacing-xxl))}}ion-content.has-header{--padding-top: 0}ion-content.max-width-lg{--page-content-max-width: var(--kirby-page-content-max-width-lg)}ion-content.max-width-xl{--page-content-max-width: var(--kirby-page-content-max-width-xl)}ion-content.max-width-full{--page-content-max-width: var(--kirby-page-content-max-width-full)}ion-content::part(scroll){scrollbar-gutter:stable}ion-content .content-inner{max-width:var(--page-content-max-width, var(--kirby-page-content-max-width-default));margin:0 auto;padding-bottom:var(--kirby-spacing-xl);transform:translateZ(0);will-change:transform}ion-content .fixed-content{width:100%;position:absolute;bottom:0;transform:initial}ion-content .fixed-content .content-inner{position:relative}.sticky-content-container{position:sticky;top:calc(-1 * var(--kirby-spacing-xs) - 1px);left:0;right:0;padding-top:1px;margin-block-end:var(--kirby-spacing-m);z-index:var(--kirby-z-index-sticky-content)}.sticky-content-container div{max-width:var(--page-content-max-width, var(--kirby-page-content-max-width-default));margin:0 auto}.sticky-content-container:before,.sticky-content-container:after{content:\"\";position:absolute;left:calc(-1 * var(--padding-start));right:calc(-1 * var(--padding-end));bottom:0}.sticky-content-container:before{top:0;background-color:var(--background)}.sticky-content-container:after{height:1px}.sticky-content-container.content-pinned:before{background-color:#f3f3f3}.sticky-content-container.content-pinned:after{background-color:var(--kirby-medium)}\n"], dependencies: [{ kind: "component", type: IonHeader, selector: "ion-header", inputs: ["collapse", "mode", "translucent"] }, { kind: "component", type: IonToolbar, selector: "ion-toolbar", inputs: ["color", "mode"] }, { kind: "component", type: IonButtons, selector: "ion-buttons", inputs: ["collapse"] }, { kind: "component", type: IonBackButton, selector: "ion-back-button" }, { kind: "component", type: IonTitle, selector: "ion-title", inputs: ["color", "size"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: IonContent, selector: "ion-content", inputs: ["color", "fixedSlotPlacement", "forceOverscroll", "fullscreen", "scrollEvents", "scrollX", "scrollY"], outputs: ["ionScrollStart", "ionScroll", "ionScrollEnd"] }, { kind: "component", type: IonRefresher, selector: "ion-refresher", inputs: ["closeDuration", "disabled", "mode", "pullFactor", "pullMax", "pullMin", "snapbackDuration"], outputs: ["ionRefresh", "ionPull", "ionStart", "ionPullStart", "ionPullEnd"] }, { kind: "component", type: SpinnerComponent, selector: "kirby-spinner" }, { kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "component", type: IonFooter, selector: "ion-footer", inputs: ["collapse", "mode", "translucent"] }, { kind: "directive", type: FitHeadingDirective, selector: "h1[kirbyFitHeading],h2[kirbyFitHeading],h3[kirbyFitHeading],[kirbyFitHeading]", inputs: ["kirbyFitHeading"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
677
- }
678
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.23", ngImport: i0, type: PageComponent, decorators: [{
679
- type: Component,
680
- args: [{ selector: 'kirby-page', changeDetection: ChangeDetectionStrategy.OnPush, providers: [IonicElementPartHelper], imports: [
681
- IonHeader,
682
- IonToolbar,
683
- IonButtons,
684
- IonBackButton,
685
- IonTitle,
686
- NgTemplateOutlet,
687
- IonContent,
688
- IonRefresher,
689
- SpinnerComponent,
690
- NgClass,
691
- IonFooter,
692
- FitHeadingDirective,
693
- ], template: "<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", styles: [".kirby-line-clamp{display:-webkit-box;-webkit-line-clamp:var(--line-clamp, none);-webkit-box-orient:vertical;overflow:hidden}ion-header,ion-toolbar{box-sizing:border-box;--background: var(--kirby-background-color)}ion-title h1{font-size:min(var(--kirby-font-size-m),21.6px)}ion-toolbar{--border-width: 0 !important;--padding-start: var(--kirby-spacing-s);--padding-end: var(--kirby-spacing-s);--padding-top: 0;--padding-bottom: 0;--ion-toolbar-color: var(--kirby-black);--min-height: var(--kirby-spacing-xxxl)}@media(min-width:768px){ion-toolbar{--padding-start: var(--kirby-spacing-m);--padding-end: var(--kirby-spacing-m);--min-height: var(--kirby-spacing-xxxxxl)}}ion-toolbar:before{content:\"\";position:absolute;left:0;right:0;bottom:0;height:1px}ion-toolbar:before,ion-toolbar::part(background){transition:background-color 50ms linear}ion-toolbar.content-scrolled{--background: rgb(95.4094117647%, 95.4094117647%, 95.4094117647%)}ion-toolbar.content-scrolled:before,ion-toolbar.content-scrolled::part(background){transition-duration:var(--kirby-transition-duration-quick)}ion-toolbar.content-scrolled:not(.content-pinned):before{background-color:var(--kirby-medium)}ion-toolbar.content-pinned:before{transition:none}ion-toolbar ion-buttons[slot=start]{margin-right:var(--kirby-spacing-xxs)}ion-toolbar ion-buttons[slot=primary],ion-toolbar ion-buttons[slot=secondary]{margin-left:var(--kirby-spacing-xxs)}ion-toolbar ion-buttons[slot=secondary]{order:6}ion-toolbar ion-title{box-sizing:border-box;font-size:var(--kirby-font-size-n);font-weight:var(--kirby-font-weight-normal);padding-inline:calc(var(--action-buttons-width, var(--kirby-spacing-xl)var(--kirby-spacing-xxs)) + var(--padding-start))}ion-toolbar ion-title h1{margin-bottom:0}ion-toolbar ion-title.slide-and-fade-in .toolbar-title{scale:1;transform:translateY(0)}ion-toolbar ion-title .toolbar-title,ion-toolbar ion-title .toolbar-title>span.has-icon>span{text-overflow:ellipsis;white-space:nowrap;pointer-events:auto;overflow:hidden}ion-toolbar ion-title .toolbar-title{display:flex;align-items:center;justify-content:center;min-height:var(--kirby-spacing-xxxl);scale:0;transition-property:opacity,transform;transition-duration:.15s;transition-timing-function:var(--kirby-transition-easing-enter-exit);transform:translateY(10px)}ion-toolbar ion-title .toolbar-title span.clickable{cursor:pointer}ion-toolbar ion-title .toolbar-title span.has-icon{display:inline-flex;flex-direction:row;align-items:center;justify-content:center;max-width:100%}ion-toolbar ion-title .toolbar-title ::ng-deep>*{text-overflow:ellipsis;white-space:nowrap;pointer-events:auto;overflow:hidden}.hide{visibility:hidden;opacity:0;transition:opacity .1s linear}.hide.fade-in{visibility:inherit;opacity:1}@media(hover:hover){ion-back-button:hover{--state-layer-opacity: .08;--state-layer-background-color: var(--kirby-black);--background-hover: var(--state-layer-background-color);--background-hover-opacity: var(--state-layer-opacity)}}ion-back-button:active,ion-back-button.ion-activated{--state-layer-opacity: .16;--state-layer-background-color: var(--kirby-black);--background-activated: var(--state-layer-background-color);--background-activated-opacity: var(--state-layer-opacity)}ion-back-button{--color: var(--kirby-black);--background: var(--kirby-white);--icon-font-size: 24px;height:var(--kirby-spacing-xl);width:var(--kirby-spacing-xl);opacity:1}ion-back-button::part(icon){margin-inline:0}ion-back-button::part(native){opacity:1;border-radius:var(--kirby-border-radius-pill);overflow:hidden}ion-back-button:focus-visible::part(native){transition:all 80ms linear 0ms;box-shadow:var(--kirby-focus-ring-md-inset)}ion-back-button::part(native):after{transition:all 80ms linear 0ms}.page-header-container{max-width:var(--page-content-max-width, var(--kirby-page-content-max-width-default));margin:0 auto}.page-header{margin-left:var(--kirby-spacing-s);margin-top:var(--kirby-spacing-xxs);margin-bottom:var(--kirby-page-title-margin-bottom, var(--kirby-spacing-xl))}.page-header .page-title.has-actions{display:flex;justify-content:space-between;align-items:flex-start}.page-header .page-title h1,.page-header .page-title h2,.page-header .page-title h3,.page-header .page-title h4,.page-header .page-title h5,.page-header .page-title h6{margin:0}.page-header .page-subtitle{margin-top:var(--kirby-spacing-xxs)}.page-header.text-center{text-align:center;margin-left:0}.page-header.text-right{text-align:right}ion-content{--padding-top: var(--kirby-spacing-xs);--padding-start: var( --page-content-padding-start, calc(var(--kirby-spacing-s) + var(--ion-safe-area-left)) );--padding-end: var(--page-content-padding-end, var(--kirby-spacing-s));--background: var(--kirby-background-color);--color: var(--kirby-black)}@media(min-width:768px){ion-content{--padding-start: var(--page-content-padding-start, var(--kirby-spacing-xxl));--padding-end: var(--page-content-padding-end, var(--kirby-spacing-xxl))}}ion-content.has-header{--padding-top: 0}ion-content.max-width-lg{--page-content-max-width: var(--kirby-page-content-max-width-lg)}ion-content.max-width-xl{--page-content-max-width: var(--kirby-page-content-max-width-xl)}ion-content.max-width-full{--page-content-max-width: var(--kirby-page-content-max-width-full)}ion-content::part(scroll){scrollbar-gutter:stable}ion-content .content-inner{max-width:var(--page-content-max-width, var(--kirby-page-content-max-width-default));margin:0 auto;padding-bottom:var(--kirby-spacing-xl);transform:translateZ(0);will-change:transform}ion-content .fixed-content{width:100%;position:absolute;bottom:0;transform:initial}ion-content .fixed-content .content-inner{position:relative}.sticky-content-container{position:sticky;top:calc(-1 * var(--kirby-spacing-xs) - 1px);left:0;right:0;padding-top:1px;margin-block-end:var(--kirby-spacing-m);z-index:var(--kirby-z-index-sticky-content)}.sticky-content-container div{max-width:var(--page-content-max-width, var(--kirby-page-content-max-width-default));margin:0 auto}.sticky-content-container:before,.sticky-content-container:after{content:\"\";position:absolute;left:calc(-1 * var(--padding-start));right:calc(-1 * var(--padding-end));bottom:0}.sticky-content-container:before{top:0;background-color:var(--background)}.sticky-content-container:after{height:1px}.sticky-content-container.content-pinned:before{background-color:#f3f3f3}.sticky-content-container.content-pinned:after{background-color:var(--kirby-medium)}\n"] }]
694
- }], ctorParameters: () => [{ type: i0.ElementRef }, { type: i0.Injector }, { type: i0.Renderer2 }, { type: i2.Router }, { type: i0.ChangeDetectorRef }, { type: i0.NgZone }, { type: i1.ModalNavigationService }, { type: i3.ResizeObserverService }, { type: i4.TabsComponent, decorators: [{
695
- type: Optional
696
- }, {
697
- type: SkipSelf
698
- }] }, { type: undefined, decorators: [{
699
- type: Optional
700
- }, {
701
- type: Inject,
702
- args: [PAGE_BACK_BUTTON_OVERRIDE]
703
- }] }, { type: i5.IonRouterOutlet, decorators: [{
704
- type: Optional
705
- }] }, { type: i5.NavController, decorators: [{
706
- type: Optional
707
- }] }, { type: i6.IonicElementPartHelper }, { type: i3.TranslationService }, { type: i7.Title }], propDecorators: { title: [{
708
- type: Input
709
- }], subtitle: [{
710
- type: Input
711
- }], toolbarTitle: [{
712
- type: Input
713
- }], titleAlignment: [{
714
- type: Input
715
- }], defaultBackHref: [{
716
- type: Input
717
- }], hideBackButton: [{
718
- type: Input
719
- }], titleMaxLines: [{
720
- type: Input
721
- }], hasInteractiveTitle: [{
722
- type: Input
723
- }], maxWidth: [{
724
- type: Input
725
- }], tabBarBottomHidden: [{
726
- type: Input
727
- }], enter: [{
728
- type: Output
729
- }], leave: [{
730
- type: Output
731
- }], refresh: [{
732
- type: Output
733
- }], backButtonClick: [{
734
- type: Output
735
- }], toolbarTitleClick: [{
736
- type: Output
737
- }], content: [{
738
- type: ViewChild,
739
- args: [IonContent, { static: true }]
740
- }], ionContentElement: [{
741
- type: ViewChild,
742
- args: [IonContent, { static: true, read: ElementRef }]
743
- }], ionHeaderElement: [{
744
- type: ViewChild,
745
- args: [IonHeader, { static: true, read: ElementRef }]
746
- }], ionFooterElement: [{
747
- type: ViewChild,
748
- args: [IonFooter, { static: true, read: ElementRef }]
749
- }], ionToolbarElement: [{
750
- type: ViewChild,
751
- args: [IonToolbar, { static: true, read: ElementRef }]
752
- }], ionToolbarButtonsElement: [{
753
- type: ViewChildren,
754
- args: [IonButtons, { read: ElementRef }]
755
- }], backButton: [{
756
- type: ViewChild,
757
- args: [IonBackButton, { static: false }]
758
- }], pageTitle: [{
759
- type: ViewChild,
760
- args: ['pageTitle', { static: false, read: ElementRef }]
761
- }], stickyContentContainer: [{
762
- type: ViewChild,
763
- args: ['stickyContentContainer', { static: false, read: ElementRef }]
764
- }], simpleTitleTemplate: [{
765
- type: ViewChild,
766
- args: ['simpleTitleTemplate', { static: true, read: TemplateRef }]
767
- }], simpleToolbarTitleTemplate: [{
768
- type: ViewChild,
769
- args: ['simpleToolbarTitleTemplate', { static: true, read: TemplateRef }]
770
- }], customToolbarTitleTemplate: [{
771
- type: ContentChild,
772
- args: [PageToolbarTitleDirective, { static: false, read: TemplateRef }]
773
- }], customTitleTemplate: [{
774
- type: ContentChild,
775
- args: [PageTitleDirective, { static: false, read: TemplateRef }]
776
- }], customSubtitleTemplate: [{
777
- type: ContentChild,
778
- args: [PageSubtitleDirective, { static: false, read: TemplateRef }]
779
- }], customActions: [{
780
- type: ContentChildren,
781
- args: [PageActionsDirective]
782
- }], customContent: [{
783
- type: ContentChildren,
784
- args: [PageContentDirective]
785
- }], stickyContentRef: [{
786
- type: ContentChild,
787
- args: [PageStickyContentDirective, { static: false, read: TemplateRef }]
788
- }], header: [{
789
- type: ContentChild,
790
- args: [HeaderComponent]
791
- }], _onKeyboardWillShow: [{
792
- type: HostListener,
793
- args: ['window:keyboardWillShow', ['$event']]
794
- }], _onKeyboardWillHide: [{
795
- type: HostListener,
796
- args: ['window:keyboardWillHide']
797
- }], _onSelectedTabClick: [{
798
- type: HostListener,
799
- args: [`window:${selectedTabClickEvent}`]
800
- }] } });
801
-
802
- class PageFooterComponent {
803
- constructor(pageComponent, hostElement, renderer) {
804
- this.pageComponent = pageComponent;
805
- this.hostElement = hostElement;
806
- this.renderer = renderer;
807
- this.hasPadding = true;
808
- if (!pageComponent) {
809
- throw new Error('Page footer must reside inside of a Kirby page');
810
- }
811
- }
812
- close() {
813
- this.pageComponent.tabBarBottomHidden = false;
814
- this.renderer.removeChild(this.hostElement.nativeElement.parentElement, this.hostElement.nativeElement, true);
815
- }
816
- ngOnDestroy() {
817
- this.pageComponent.tabBarBottomHidden = false;
818
- }
819
- /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.23", ngImport: i0, type: PageFooterComponent, deps: [{ token: PageComponent, optional: true, skipSelf: true }, { token: i0.ElementRef }, { token: i0.Renderer2 }], target: i0.ɵɵFactoryTarget.Component }); }
820
- /** @nocollapse */ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.2.23", type: PageFooterComponent, isStandalone: true, selector: "kirby-page-footer", inputs: { hasPadding: "hasPadding" }, ngImport: i0, template: "<div class=\"wrapper\" [class.padding]=\"hasPadding\">\n <ng-content></ng-content>\n</div>\n", styles: ["ion-item-option.primary{background-color:var(--kirby-primary);color:var(--kirby-primary-contrast)}ion-item-option.secondary{background-color:var(--kirby-secondary);color:var(--kirby-secondary-contrast)}ion-item-option.tertiary{background-color:var(--kirby-tertiary);color:var(--kirby-tertiary-contrast)}ion-item-option.success{background-color:var(--kirby-success);color:var(--kirby-success-contrast)}ion-item-option.warning{background-color:var(--kirby-warning);color:var(--kirby-warning-contrast)}ion-item-option.danger{background-color:var(--kirby-danger);color:var(--kirby-danger-contrast)}ion-item-option.white-overlay{background-color:var(--kirby-white-overlay);color:var(--kirby-white-overlay-contrast)}ion-item-option.light{background-color:var(--kirby-light);color:var(--kirby-light-contrast)}ion-item-option.medium{background-color:var(--kirby-medium);color:var(--kirby-medium-contrast)}ion-item-option.dark{background-color:var(--kirby-dark);color:var(--kirby-dark-contrast)}ion-item-option.dark-overlay{background-color:var(--kirby-dark-overlay);color:var(--kirby-dark-overlay-contrast)}:host{display:block;background-color:var(--kirby-white);--kirby-inputs-background-color: var(--kirby-dark-overlay);--kirby-inputs-background-color-hover: var(--kirby-dark-overlay-10);--kirby-inputs-background-color-active: var(--kirby-dark-overlay-20);--kirby-inputs-color: var(--kirby-black);--kirby-inputs-indicator-background-color: var(--kirby-black);--kirby-inputs-indicator-color: var(--kirby-white);--kirby-inputs-placeholder-color: var(--kirby-semi-dark);--kirby-inputs-color-hover: var(--kirby-semi-dark);--kirby-inputs-elevation: none;--kirby-divider-color: var(--kirby-background-color)}:host .wrapper{position:relative;max-width:var(--page-content-max-width, var(--kirby-page-content-max-width-default));margin:0 auto;padding-bottom:var(--kirby-page-footer-safe-area-bottom, var(--kirby-safe-area-bottom))}:host .wrapper.padding{padding:var(--kirby-spacing-xxs) var(--kirby-spacing-s);padding-bottom:calc(var(--kirby-spacing-xxs) + var(--kirby-page-footer-safe-area-bottom, var(--kirby-safe-area-bottom)))}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
821
- }
822
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.23", ngImport: i0, type: PageFooterComponent, decorators: [{
823
- type: Component,
824
- args: [{ selector: 'kirby-page-footer', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"wrapper\" [class.padding]=\"hasPadding\">\n <ng-content></ng-content>\n</div>\n", styles: ["ion-item-option.primary{background-color:var(--kirby-primary);color:var(--kirby-primary-contrast)}ion-item-option.secondary{background-color:var(--kirby-secondary);color:var(--kirby-secondary-contrast)}ion-item-option.tertiary{background-color:var(--kirby-tertiary);color:var(--kirby-tertiary-contrast)}ion-item-option.success{background-color:var(--kirby-success);color:var(--kirby-success-contrast)}ion-item-option.warning{background-color:var(--kirby-warning);color:var(--kirby-warning-contrast)}ion-item-option.danger{background-color:var(--kirby-danger);color:var(--kirby-danger-contrast)}ion-item-option.white-overlay{background-color:var(--kirby-white-overlay);color:var(--kirby-white-overlay-contrast)}ion-item-option.light{background-color:var(--kirby-light);color:var(--kirby-light-contrast)}ion-item-option.medium{background-color:var(--kirby-medium);color:var(--kirby-medium-contrast)}ion-item-option.dark{background-color:var(--kirby-dark);color:var(--kirby-dark-contrast)}ion-item-option.dark-overlay{background-color:var(--kirby-dark-overlay);color:var(--kirby-dark-overlay-contrast)}:host{display:block;background-color:var(--kirby-white);--kirby-inputs-background-color: var(--kirby-dark-overlay);--kirby-inputs-background-color-hover: var(--kirby-dark-overlay-10);--kirby-inputs-background-color-active: var(--kirby-dark-overlay-20);--kirby-inputs-color: var(--kirby-black);--kirby-inputs-indicator-background-color: var(--kirby-black);--kirby-inputs-indicator-color: var(--kirby-white);--kirby-inputs-placeholder-color: var(--kirby-semi-dark);--kirby-inputs-color-hover: var(--kirby-semi-dark);--kirby-inputs-elevation: none;--kirby-divider-color: var(--kirby-background-color)}:host .wrapper{position:relative;max-width:var(--page-content-max-width, var(--kirby-page-content-max-width-default));margin:0 auto;padding-bottom:var(--kirby-page-footer-safe-area-bottom, var(--kirby-safe-area-bottom))}:host .wrapper.padding{padding:var(--kirby-spacing-xxs) var(--kirby-spacing-s);padding-bottom:calc(var(--kirby-spacing-xxs) + var(--kirby-page-footer-safe-area-bottom, var(--kirby-safe-area-bottom)))}\n"] }]
825
- }], ctorParameters: () => [{ type: PageComponent, decorators: [{
826
- type: Optional
827
- }, {
828
- type: SkipSelf
829
- }] }, { type: i0.ElementRef }, { type: i0.Renderer2 }], propDecorators: { hasPadding: [{
830
- type: Input
831
- }] } });
832
-
833
- class PageModule {
834
- /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.23", ngImport: i0, type: PageModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
835
- /** @nocollapse */ static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "21.2.23", ngImport: i0, type: PageModule, imports: [CommonModule,
836
- FitHeadingDirective,
837
- SpinnerModule,
838
- HeaderModule,
839
- IonHeader,
840
- IonToolbar,
841
- IonButtons,
842
- IonBackButton,
843
- IonContent,
844
- IonTitle,
845
- IonRefresher,
846
- IonFooter,
847
- PageComponent,
848
- PageActionsComponent,
849
- PageActionsDirective,
850
- PageContentComponent,
851
- PageFooterComponent,
852
- PageContentDirective,
853
- PageProgressComponent,
854
- PageTitleComponent,
855
- PageTitleDirective,
856
- PageSubtitleDirective,
857
- PageToolbarTitleDirective,
858
- PageStickyContentDirective], exports: [PageComponent,
859
- PageActionsComponent,
860
- PageActionsDirective,
861
- PageContentComponent,
862
- PageFooterComponent,
863
- PageContentDirective,
864
- PageProgressComponent,
865
- PageTitleComponent,
866
- PageTitleDirective,
867
- PageSubtitleDirective,
868
- PageToolbarTitleDirective,
869
- FitHeadingDirective,
870
- PageStickyContentDirective] }); }
871
- /** @nocollapse */ static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "21.2.23", ngImport: i0, type: PageModule, imports: [CommonModule,
872
- SpinnerModule,
873
- HeaderModule,
874
- IonHeader,
875
- IonToolbar,
876
- IonButtons,
877
- IonBackButton,
878
- IonContent,
879
- IonTitle,
880
- IonRefresher,
881
- IonFooter,
882
- PageComponent] }); }
883
- }
884
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.23", ngImport: i0, type: PageModule, decorators: [{
885
- type: NgModule,
886
- args: [{
887
- imports: [
888
- CommonModule,
889
- FitHeadingDirective,
890
- SpinnerModule,
891
- HeaderModule,
892
- IonHeader,
893
- IonToolbar,
894
- IonButtons,
895
- IonBackButton,
896
- IonContent,
897
- IonTitle,
898
- IonRefresher,
899
- IonFooter,
900
- PageComponent,
901
- PageActionsComponent,
902
- PageActionsDirective,
903
- PageContentComponent,
904
- PageFooterComponent,
905
- PageContentDirective,
906
- PageProgressComponent,
907
- PageTitleComponent,
908
- PageTitleDirective,
909
- PageSubtitleDirective,
910
- PageToolbarTitleDirective,
911
- PageStickyContentDirective,
912
- ],
913
- exports: [
914
- PageComponent,
915
- PageActionsComponent,
916
- PageActionsDirective,
917
- PageContentComponent,
918
- PageFooterComponent,
919
- PageContentDirective,
920
- PageProgressComponent,
921
- PageTitleComponent,
922
- PageTitleDirective,
923
- PageSubtitleDirective,
924
- PageToolbarTitleDirective,
925
- FitHeadingDirective,
926
- PageStickyContentDirective,
927
- ],
928
- }]
929
- }] });
930
-
931
- /**
932
- * Generated bundle index. Do not edit.
933
- */
934
-
447
+ `,
448
+ changeDetection: ChangeDetectionStrategy.Eager,
449
+ styles: [":host{display:inline-flex;column-gap:8px}\n"]
450
+ }]
451
+ }]
452
+ });
453
+ var PageComponent = class PageComponent {
454
+ set maxWidth(width) {
455
+ this._maxWidth = width;
456
+ }
457
+ get maxWidth() {
458
+ return this._maxWidth;
459
+ }
460
+ get tabBarBottomHidden() {
461
+ return this._tabBarBottomHidden;
462
+ }
463
+ set tabBarBottomHidden(value) {
464
+ if (this.tabsComponent) setTimeout(() => {
465
+ this.tabsComponent.tabBarBottomHidden = value;
466
+ this.changeDetectorRef.markForCheck();
467
+ });
468
+ this._tabBarBottomHidden = value;
469
+ }
470
+ constructor(elementRef, injector, renderer, router, changeDetectorRef, zone, modalNavigationService, resizeObserverService, tabsComponent, backButtonOverride, routerOutlet, navCtrl, ionicElementPartHelper, translations, htmlDocTitle) {
471
+ this.elementRef = elementRef;
472
+ this.injector = injector;
473
+ this.renderer = renderer;
474
+ this.router = router;
475
+ this.changeDetectorRef = changeDetectorRef;
476
+ this.zone = zone;
477
+ this.modalNavigationService = modalNavigationService;
478
+ this.resizeObserverService = resizeObserverService;
479
+ this.tabsComponent = tabsComponent;
480
+ this.backButtonOverride = backButtonOverride;
481
+ this.routerOutlet = routerOutlet;
482
+ this.navCtrl = navCtrl;
483
+ this.ionicElementPartHelper = ionicElementPartHelper;
484
+ this.translations = translations;
485
+ this.htmlDocTitle = htmlDocTitle;
486
+ this.titleAlignment = "left";
487
+ this._maxWidth = "default";
488
+ this.enter = new EventEmitter();
489
+ this.leave = new EventEmitter();
490
+ this.refresh = new EventEmitter();
491
+ this.backButtonClick = new EventEmitter();
492
+ this.toolbarTitleClick = new EventEmitter();
493
+ this.isStickyContentPinned = false;
494
+ this.isObservingTitle = false;
495
+ this.isObservingActions = false;
496
+ this.isDocTitleSet = false;
497
+ this.ngOnDestroy$ = new Subject();
498
+ this.navigationStart$ = this.router.events.pipe(filter((event) => event instanceof NavigationStart), takeUntil(this.ngOnDestroy$));
499
+ this.navigationEnd$ = this.router.events.pipe(filter((event) => event instanceof NavigationEnd), takeUntil(this.ngOnDestroy$));
500
+ }
501
+ whenContentReady() {
502
+ if (!this.contentReadyPromise) this.contentReadyPromise = new Promise((resolve) => {
503
+ this.resizeObserverService.observe(this.ionContentElement, (entry) => {
504
+ if (entry.contentRect.height > 0) {
505
+ this.resizeObserverService.unobserve(this.ionContentElement);
506
+ resolve();
507
+ }
508
+ });
509
+ });
510
+ return this.contentReadyPromise;
511
+ }
512
+ ngOnInit() {
513
+ this.removeWrapper();
514
+ this.ionicElementPartHelper.setPart("background", this.ionToolbarElement, ".toolbar-background");
515
+ const actionGroupConfig = {
516
+ isCondensed: true,
517
+ maxVisibleActions: 1
518
+ };
519
+ this.toolbarActionGroupInjector = Injector.create({
520
+ providers: [{
521
+ provide: ACTIONGROUP_CONFIG,
522
+ useValue: actionGroupConfig
523
+ }],
524
+ parent: this.injector
525
+ });
526
+ }
527
+ ngOnChanges(changes) {
528
+ if (changes.titleMaxLines) this.fitHeadingConfig = { maxLines: changes.titleMaxLines.currentValue };
529
+ if (changes.subtitle && !changes.subtitle.isFirstChange) {
530
+ this.subtitle = changes.title.currentValue;
531
+ this.hasPageSubtitle = this.subtitle !== void 0;
532
+ }
533
+ if (changes.title || changes.toolbarTitle) this.setHTMLDocumentTitle(this.title || this.toolbarTitle);
534
+ }
535
+ ngAfterViewInit() {
536
+ this.zone.runOutsideAngular(() => {
537
+ this.contentScrolled$ = fromEvent(this.ionContentElement.nativeElement, "ionScroll").pipe(debounceTime(contentScrollDebounceTimeInMS), map((event) => event.detail), takeUntil(this.ngOnDestroy$));
538
+ this.contentScrolled$.subscribe((scrollInfo) => {
539
+ if (scrollInfo.scrollTop > contentScrolledOffsetInPixels !== this.isContentScrolled) {
540
+ this.isContentScrolled = !this.isContentScrolled;
541
+ this.changeDetectorRef.detectChanges();
542
+ }
543
+ });
544
+ });
545
+ this.url = this.router.url;
546
+ this.onEnter();
547
+ this.navigationStart$.subscribe((event) => {
548
+ if (this.getPathname(event.url) !== this.getPathname(this.url) && !this.modalNavigationService.isModalRoute(this.url) && !this.modalNavigationService.isModalRoute(event.url)) this.onLeave();
549
+ });
550
+ this.navigationEnd$.subscribe((event) => {
551
+ if (this.getPathname(event.urlAfterRedirects) === this.getPathname(this.url)) this.onEnter();
552
+ });
553
+ this.interceptBackButtonClicksSetup();
554
+ this.initializeStickyIntersectionObserver();
555
+ this.setActionButtonsWidth();
556
+ }
557
+ ngAfterContentChecked() {
558
+ this.initializeHeader();
559
+ this.initializeTitle();
560
+ this.initializeActions();
561
+ this.initializeContent();
562
+ this.initializeStickyContent();
563
+ this.changeDetectorRef.detectChanges();
564
+ }
565
+ ngOnDestroy() {
566
+ this.ngOnDestroy$.next();
567
+ this.ngOnDestroy$.complete();
568
+ this.titleIntersectionObserver?.disconnect();
569
+ this.stickyActionsIntersectionObserver?.disconnect();
570
+ this.stickyContentIntersectionObserver?.disconnect();
571
+ this.unobserveTitleMutation?.();
572
+ }
573
+ delegateRefreshEvent(event) {
574
+ this.refresh.emit({ complete: event.target.complete.bind(event.target) });
575
+ }
576
+ getMaxWidthClasses() {
577
+ if (!this.maxWidth) return "";
578
+ if (this.maxWidth === "default") return "";
579
+ return `max-width-${this.maxWidth}`;
580
+ }
581
+ onTitleClick(event) {
582
+ if (this.toolbarTitleClick.observed) this.toolbarTitleClick.emit(event);
583
+ else this.header?.titleClick.emit(event);
584
+ }
585
+ removeWrapper() {
586
+ const parent = this.elementRef.nativeElement.parentNode;
587
+ this.renderer.removeChild(parent, this.elementRef.nativeElement);
588
+ this.renderer.appendChild(parent, this.ionHeaderElement.nativeElement);
589
+ this.renderer.appendChild(parent, this.ionContentElement.nativeElement);
590
+ this.renderer.appendChild(parent, this.ionFooterElement.nativeElement);
591
+ }
592
+ onEnter() {
593
+ if (this.isActive) return;
594
+ this.isActive = true;
595
+ this.enter.emit();
596
+ this.patchIonLastFocused();
597
+ this.observeTitle();
598
+ this.observeActions();
599
+ this.setHTMLDocumentTitle(this.header?.title || this.title || this.toolbarTitle);
600
+ this.observeTitleDOMChanges();
601
+ }
602
+ onLeave() {
603
+ if (!this.isActive) return;
604
+ this.isActive = false;
605
+ this.leave.emit();
606
+ this.unobserveTitle();
607
+ this.unobserveActions();
608
+ this.unobserveTitleMutation?.();
609
+ if (this.tabBarBottomHidden && this.tabsComponent) this.tabsComponent.tabBarBottomHidden = false;
610
+ }
611
+ interceptBackButtonClicksSetup() {
612
+ if (this.backButtonOverride) this.backButton.onClick = (event) => {
613
+ event.preventDefault();
614
+ this.backButtonOverride.navigateBack(this.routerOutlet, this.navCtrl, this.defaultBackHref);
615
+ };
616
+ if (this.backButtonClick.observers.length === 0) this.backButtonClick.pipe(takeUntil(this.ngOnDestroy$)).subscribe(this.backButton.onClick.bind(this.backButton));
617
+ this.backButton.onClick = (event) => {
618
+ this.backButtonClick.emit(event);
619
+ };
620
+ }
621
+ patchIonLastFocused() {
622
+ const ionLastFocus = this.ionContentElement.nativeElement.querySelector("[ion-last-focus=\"true\"]");
623
+ setTimeout(() => {
624
+ if (ionLastFocus?.getAttribute("tabindex") !== "-1") return;
625
+ this.renderer.removeAttribute(ionLastFocus, "tabindex");
626
+ });
627
+ }
628
+ initializeStickyIntersectionObserver() {
629
+ if (this.stickyContentTemplate) {
630
+ if (!this.stickyContentIntersectionObserver) this.stickyContentIntersectionObserver = this.createStickyContentIntersectionObserver();
631
+ setTimeout(() => {
632
+ this.stickyContentIntersectionObserver.observe(this.stickyContentContainer.nativeElement);
633
+ });
634
+ }
635
+ }
636
+ initializeHeader() {
637
+ if (this.hasHeader === void 0 && !!this.header) {
638
+ this.hasHeader = true;
639
+ this.titleActionIconTemplate = this.header.titleActionIconTemplate;
640
+ if (this.header.titleClick.observed && this.hasInteractiveTitle === void 0) this.hasInteractiveTitle = true;
641
+ this.setHTMLDocumentTitle(this.header.title);
642
+ this.header.title$.pipe(takeUntil(this.ngOnDestroy$)).subscribe(() => {
643
+ this.setHTMLDocumentTitle(this.header.title);
644
+ });
645
+ }
646
+ }
647
+ initializeTitle() {
648
+ if (this.hasHeader && this.isObservingTitle && !this.header?.titleElement) this.isObservingTitle = false;
649
+ if (this.hasPageTitle) {
650
+ if (!this.isObservingTitle && !!this.header?.titleElement) this.observeTitle();
651
+ return;
652
+ }
653
+ this.hasPageTitle = this.title !== void 0 || !!this.customTitleTemplate || !!this.header?.title;
654
+ this.toolbarTitleVisible = !this.hasPageTitle;
655
+ this.hasPageSubtitle = this.subtitle !== void 0 || !!this.customSubtitleTemplate;
656
+ if (this.header?.title && !this.toolbarTitle) {
657
+ this.toolbarTitle = this.header.title;
658
+ this.header.title$.pipe(takeUntil(this.ngOnDestroy$)).subscribe((title) => {
659
+ this.toolbarTitle = title;
660
+ });
661
+ }
662
+ this.observeTitle();
663
+ const defaultTitleTemplate = this.customTitleTemplate || this.simpleTitleTemplate;
664
+ this.toolbarTitleTemplate = this.customToolbarTitleTemplate ? this.customToolbarTitleTemplate : typeof this.toolbarTitle === "string" ? this.simpleToolbarTitleTemplate : defaultTitleTemplate;
665
+ if (this.toolbarTitleClick.observed && this.hasInteractiveTitle === void 0) this.hasInteractiveTitle = true;
666
+ }
667
+ observeTitle() {
668
+ if (!this.hasPageTitle) return;
669
+ if (this.isObservingTitle) return;
670
+ this.isObservingTitle = true;
671
+ if (!this.titleIntersectionObserver) this.titleIntersectionObserver = new IntersectionObserver((entries) => {
672
+ const lastEntry = entries[entries.length - 1];
673
+ if (lastEntry) {
674
+ const showToolbarTitle = !lastEntry.isIntersecting;
675
+ if (showToolbarTitle !== this.toolbarTitleVisible) {
676
+ this.toolbarTitleVisible = showToolbarTitle;
677
+ this.changeDetectorRef.detectChanges();
678
+ }
679
+ }
680
+ }, { root: this.ionContentElement.nativeElement });
681
+ this.zone.runOutsideAngular(() => {
682
+ this.whenContentReady().then(() => {
683
+ const titleElementRef = this.pageTitle || this.header?.titleElement;
684
+ if (titleElementRef?.nativeElement) this.titleIntersectionObserver.observe(titleElementRef.nativeElement);
685
+ });
686
+ });
687
+ }
688
+ unobserveTitle() {
689
+ const titleElementRef = this.pageTitle || this.header?.titleElement;
690
+ if (titleElementRef) this.titleIntersectionObserver?.unobserve(titleElementRef.nativeElement);
691
+ this.isObservingTitle = false;
692
+ }
693
+ observeTitleDOMChanges() {
694
+ if (!getGlobalConfig()?.setHtmlDocTitle) return;
695
+ if (this.isDocTitleSet) return;
696
+ const titleArea = this.ionHeaderElement.nativeElement.querySelector("ion-toolbar ion-title .toolbar-title");
697
+ this.setHTMLDocumentTitle(titleArea.textContent);
698
+ this.unobserveTitleMutation = observeContent(titleArea, () => {
699
+ this.setHTMLDocumentTitle(titleArea.textContent);
700
+ });
701
+ }
702
+ setHTMLDocumentTitle(title) {
703
+ if (!getGlobalConfig()?.setHtmlDocTitle || !title || title.trim() === "") return;
704
+ this.htmlDocTitle.setTitle(title);
705
+ this.isDocTitleSet = true;
706
+ }
707
+ initializeActions() {
708
+ if (this.headerActionsTemplate === void 0 && !!this.header) this.headerActionsTemplate = this.header.actionsTemplate;
709
+ if (this.hasHeader && this.isObservingActions && !this.header?.actionsElement) this.isObservingActions = false;
710
+ this.observeActions();
711
+ this.customActions.forEach((pageAction) => {
712
+ if (pageAction.isFixed) this.fixedActionsTemplate = pageAction.template;
713
+ else if (pageAction.isSticky) this.stickyActionsTemplate = pageAction.template;
714
+ else this.pageActionsTemplate = pageAction.template;
715
+ });
716
+ }
717
+ observeActions() {
718
+ if (!this.header?.actionsElement) return;
719
+ if (this.isObservingActions) return;
720
+ this.isObservingActions = true;
721
+ if (!this.stickyActionsIntersectionObserver) this.stickyActionsIntersectionObserver = new IntersectionObserver((entries) => {
722
+ const lastEntry = entries[entries.length - 1];
723
+ if (lastEntry) {
724
+ const showToolbarActions = !lastEntry.isIntersecting;
725
+ if (showToolbarActions !== this.toolbarActionsVisible) {
726
+ this.toolbarActionsVisible = showToolbarActions;
727
+ this.changeDetectorRef.detectChanges();
728
+ }
729
+ }
730
+ }, { root: this.ionContentElement.nativeElement });
731
+ this.zone.runOutsideAngular(() => {
732
+ this.whenContentReady().then(() => {
733
+ if (this.header?.actionsElement?.nativeElement) this.stickyActionsIntersectionObserver.observe(this.header.actionsElement.nativeElement);
734
+ });
735
+ });
736
+ }
737
+ unobserveActions() {
738
+ if (this.header?.actionsElement) this.stickyActionsIntersectionObserver?.unobserve(this.header.actionsElement.nativeElement);
739
+ this.isObservingActions = false;
740
+ }
741
+ setActionButtonsWidth() {
742
+ if (!this.ionToolbarButtonsElement) return;
743
+ customElements.whenDefined(this.ionToolbarElement.nativeElement.localName).then(() => {
744
+ componentOnReady(this.ionToolbarElement.nativeElement, (toolbar) => {
745
+ let startButtonsWidth = 0;
746
+ let endButtonsWidth = 0;
747
+ this.ionToolbarButtonsElement.map((ionButtonsElementRef) => ionButtonsElementRef.nativeElement).forEach((ionButtonsElement) => {
748
+ const style = getComputedStyle(ionButtonsElement);
749
+ const margin = parseInt(style.marginLeft) + parseInt(style.marginRight);
750
+ if (ionButtonsElement.getAttribute("slot") === "start") startButtonsWidth += ionButtonsElement.offsetWidth + margin;
751
+ else endButtonsWidth += ionButtonsElement.offsetWidth + margin;
752
+ });
753
+ const actionButtonsMaxWidth = Math.max(startButtonsWidth, endButtonsWidth);
754
+ this.renderer.setStyle(toolbar, "--action-buttons-width", `${actionButtonsMaxWidth}px`, RendererStyleFlags2.DashCase);
755
+ });
756
+ });
757
+ }
758
+ initializeContent() {
759
+ this.customContent.forEach((content) => {
760
+ if (content.isFixed) this.fixedContentTemplate = content.template;
761
+ else this.customContentTemplate = content.template;
762
+ });
763
+ }
764
+ initializeStickyContent() {
765
+ this.stickyContentTemplate = this.stickyContentRef;
766
+ }
767
+ createStickyContentIntersectionObserver() {
768
+ const options = {
769
+ root: this.ionContentElement.nativeElement,
770
+ threshold: 1
771
+ };
772
+ const callback = (entries) => {
773
+ if (this.isStickyContentPinned !== !entries[0].isIntersecting) {
774
+ this.isStickyContentPinned = !this.isStickyContentPinned;
775
+ this.changeDetectorRef.detectChanges();
776
+ }
777
+ };
778
+ return new IntersectionObserver(callback, options);
779
+ }
780
+ getPathname(url) {
781
+ return url.split("?")[0];
782
+ }
783
+ _onKeyboardWillShow(info) {
784
+ if (info && info.keyboardHeight) this.ionContentElement.nativeElement.style.setProperty("--keyboard-offset", `${info.keyboardHeight}px`);
785
+ }
786
+ _onKeyboardWillHide() {
787
+ this.ionContentElement.nativeElement.style.setProperty("--keyboard-offset", "0px");
788
+ }
789
+ _onSelectedTabClick() {
790
+ if (this.content) this.content.scrollToTop(KirbyAnimation.Duration.LONG);
791
+ }
792
+ static {
793
+ this.ɵfac = i0.ɵɵngDeclareFactory({
794
+ minVersion: "12.0.0",
795
+ version: "22.2.2",
796
+ ngImport: i0,
797
+ type: PageComponent,
798
+ deps: [
799
+ { token: i0.ElementRef },
800
+ { token: i0.Injector },
801
+ { token: i0.Renderer2 },
802
+ { token: i2.Router },
803
+ { token: i0.ChangeDetectorRef },
804
+ { token: i0.NgZone },
805
+ { token: i1.ModalNavigationService },
806
+ { token: i3.ResizeObserverService },
807
+ {
808
+ token: i4.TabsComponent,
809
+ optional: true,
810
+ skipSelf: true
811
+ },
812
+ {
813
+ token: PAGE_BACK_BUTTON_OVERRIDE,
814
+ optional: true
815
+ },
816
+ {
817
+ token: i5.IonRouterOutlet,
818
+ optional: true
819
+ },
820
+ {
821
+ token: i5.NavController,
822
+ optional: true
823
+ },
824
+ { token: i6.IonicElementPartHelper },
825
+ { token: i3.TranslationService },
826
+ { token: i7.Title }
827
+ ],
828
+ target: i0.ɵɵFactoryTarget.Component
829
+ });
830
+ }
831
+ static {
832
+ this.ɵcmp = i0.ɵɵngDeclareComponent({
833
+ minVersion: "17.0.0",
834
+ version: "22.2.2",
835
+ type: PageComponent,
836
+ isStandalone: true,
837
+ selector: "kirby-page",
838
+ inputs: {
839
+ title: "title",
840
+ subtitle: "subtitle",
841
+ toolbarTitle: "toolbarTitle",
842
+ titleAlignment: "titleAlignment",
843
+ defaultBackHref: "defaultBackHref",
844
+ hideBackButton: "hideBackButton",
845
+ titleMaxLines: "titleMaxLines",
846
+ hasInteractiveTitle: "hasInteractiveTitle",
847
+ maxWidth: "maxWidth",
848
+ tabBarBottomHidden: "tabBarBottomHidden"
849
+ },
850
+ outputs: {
851
+ enter: "enter",
852
+ leave: "leave",
853
+ refresh: "refresh",
854
+ backButtonClick: "backButtonClick",
855
+ toolbarTitleClick: "toolbarTitleClick"
856
+ },
857
+ host: { listeners: {
858
+ "window:keyboardWillShow": "_onKeyboardWillShow($event)",
859
+ "window:keyboardWillHide": "_onKeyboardWillHide()",
860
+ "window:kirbySelectedTabClick": "_onSelectedTabClick()"
861
+ } },
862
+ providers: [IonicElementPartHelper],
863
+ queries: [
864
+ {
865
+ propertyName: "customToolbarTitleTemplate",
866
+ first: true,
867
+ predicate: PageToolbarTitleDirective,
868
+ descendants: true,
869
+ read: TemplateRef
870
+ },
871
+ {
872
+ propertyName: "customTitleTemplate",
873
+ first: true,
874
+ predicate: PageTitleDirective,
875
+ descendants: true,
876
+ read: TemplateRef
877
+ },
878
+ {
879
+ propertyName: "customSubtitleTemplate",
880
+ first: true,
881
+ predicate: PageSubtitleDirective,
882
+ descendants: true,
883
+ read: TemplateRef
884
+ },
885
+ {
886
+ propertyName: "stickyContentRef",
887
+ first: true,
888
+ predicate: PageStickyContentDirective,
889
+ descendants: true,
890
+ read: TemplateRef
891
+ },
892
+ {
893
+ propertyName: "header",
894
+ first: true,
895
+ predicate: HeaderComponent,
896
+ descendants: true
897
+ },
898
+ {
899
+ propertyName: "customActions",
900
+ predicate: PageActionsDirective
901
+ },
902
+ {
903
+ propertyName: "customContent",
904
+ predicate: PageContentDirective
905
+ }
906
+ ],
907
+ viewQueries: [
908
+ {
909
+ propertyName: "content",
910
+ first: true,
911
+ predicate: IonContent,
912
+ descendants: true,
913
+ static: true
914
+ },
915
+ {
916
+ propertyName: "ionContentElement",
917
+ first: true,
918
+ predicate: IonContent,
919
+ descendants: true,
920
+ read: ElementRef,
921
+ static: true
922
+ },
923
+ {
924
+ propertyName: "ionHeaderElement",
925
+ first: true,
926
+ predicate: IonHeader,
927
+ descendants: true,
928
+ read: ElementRef,
929
+ static: true
930
+ },
931
+ {
932
+ propertyName: "ionFooterElement",
933
+ first: true,
934
+ predicate: IonFooter,
935
+ descendants: true,
936
+ read: ElementRef,
937
+ static: true
938
+ },
939
+ {
940
+ propertyName: "ionToolbarElement",
941
+ first: true,
942
+ predicate: IonToolbar,
943
+ descendants: true,
944
+ read: ElementRef,
945
+ static: true
946
+ },
947
+ {
948
+ propertyName: "backButton",
949
+ first: true,
950
+ predicate: IonBackButton,
951
+ descendants: true
952
+ },
953
+ {
954
+ propertyName: "pageTitle",
955
+ first: true,
956
+ predicate: ["pageTitle"],
957
+ descendants: true,
958
+ read: ElementRef
959
+ },
960
+ {
961
+ propertyName: "stickyContentContainer",
962
+ first: true,
963
+ predicate: ["stickyContentContainer"],
964
+ descendants: true,
965
+ read: ElementRef
966
+ },
967
+ {
968
+ propertyName: "simpleTitleTemplate",
969
+ first: true,
970
+ predicate: ["simpleTitleTemplate"],
971
+ descendants: true,
972
+ read: TemplateRef,
973
+ static: true
974
+ },
975
+ {
976
+ propertyName: "simpleToolbarTitleTemplate",
977
+ first: true,
978
+ predicate: ["simpleToolbarTitleTemplate"],
979
+ descendants: true,
980
+ read: TemplateRef,
981
+ static: true
982
+ },
983
+ {
984
+ propertyName: "ionToolbarButtonsElement",
985
+ predicate: IonButtons,
986
+ descendants: true,
987
+ read: ElementRef
988
+ }
989
+ ],
990
+ usesOnChanges: true,
991
+ ngImport: i0,
992
+ template: "<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",
993
+ styles: [".kirby-line-clamp{display:-webkit-box;-webkit-line-clamp:var(--line-clamp, none);-webkit-box-orient:vertical;overflow:hidden}ion-header,ion-toolbar{box-sizing:border-box;--background: var(--kirby-color-fill-base)}ion-title h1{font-size:min(var(--kirby-font-size-m),21.6px)}ion-toolbar{--border-width: 0 !important;--padding-start: var(--kirby-spacing-s);--padding-end: var(--kirby-spacing-s);--padding-top: 0;--padding-bottom: 0;--ion-toolbar-color: var(--kirby-color-content-base);--min-height: var(--kirby-spacing-xxxl)}@media(min-width:768px){ion-toolbar{--padding-start: var(--kirby-spacing-m);--padding-end: var(--kirby-spacing-m);--min-height: var(--kirby-spacing-xxxxxl)}}ion-toolbar:before{content:\"\";position:absolute;left:0;right:0;bottom:0;height:1px}ion-toolbar:before,ion-toolbar::part(background){transition:background-color 50ms linear}ion-toolbar.content-scrolled{--background: var(--kirby-color-fill-base-hover)}ion-toolbar.content-scrolled:before,ion-toolbar.content-scrolled::part(background){transition-duration:var(--kirby-transition-duration-quick)}ion-toolbar.content-scrolled:not(.content-pinned):before{background-color:var(--kirby-color-border-base-silent)}ion-toolbar.content-pinned:before{transition:none}ion-toolbar ion-buttons[slot=start]{margin-right:var(--kirby-spacing-xxs)}ion-toolbar ion-buttons[slot=primary],ion-toolbar ion-buttons[slot=secondary]{margin-left:var(--kirby-spacing-xxs)}ion-toolbar ion-buttons[slot=secondary]{order:6}ion-toolbar ion-title{box-sizing:border-box;font-size:var(--kirby-font-size-n);font-weight:var(--kirby-font-weight-normal);padding-inline:calc(var(--action-buttons-width, var(--kirby-spacing-xl)var(--kirby-spacing-xxs)) + var(--padding-start))}ion-toolbar ion-title h1{margin-bottom:0}ion-toolbar ion-title.slide-and-fade-in .toolbar-title{scale:1;transform:translateY(0)}ion-toolbar ion-title .toolbar-title,ion-toolbar ion-title .toolbar-title>span.has-icon>span{text-overflow:ellipsis;white-space:nowrap;pointer-events:auto;overflow:hidden}ion-toolbar ion-title .toolbar-title{display:flex;align-items:center;justify-content:center;min-height:var(--kirby-spacing-xxxl);scale:0;transition-property:opacity,transform;transition-duration:.15s;transition-timing-function:var(--kirby-transition-easing-enter-exit);transform:translateY(10px)}ion-toolbar ion-title .toolbar-title span.clickable{cursor:pointer}ion-toolbar ion-title .toolbar-title span.has-icon{display:inline-flex;flex-direction:row;align-items:center;justify-content:center;max-width:100%}ion-toolbar ion-title .toolbar-title ::ng-deep>*{text-overflow:ellipsis;white-space:nowrap;pointer-events:auto;overflow:hidden}.hide{visibility:hidden;opacity:0;transition:opacity .1s linear}.hide.fade-in{visibility:inherit;opacity:1}ion-back-button{--color: var(--kirby-color-content-raised);--color-hover: var(--kirby-color-content-raised-hover);--color-focused: var(--kirby-color-content-raised-hover);--background: var(--kirby-color-fill-raised);--background-hover: var(--kirby-color-fill-raised-hover);--background-hover-opacity: 1;--background-focused: var(--kirby-color-fill-raised-hover);--background-focused-opacity: 1;--icon-font-size: 24px;height:var(--kirby-spacing-xl);width:var(--kirby-spacing-xl);opacity:1}ion-back-button:active,ion-back-button.ion-activated{--background: var(--kirby-color-fill-raised-active);--color: var(--kirby-color-content-raised-active)}ion-back-button::part(icon){margin-inline:0}ion-back-button::part(native){opacity:1;border:1px solid var(--kirby-color-border-raised-quiet);border-radius:var(--kirby-border-radius-pill);overflow:hidden}@media(hover:hover){ion-back-button:hover::part(native){border-color:var(--kirby-color-border-raised-quiet-hover)}}ion-back-button:active::part(native),ion-back-button.ion-activated::part(native){border-color:var(--kirby-color-border-raised-quiet-active)}ion-back-button:focus-visible::part(native){transition:all 80ms linear 0ms;box-shadow:var(--kirby-focus-ring-md-inset)}.page-header-container{max-width:var(--page-content-max-width, var(--kirby-page-content-max-width-default));margin:0 auto}.page-header{margin-left:var(--kirby-spacing-s);margin-top:var(--kirby-spacing-xxs);margin-bottom:var(--kirby-page-title-margin-bottom, var(--kirby-spacing-xl))}.page-header .page-title.has-actions{display:flex;justify-content:space-between;align-items:flex-start}.page-header .page-title h1,.page-header .page-title h2,.page-header .page-title h3,.page-header .page-title h4,.page-header .page-title h5,.page-header .page-title h6{margin:0}.page-header .page-subtitle{margin-top:var(--kirby-spacing-xxs)}.page-header.text-center{text-align:center;margin-left:0}.page-header.text-right{text-align:right}ion-content{--padding-top: var(--kirby-spacing-xs);--padding-start: var( --page-content-padding-start, calc(var(--kirby-spacing-s) + var(--ion-safe-area-left)) );--padding-end: var(--page-content-padding-end, var(--kirby-spacing-s));--background: var(--kirby-color-fill-base);--color: var(--kirby-color-content-base)}@media(min-width:768px){ion-content{--padding-start: var(--page-content-padding-start, var(--kirby-spacing-xxl));--padding-end: var(--page-content-padding-end, var(--kirby-spacing-xxl))}}ion-content.has-header{--padding-top: 0}ion-content.max-width-lg{--page-content-max-width: var(--kirby-page-content-max-width-lg)}ion-content.max-width-xl{--page-content-max-width: var(--kirby-page-content-max-width-xl)}ion-content.max-width-full{--page-content-max-width: var(--kirby-page-content-max-width-full)}ion-content::part(scroll){scrollbar-gutter:stable}ion-content .content-inner{max-width:var(--page-content-max-width, var(--kirby-page-content-max-width-default));margin:0 auto;padding-bottom:var(--kirby-spacing-xl);transform:translateZ(0);will-change:transform}ion-content .fixed-content{width:100%;position:absolute;bottom:0;transform:initial}ion-content .fixed-content .content-inner{position:relative}.sticky-content-container{position:sticky;top:calc(-1 * var(--kirby-spacing-xs) - 1px);left:0;right:0;padding-top:1px;margin-block-end:var(--kirby-spacing-m);z-index:var(--kirby-z-index-sticky-content)}.sticky-content-container div{max-width:var(--page-content-max-width, var(--kirby-page-content-max-width-default));margin:0 auto}.sticky-content-container:before,.sticky-content-container:after{content:\"\";position:absolute;left:calc(-1 * var(--padding-start));right:calc(-1 * var(--padding-end));bottom:0}.sticky-content-container:before{top:0;background-color:var(--background)}.sticky-content-container:after{height:1px}.sticky-content-container.content-pinned:before{background-color:var(--kirby-color-fill-base-hover)}.sticky-content-container.content-pinned:after{background-color:var(--kirby-color-border-base-silent)}\n"],
994
+ dependencies: [
995
+ {
996
+ kind: "component",
997
+ type: IonHeader,
998
+ selector: "ion-header",
999
+ inputs: [
1000
+ "collapse",
1001
+ "mode",
1002
+ "translucent"
1003
+ ]
1004
+ },
1005
+ {
1006
+ kind: "component",
1007
+ type: IonToolbar,
1008
+ selector: "ion-toolbar",
1009
+ inputs: ["color", "mode"]
1010
+ },
1011
+ {
1012
+ kind: "component",
1013
+ type: IonButtons,
1014
+ selector: "ion-buttons",
1015
+ inputs: ["collapse"]
1016
+ },
1017
+ {
1018
+ kind: "component",
1019
+ type: IonBackButton,
1020
+ selector: "ion-back-button"
1021
+ },
1022
+ {
1023
+ kind: "component",
1024
+ type: IonTitle,
1025
+ selector: "ion-title",
1026
+ inputs: ["color", "size"]
1027
+ },
1028
+ {
1029
+ kind: "directive",
1030
+ type: NgTemplateOutlet,
1031
+ selector: "[ngTemplateOutlet]",
1032
+ inputs: [
1033
+ "ngTemplateOutletContext",
1034
+ "ngTemplateOutlet",
1035
+ "ngTemplateOutletInjector"
1036
+ ]
1037
+ },
1038
+ {
1039
+ kind: "component",
1040
+ type: IonContent,
1041
+ selector: "ion-content",
1042
+ inputs: [
1043
+ "color",
1044
+ "fixedSlotPlacement",
1045
+ "forceOverscroll",
1046
+ "fullscreen",
1047
+ "scrollEvents",
1048
+ "scrollX",
1049
+ "scrollY"
1050
+ ],
1051
+ outputs: [
1052
+ "ionScrollStart",
1053
+ "ionScroll",
1054
+ "ionScrollEnd"
1055
+ ]
1056
+ },
1057
+ {
1058
+ kind: "component",
1059
+ type: IonRefresher,
1060
+ selector: "ion-refresher",
1061
+ inputs: [
1062
+ "closeDuration",
1063
+ "disabled",
1064
+ "mode",
1065
+ "pullFactor",
1066
+ "pullMax",
1067
+ "pullMin",
1068
+ "snapbackDuration"
1069
+ ],
1070
+ outputs: [
1071
+ "ionRefresh",
1072
+ "ionPull",
1073
+ "ionStart",
1074
+ "ionPullStart",
1075
+ "ionPullEnd"
1076
+ ]
1077
+ },
1078
+ {
1079
+ kind: "component",
1080
+ type: SpinnerComponent,
1081
+ selector: "kirby-spinner"
1082
+ },
1083
+ {
1084
+ kind: "directive",
1085
+ type: NgClass,
1086
+ selector: "[ngClass]",
1087
+ inputs: ["class", "ngClass"]
1088
+ },
1089
+ {
1090
+ kind: "component",
1091
+ type: IonFooter,
1092
+ selector: "ion-footer",
1093
+ inputs: [
1094
+ "collapse",
1095
+ "mode",
1096
+ "translucent"
1097
+ ]
1098
+ },
1099
+ {
1100
+ kind: "directive",
1101
+ type: FitHeadingDirective,
1102
+ selector: "h1[kirbyFitHeading],h2[kirbyFitHeading],h3[kirbyFitHeading],[kirbyFitHeading]",
1103
+ inputs: ["kirbyFitHeading"]
1104
+ }
1105
+ ],
1106
+ changeDetection: i0.ChangeDetectionStrategy.OnPush
1107
+ });
1108
+ }
1109
+ };
1110
+ i0.ɵɵngDeclareClassMetadata({
1111
+ minVersion: "12.0.0",
1112
+ version: "22.2.2",
1113
+ ngImport: i0,
1114
+ type: PageComponent,
1115
+ decorators: [{
1116
+ type: Component,
1117
+ args: [{
1118
+ selector: "kirby-page",
1119
+ changeDetection: ChangeDetectionStrategy.OnPush,
1120
+ providers: [IonicElementPartHelper],
1121
+ imports: [
1122
+ IonHeader,
1123
+ IonToolbar,
1124
+ IonButtons,
1125
+ IonBackButton,
1126
+ IonTitle,
1127
+ NgTemplateOutlet,
1128
+ IonContent,
1129
+ IonRefresher,
1130
+ SpinnerComponent,
1131
+ NgClass,
1132
+ IonFooter,
1133
+ FitHeadingDirective
1134
+ ],
1135
+ template: "<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",
1136
+ styles: [".kirby-line-clamp{display:-webkit-box;-webkit-line-clamp:var(--line-clamp, none);-webkit-box-orient:vertical;overflow:hidden}ion-header,ion-toolbar{box-sizing:border-box;--background: var(--kirby-color-fill-base)}ion-title h1{font-size:min(var(--kirby-font-size-m),21.6px)}ion-toolbar{--border-width: 0 !important;--padding-start: var(--kirby-spacing-s);--padding-end: var(--kirby-spacing-s);--padding-top: 0;--padding-bottom: 0;--ion-toolbar-color: var(--kirby-color-content-base);--min-height: var(--kirby-spacing-xxxl)}@media(min-width:768px){ion-toolbar{--padding-start: var(--kirby-spacing-m);--padding-end: var(--kirby-spacing-m);--min-height: var(--kirby-spacing-xxxxxl)}}ion-toolbar:before{content:\"\";position:absolute;left:0;right:0;bottom:0;height:1px}ion-toolbar:before,ion-toolbar::part(background){transition:background-color 50ms linear}ion-toolbar.content-scrolled{--background: var(--kirby-color-fill-base-hover)}ion-toolbar.content-scrolled:before,ion-toolbar.content-scrolled::part(background){transition-duration:var(--kirby-transition-duration-quick)}ion-toolbar.content-scrolled:not(.content-pinned):before{background-color:var(--kirby-color-border-base-silent)}ion-toolbar.content-pinned:before{transition:none}ion-toolbar ion-buttons[slot=start]{margin-right:var(--kirby-spacing-xxs)}ion-toolbar ion-buttons[slot=primary],ion-toolbar ion-buttons[slot=secondary]{margin-left:var(--kirby-spacing-xxs)}ion-toolbar ion-buttons[slot=secondary]{order:6}ion-toolbar ion-title{box-sizing:border-box;font-size:var(--kirby-font-size-n);font-weight:var(--kirby-font-weight-normal);padding-inline:calc(var(--action-buttons-width, var(--kirby-spacing-xl)var(--kirby-spacing-xxs)) + var(--padding-start))}ion-toolbar ion-title h1{margin-bottom:0}ion-toolbar ion-title.slide-and-fade-in .toolbar-title{scale:1;transform:translateY(0)}ion-toolbar ion-title .toolbar-title,ion-toolbar ion-title .toolbar-title>span.has-icon>span{text-overflow:ellipsis;white-space:nowrap;pointer-events:auto;overflow:hidden}ion-toolbar ion-title .toolbar-title{display:flex;align-items:center;justify-content:center;min-height:var(--kirby-spacing-xxxl);scale:0;transition-property:opacity,transform;transition-duration:.15s;transition-timing-function:var(--kirby-transition-easing-enter-exit);transform:translateY(10px)}ion-toolbar ion-title .toolbar-title span.clickable{cursor:pointer}ion-toolbar ion-title .toolbar-title span.has-icon{display:inline-flex;flex-direction:row;align-items:center;justify-content:center;max-width:100%}ion-toolbar ion-title .toolbar-title ::ng-deep>*{text-overflow:ellipsis;white-space:nowrap;pointer-events:auto;overflow:hidden}.hide{visibility:hidden;opacity:0;transition:opacity .1s linear}.hide.fade-in{visibility:inherit;opacity:1}ion-back-button{--color: var(--kirby-color-content-raised);--color-hover: var(--kirby-color-content-raised-hover);--color-focused: var(--kirby-color-content-raised-hover);--background: var(--kirby-color-fill-raised);--background-hover: var(--kirby-color-fill-raised-hover);--background-hover-opacity: 1;--background-focused: var(--kirby-color-fill-raised-hover);--background-focused-opacity: 1;--icon-font-size: 24px;height:var(--kirby-spacing-xl);width:var(--kirby-spacing-xl);opacity:1}ion-back-button:active,ion-back-button.ion-activated{--background: var(--kirby-color-fill-raised-active);--color: var(--kirby-color-content-raised-active)}ion-back-button::part(icon){margin-inline:0}ion-back-button::part(native){opacity:1;border:1px solid var(--kirby-color-border-raised-quiet);border-radius:var(--kirby-border-radius-pill);overflow:hidden}@media(hover:hover){ion-back-button:hover::part(native){border-color:var(--kirby-color-border-raised-quiet-hover)}}ion-back-button:active::part(native),ion-back-button.ion-activated::part(native){border-color:var(--kirby-color-border-raised-quiet-active)}ion-back-button:focus-visible::part(native){transition:all 80ms linear 0ms;box-shadow:var(--kirby-focus-ring-md-inset)}.page-header-container{max-width:var(--page-content-max-width, var(--kirby-page-content-max-width-default));margin:0 auto}.page-header{margin-left:var(--kirby-spacing-s);margin-top:var(--kirby-spacing-xxs);margin-bottom:var(--kirby-page-title-margin-bottom, var(--kirby-spacing-xl))}.page-header .page-title.has-actions{display:flex;justify-content:space-between;align-items:flex-start}.page-header .page-title h1,.page-header .page-title h2,.page-header .page-title h3,.page-header .page-title h4,.page-header .page-title h5,.page-header .page-title h6{margin:0}.page-header .page-subtitle{margin-top:var(--kirby-spacing-xxs)}.page-header.text-center{text-align:center;margin-left:0}.page-header.text-right{text-align:right}ion-content{--padding-top: var(--kirby-spacing-xs);--padding-start: var( --page-content-padding-start, calc(var(--kirby-spacing-s) + var(--ion-safe-area-left)) );--padding-end: var(--page-content-padding-end, var(--kirby-spacing-s));--background: var(--kirby-color-fill-base);--color: var(--kirby-color-content-base)}@media(min-width:768px){ion-content{--padding-start: var(--page-content-padding-start, var(--kirby-spacing-xxl));--padding-end: var(--page-content-padding-end, var(--kirby-spacing-xxl))}}ion-content.has-header{--padding-top: 0}ion-content.max-width-lg{--page-content-max-width: var(--kirby-page-content-max-width-lg)}ion-content.max-width-xl{--page-content-max-width: var(--kirby-page-content-max-width-xl)}ion-content.max-width-full{--page-content-max-width: var(--kirby-page-content-max-width-full)}ion-content::part(scroll){scrollbar-gutter:stable}ion-content .content-inner{max-width:var(--page-content-max-width, var(--kirby-page-content-max-width-default));margin:0 auto;padding-bottom:var(--kirby-spacing-xl);transform:translateZ(0);will-change:transform}ion-content .fixed-content{width:100%;position:absolute;bottom:0;transform:initial}ion-content .fixed-content .content-inner{position:relative}.sticky-content-container{position:sticky;top:calc(-1 * var(--kirby-spacing-xs) - 1px);left:0;right:0;padding-top:1px;margin-block-end:var(--kirby-spacing-m);z-index:var(--kirby-z-index-sticky-content)}.sticky-content-container div{max-width:var(--page-content-max-width, var(--kirby-page-content-max-width-default));margin:0 auto}.sticky-content-container:before,.sticky-content-container:after{content:\"\";position:absolute;left:calc(-1 * var(--padding-start));right:calc(-1 * var(--padding-end));bottom:0}.sticky-content-container:before{top:0;background-color:var(--background)}.sticky-content-container:after{height:1px}.sticky-content-container.content-pinned:before{background-color:var(--kirby-color-fill-base-hover)}.sticky-content-container.content-pinned:after{background-color:var(--kirby-color-border-base-silent)}\n"]
1137
+ }]
1138
+ }],
1139
+ ctorParameters: () => [
1140
+ { type: i0.ElementRef },
1141
+ { type: i0.Injector },
1142
+ { type: i0.Renderer2 },
1143
+ { type: i2.Router },
1144
+ { type: i0.ChangeDetectorRef },
1145
+ { type: i0.NgZone },
1146
+ { type: i1.ModalNavigationService },
1147
+ { type: i3.ResizeObserverService },
1148
+ {
1149
+ type: i4.TabsComponent,
1150
+ decorators: [{ type: Optional }, { type: SkipSelf }]
1151
+ },
1152
+ {
1153
+ type: void 0,
1154
+ decorators: [{ type: Optional }, {
1155
+ type: Inject,
1156
+ args: [PAGE_BACK_BUTTON_OVERRIDE]
1157
+ }]
1158
+ },
1159
+ {
1160
+ type: i5.IonRouterOutlet,
1161
+ decorators: [{ type: Optional }]
1162
+ },
1163
+ {
1164
+ type: i5.NavController,
1165
+ decorators: [{ type: Optional }]
1166
+ },
1167
+ { type: i6.IonicElementPartHelper },
1168
+ { type: i3.TranslationService },
1169
+ { type: i7.Title }
1170
+ ],
1171
+ propDecorators: {
1172
+ title: [{ type: Input }],
1173
+ subtitle: [{ type: Input }],
1174
+ toolbarTitle: [{ type: Input }],
1175
+ titleAlignment: [{ type: Input }],
1176
+ defaultBackHref: [{ type: Input }],
1177
+ hideBackButton: [{ type: Input }],
1178
+ titleMaxLines: [{ type: Input }],
1179
+ hasInteractiveTitle: [{ type: Input }],
1180
+ maxWidth: [{ type: Input }],
1181
+ tabBarBottomHidden: [{ type: Input }],
1182
+ enter: [{ type: Output }],
1183
+ leave: [{ type: Output }],
1184
+ refresh: [{ type: Output }],
1185
+ backButtonClick: [{ type: Output }],
1186
+ toolbarTitleClick: [{ type: Output }],
1187
+ content: [{
1188
+ type: ViewChild,
1189
+ args: [IonContent, { static: true }]
1190
+ }],
1191
+ ionContentElement: [{
1192
+ type: ViewChild,
1193
+ args: [IonContent, {
1194
+ static: true,
1195
+ read: ElementRef
1196
+ }]
1197
+ }],
1198
+ ionHeaderElement: [{
1199
+ type: ViewChild,
1200
+ args: [IonHeader, {
1201
+ static: true,
1202
+ read: ElementRef
1203
+ }]
1204
+ }],
1205
+ ionFooterElement: [{
1206
+ type: ViewChild,
1207
+ args: [IonFooter, {
1208
+ static: true,
1209
+ read: ElementRef
1210
+ }]
1211
+ }],
1212
+ ionToolbarElement: [{
1213
+ type: ViewChild,
1214
+ args: [IonToolbar, {
1215
+ static: true,
1216
+ read: ElementRef
1217
+ }]
1218
+ }],
1219
+ ionToolbarButtonsElement: [{
1220
+ type: ViewChildren,
1221
+ args: [IonButtons, { read: ElementRef }]
1222
+ }],
1223
+ backButton: [{
1224
+ type: ViewChild,
1225
+ args: [IonBackButton, { static: false }]
1226
+ }],
1227
+ pageTitle: [{
1228
+ type: ViewChild,
1229
+ args: ["pageTitle", {
1230
+ static: false,
1231
+ read: ElementRef
1232
+ }]
1233
+ }],
1234
+ stickyContentContainer: [{
1235
+ type: ViewChild,
1236
+ args: ["stickyContentContainer", {
1237
+ static: false,
1238
+ read: ElementRef
1239
+ }]
1240
+ }],
1241
+ simpleTitleTemplate: [{
1242
+ type: ViewChild,
1243
+ args: ["simpleTitleTemplate", {
1244
+ static: true,
1245
+ read: TemplateRef
1246
+ }]
1247
+ }],
1248
+ simpleToolbarTitleTemplate: [{
1249
+ type: ViewChild,
1250
+ args: ["simpleToolbarTitleTemplate", {
1251
+ static: true,
1252
+ read: TemplateRef
1253
+ }]
1254
+ }],
1255
+ customToolbarTitleTemplate: [{
1256
+ type: ContentChild,
1257
+ args: [PageToolbarTitleDirective, {
1258
+ static: false,
1259
+ read: TemplateRef
1260
+ }]
1261
+ }],
1262
+ customTitleTemplate: [{
1263
+ type: ContentChild,
1264
+ args: [PageTitleDirective, {
1265
+ static: false,
1266
+ read: TemplateRef
1267
+ }]
1268
+ }],
1269
+ customSubtitleTemplate: [{
1270
+ type: ContentChild,
1271
+ args: [PageSubtitleDirective, {
1272
+ static: false,
1273
+ read: TemplateRef
1274
+ }]
1275
+ }],
1276
+ customActions: [{
1277
+ type: ContentChildren,
1278
+ args: [PageActionsDirective]
1279
+ }],
1280
+ customContent: [{
1281
+ type: ContentChildren,
1282
+ args: [PageContentDirective]
1283
+ }],
1284
+ stickyContentRef: [{
1285
+ type: ContentChild,
1286
+ args: [PageStickyContentDirective, {
1287
+ static: false,
1288
+ read: TemplateRef
1289
+ }]
1290
+ }],
1291
+ header: [{
1292
+ type: ContentChild,
1293
+ args: [HeaderComponent]
1294
+ }],
1295
+ _onKeyboardWillShow: [{
1296
+ type: HostListener,
1297
+ args: ["window:keyboardWillShow", ["$event"]]
1298
+ }],
1299
+ _onKeyboardWillHide: [{
1300
+ type: HostListener,
1301
+ args: ["window:keyboardWillHide"]
1302
+ }],
1303
+ _onSelectedTabClick: [{
1304
+ type: HostListener,
1305
+ args: [`window:${selectedTabClickEvent}`]
1306
+ }]
1307
+ }
1308
+ });
1309
+ var PageFooterComponent = class PageFooterComponent {
1310
+ constructor(pageComponent, hostElement, renderer) {
1311
+ this.pageComponent = pageComponent;
1312
+ this.hostElement = hostElement;
1313
+ this.renderer = renderer;
1314
+ this.hasPadding = true;
1315
+ if (!pageComponent) throw new Error("Page footer must reside inside of a Kirby page");
1316
+ }
1317
+ close() {
1318
+ this.pageComponent.tabBarBottomHidden = false;
1319
+ this.renderer.removeChild(this.hostElement.nativeElement.parentElement, this.hostElement.nativeElement, true);
1320
+ }
1321
+ ngOnDestroy() {
1322
+ this.pageComponent.tabBarBottomHidden = false;
1323
+ }
1324
+ static {
1325
+ this.ɵfac = i0.ɵɵngDeclareFactory({
1326
+ minVersion: "12.0.0",
1327
+ version: "22.2.2",
1328
+ ngImport: i0,
1329
+ type: PageFooterComponent,
1330
+ deps: [
1331
+ {
1332
+ token: PageComponent,
1333
+ optional: true,
1334
+ skipSelf: true
1335
+ },
1336
+ { token: i0.ElementRef },
1337
+ { token: i0.Renderer2 }
1338
+ ],
1339
+ target: i0.ɵɵFactoryTarget.Component
1340
+ });
1341
+ }
1342
+ static {
1343
+ this.ɵcmp = i0.ɵɵngDeclareComponent({
1344
+ minVersion: "14.0.0",
1345
+ version: "22.2.2",
1346
+ type: PageFooterComponent,
1347
+ isStandalone: true,
1348
+ selector: "kirby-page-footer",
1349
+ inputs: { hasPadding: "hasPadding" },
1350
+ ngImport: i0,
1351
+ template: "<div class=\"wrapper kirby-surface-raised\" [class.padding]=\"hasPadding\">\n <ng-content></ng-content>\n</div>\n",
1352
+ styles: [".kirby-line-clamp{display:-webkit-box;-webkit-line-clamp:var(--line-clamp, none);-webkit-box-orient:vertical;overflow:hidden}ion-item-option.success{background-color:var(--kirby-color-fill-success);color:var(--kirby-color-content-success)}@media(hover:hover){ion-item-option.success:hover{background-color:var(--kirby-color-fill-success-hover);color:var(--kirby-color-content-success-hover)}}ion-item-option.success:active{background-color:var(--kirby-color-fill-success-active);color:var(--kirby-color-content-success-active)}ion-item-option.warning{background-color:var(--kirby-color-fill-warning);color:var(--kirby-color-content-warning)}@media(hover:hover){ion-item-option.warning:hover{background-color:var(--kirby-color-fill-warning-hover);color:var(--kirby-color-content-warning-hover)}}ion-item-option.warning:active{background-color:var(--kirby-color-fill-warning-active);color:var(--kirby-color-content-warning-active)}ion-item-option.danger{background-color:var(--kirby-color-fill-danger);color:var(--kirby-color-content-danger)}@media(hover:hover){ion-item-option.danger:hover{background-color:var(--kirby-color-fill-danger-hover);color:var(--kirby-color-content-danger-hover)}}ion-item-option.danger:active{background-color:var(--kirby-color-fill-danger-active);color:var(--kirby-color-content-danger-active)}:host{display:block;background-color:var(--kirby-color-fill-raised);--kirby-inputs-background-color: var(--kirby-dark-overlay);--kirby-inputs-background-color-hover: var(--kirby-dark-overlay-10);--kirby-inputs-background-color-active: var(--kirby-dark-overlay-20);--kirby-inputs-color: var(--kirby-black);--kirby-inputs-indicator-background-color: var(--kirby-black);--kirby-inputs-indicator-color: var(--kirby-white);--kirby-inputs-placeholder-color: var(--kirby-semi-dark);--kirby-inputs-color-hover: var(--kirby-semi-dark);--kirby-inputs-elevation: none;--kirby-divider-color: var(--kirby-background-color)}:host .wrapper{position:relative;max-width:var(--page-content-max-width, var(--kirby-page-content-max-width-default));margin:0 auto;padding-bottom:var(--kirby-page-footer-safe-area-bottom, var(--kirby-safe-area-bottom))}:host .wrapper.padding{padding:var(--kirby-spacing-xxs) var(--kirby-spacing-s);padding-bottom:calc(var(--kirby-spacing-xxs) + var(--kirby-page-footer-safe-area-bottom, var(--kirby-safe-area-bottom)))}\n"],
1353
+ changeDetection: i0.ChangeDetectionStrategy.OnPush
1354
+ });
1355
+ }
1356
+ };
1357
+ i0.ɵɵngDeclareClassMetadata({
1358
+ minVersion: "12.0.0",
1359
+ version: "22.2.2",
1360
+ ngImport: i0,
1361
+ type: PageFooterComponent,
1362
+ decorators: [{
1363
+ type: Component,
1364
+ args: [{
1365
+ selector: "kirby-page-footer",
1366
+ changeDetection: ChangeDetectionStrategy.OnPush,
1367
+ template: "<div class=\"wrapper kirby-surface-raised\" [class.padding]=\"hasPadding\">\n <ng-content></ng-content>\n</div>\n",
1368
+ styles: [".kirby-line-clamp{display:-webkit-box;-webkit-line-clamp:var(--line-clamp, none);-webkit-box-orient:vertical;overflow:hidden}ion-item-option.success{background-color:var(--kirby-color-fill-success);color:var(--kirby-color-content-success)}@media(hover:hover){ion-item-option.success:hover{background-color:var(--kirby-color-fill-success-hover);color:var(--kirby-color-content-success-hover)}}ion-item-option.success:active{background-color:var(--kirby-color-fill-success-active);color:var(--kirby-color-content-success-active)}ion-item-option.warning{background-color:var(--kirby-color-fill-warning);color:var(--kirby-color-content-warning)}@media(hover:hover){ion-item-option.warning:hover{background-color:var(--kirby-color-fill-warning-hover);color:var(--kirby-color-content-warning-hover)}}ion-item-option.warning:active{background-color:var(--kirby-color-fill-warning-active);color:var(--kirby-color-content-warning-active)}ion-item-option.danger{background-color:var(--kirby-color-fill-danger);color:var(--kirby-color-content-danger)}@media(hover:hover){ion-item-option.danger:hover{background-color:var(--kirby-color-fill-danger-hover);color:var(--kirby-color-content-danger-hover)}}ion-item-option.danger:active{background-color:var(--kirby-color-fill-danger-active);color:var(--kirby-color-content-danger-active)}:host{display:block;background-color:var(--kirby-color-fill-raised);--kirby-inputs-background-color: var(--kirby-dark-overlay);--kirby-inputs-background-color-hover: var(--kirby-dark-overlay-10);--kirby-inputs-background-color-active: var(--kirby-dark-overlay-20);--kirby-inputs-color: var(--kirby-black);--kirby-inputs-indicator-background-color: var(--kirby-black);--kirby-inputs-indicator-color: var(--kirby-white);--kirby-inputs-placeholder-color: var(--kirby-semi-dark);--kirby-inputs-color-hover: var(--kirby-semi-dark);--kirby-inputs-elevation: none;--kirby-divider-color: var(--kirby-background-color)}:host .wrapper{position:relative;max-width:var(--page-content-max-width, var(--kirby-page-content-max-width-default));margin:0 auto;padding-bottom:var(--kirby-page-footer-safe-area-bottom, var(--kirby-safe-area-bottom))}:host .wrapper.padding{padding:var(--kirby-spacing-xxs) var(--kirby-spacing-s);padding-bottom:calc(var(--kirby-spacing-xxs) + var(--kirby-page-footer-safe-area-bottom, var(--kirby-safe-area-bottom)))}\n"]
1369
+ }]
1370
+ }],
1371
+ ctorParameters: () => [
1372
+ {
1373
+ type: PageComponent,
1374
+ decorators: [{ type: Optional }, { type: SkipSelf }]
1375
+ },
1376
+ { type: i0.ElementRef },
1377
+ { type: i0.Renderer2 }
1378
+ ],
1379
+ propDecorators: { hasPadding: [{ type: Input }] }
1380
+ });
1381
+ var PageModule = class PageModule {
1382
+ static {
1383
+ this.ɵfac = i0.ɵɵngDeclareFactory({
1384
+ minVersion: "12.0.0",
1385
+ version: "22.2.2",
1386
+ ngImport: i0,
1387
+ type: PageModule,
1388
+ deps: [],
1389
+ target: i0.ɵɵFactoryTarget.NgModule
1390
+ });
1391
+ }
1392
+ static {
1393
+ this.ɵmod = i0.ɵɵngDeclareNgModule({
1394
+ minVersion: "14.0.0",
1395
+ version: "22.2.2",
1396
+ ngImport: i0,
1397
+ type: PageModule,
1398
+ imports: [
1399
+ CommonModule,
1400
+ FitHeadingDirective,
1401
+ SpinnerModule,
1402
+ HeaderModule,
1403
+ IonHeader,
1404
+ IonToolbar,
1405
+ IonButtons,
1406
+ IonBackButton,
1407
+ IonContent,
1408
+ IonTitle,
1409
+ IonRefresher,
1410
+ IonFooter,
1411
+ PageComponent,
1412
+ PageActionsComponent,
1413
+ PageActionsDirective,
1414
+ PageContentComponent,
1415
+ PageFooterComponent,
1416
+ PageContentDirective,
1417
+ PageProgressComponent,
1418
+ PageTitleComponent,
1419
+ PageTitleDirective,
1420
+ PageSubtitleDirective,
1421
+ PageToolbarTitleDirective,
1422
+ PageStickyContentDirective
1423
+ ],
1424
+ exports: [
1425
+ PageComponent,
1426
+ PageActionsComponent,
1427
+ PageActionsDirective,
1428
+ PageContentComponent,
1429
+ PageFooterComponent,
1430
+ PageContentDirective,
1431
+ PageProgressComponent,
1432
+ PageTitleComponent,
1433
+ PageTitleDirective,
1434
+ PageSubtitleDirective,
1435
+ PageToolbarTitleDirective,
1436
+ FitHeadingDirective,
1437
+ PageStickyContentDirective
1438
+ ]
1439
+ });
1440
+ }
1441
+ static {
1442
+ this.ɵinj = i0.ɵɵngDeclareInjector({
1443
+ minVersion: "12.0.0",
1444
+ version: "22.2.2",
1445
+ ngImport: i0,
1446
+ type: PageModule,
1447
+ imports: [
1448
+ CommonModule,
1449
+ SpinnerModule,
1450
+ HeaderModule,
1451
+ IonHeader,
1452
+ IonToolbar,
1453
+ IonButtons,
1454
+ IonBackButton,
1455
+ IonContent,
1456
+ IonTitle,
1457
+ IonRefresher,
1458
+ IonFooter,
1459
+ PageComponent
1460
+ ]
1461
+ });
1462
+ }
1463
+ };
1464
+ i0.ɵɵngDeclareClassMetadata({
1465
+ minVersion: "12.0.0",
1466
+ version: "22.2.2",
1467
+ ngImport: i0,
1468
+ type: PageModule,
1469
+ decorators: [{
1470
+ type: NgModule,
1471
+ args: [{
1472
+ imports: [
1473
+ CommonModule,
1474
+ FitHeadingDirective,
1475
+ SpinnerModule,
1476
+ HeaderModule,
1477
+ IonHeader,
1478
+ IonToolbar,
1479
+ IonButtons,
1480
+ IonBackButton,
1481
+ IonContent,
1482
+ IonTitle,
1483
+ IonRefresher,
1484
+ IonFooter,
1485
+ PageComponent,
1486
+ PageActionsComponent,
1487
+ PageActionsDirective,
1488
+ PageContentComponent,
1489
+ PageFooterComponent,
1490
+ PageContentDirective,
1491
+ PageProgressComponent,
1492
+ PageTitleComponent,
1493
+ PageTitleDirective,
1494
+ PageSubtitleDirective,
1495
+ PageToolbarTitleDirective,
1496
+ PageStickyContentDirective
1497
+ ],
1498
+ exports: [
1499
+ PageComponent,
1500
+ PageActionsComponent,
1501
+ PageActionsDirective,
1502
+ PageContentComponent,
1503
+ PageFooterComponent,
1504
+ PageContentDirective,
1505
+ PageProgressComponent,
1506
+ PageTitleComponent,
1507
+ PageTitleDirective,
1508
+ PageSubtitleDirective,
1509
+ PageToolbarTitleDirective,
1510
+ FitHeadingDirective,
1511
+ PageStickyContentDirective
1512
+ ]
1513
+ }]
1514
+ }]
1515
+ });
935
1516
  export { PAGE_BACK_BUTTON_OVERRIDE, PageActionsComponent, PageActionsDirective, PageComponent, PageContentComponent, PageContentDirective, PageFooterComponent, PageModule, PageProgressComponent, PageStickyContentDirective, PageSubtitleDirective, PageTitleComponent, PageTitleDirective, PageToolbarTitleDirective };
936
- //# sourceMappingURL=kirbydesign-designsystem-page.mjs.map
1517
+
1518
+ //# sourceMappingURL=kirbydesign-designsystem-page.mjs.map