@kirbydesign/designsystem 11.11.2 → 12.0.0

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 (290) 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 +98 -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 +407 -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 -891
  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 -296
  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 +1182 -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 -905
  62. package/fesm2022/kirbydesign-designsystem-page.mjs.map +1 -1
  63. package/fesm2022/kirbydesign-designsystem-popover.mjs +204 -169
  64. package/fesm2022/kirbydesign-designsystem-popover.mjs.map +1 -1
  65. package/fesm2022/kirbydesign-designsystem-progress-circle.mjs +209 -158
  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 -531
  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 -157
  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/icons/svg/person-blocked.svg +3 -0
  115. package/icons/svg/person-check.svg +3 -0
  116. package/icons/svg/person-close.svg +3 -0
  117. package/icons/svg/person-cloud.svg +3 -0
  118. package/icons/svg/person-power.svg +3 -0
  119. package/icons/svg/person-warning.svg +3 -0
  120. package/icons/svg/phone-device-pin.svg +3 -0
  121. package/icons/svg/phone-device.svg +3 -2
  122. package/package.json +11 -11
  123. package/readme.md +37 -0
  124. package/types/kirbydesign-designsystem-accordion.d.ts +72 -39
  125. package/types/kirbydesign-designsystem-accordion.d.ts.map +1 -1
  126. package/types/kirbydesign-designsystem-action-group.d.ts +46 -39
  127. package/types/kirbydesign-designsystem-action-group.d.ts.map +1 -1
  128. package/types/kirbydesign-designsystem-avatar.d.ts +58 -26
  129. package/types/kirbydesign-designsystem-avatar.d.ts.map +1 -1
  130. package/types/kirbydesign-designsystem-badge.d.ts +30 -19
  131. package/types/kirbydesign-designsystem-badge.d.ts.map +1 -1
  132. package/types/kirbydesign-designsystem-button.d.ts +70 -45
  133. package/types/kirbydesign-designsystem-button.d.ts.map +1 -1
  134. package/types/kirbydesign-designsystem-calendar.d.ts +193 -132
  135. package/types/kirbydesign-designsystem-calendar.d.ts.map +1 -1
  136. package/types/kirbydesign-designsystem-card.d.ts +120 -66
  137. package/types/kirbydesign-designsystem-card.d.ts.map +1 -1
  138. package/types/kirbydesign-designsystem-chart.d.ts +198 -172
  139. package/types/kirbydesign-designsystem-chart.d.ts.map +1 -1
  140. package/types/kirbydesign-designsystem-checkbox.d.ts +96 -68
  141. package/types/kirbydesign-designsystem-checkbox.d.ts.map +1 -1
  142. package/types/kirbydesign-designsystem-config.d.ts +17 -21
  143. package/types/kirbydesign-designsystem-config.d.ts.map +1 -1
  144. package/types/kirbydesign-designsystem-data-table.d.ts +46 -26
  145. package/types/kirbydesign-designsystem-data-table.d.ts.map +1 -1
  146. package/types/kirbydesign-designsystem-divider.d.ts +11 -9
  147. package/types/kirbydesign-designsystem-divider.d.ts.map +1 -1
  148. package/types/kirbydesign-designsystem-dropdown.d.ts +219 -166
  149. package/types/kirbydesign-designsystem-dropdown.d.ts.map +1 -1
  150. package/types/kirbydesign-designsystem-empty-state.d.ts +47 -35
  151. package/types/kirbydesign-designsystem-empty-state.d.ts.map +1 -1
  152. package/types/kirbydesign-designsystem-fab-sheet.d.ts +34 -28
  153. package/types/kirbydesign-designsystem-fab-sheet.d.ts.map +1 -1
  154. package/types/kirbydesign-designsystem-flag.d.ts +18 -13
  155. package/types/kirbydesign-designsystem-flag.d.ts.map +1 -1
  156. package/types/kirbydesign-designsystem-form-field.d.ts +409 -242
  157. package/types/kirbydesign-designsystem-form-field.d.ts.map +1 -1
  158. package/types/kirbydesign-designsystem-gesture.d.ts +41 -46
  159. package/types/kirbydesign-designsystem-gesture.d.ts.map +1 -1
  160. package/types/kirbydesign-designsystem-header.d.ts +102 -64
  161. package/types/kirbydesign-designsystem-header.d.ts.map +1 -1
  162. package/types/kirbydesign-designsystem-helpers-scss.d.ts +6 -8
  163. package/types/kirbydesign-designsystem-helpers-scss.d.ts.map +1 -1
  164. package/types/kirbydesign-designsystem-helpers.d.ts +83 -97
  165. package/types/kirbydesign-designsystem-helpers.d.ts.map +1 -1
  166. package/types/kirbydesign-designsystem-icon.d.ts +63 -59
  167. package/types/kirbydesign-designsystem-icon.d.ts.map +1 -1
  168. package/types/kirbydesign-designsystem-item-group.d.ts +6 -9
  169. package/types/kirbydesign-designsystem-item-group.d.ts.map +1 -1
  170. package/types/kirbydesign-designsystem-item-sliding.d.ts +30 -26
  171. package/types/kirbydesign-designsystem-item-sliding.d.ts.map +1 -1
  172. package/types/kirbydesign-designsystem-item.d.ts +93 -54
  173. package/types/kirbydesign-designsystem-item.d.ts.map +1 -1
  174. package/types/kirbydesign-designsystem-kirby-app.d.ts +18 -19
  175. package/types/kirbydesign-designsystem-kirby-app.d.ts.map +1 -1
  176. package/types/kirbydesign-designsystem-list.d.ts +382 -263
  177. package/types/kirbydesign-designsystem-list.d.ts.map +1 -1
  178. package/types/kirbydesign-designsystem-loading-overlay.d.ts +35 -24
  179. package/types/kirbydesign-designsystem-loading-overlay.d.ts.map +1 -1
  180. package/types/kirbydesign-designsystem-menu.d.ts +119 -69
  181. package/types/kirbydesign-designsystem-menu.d.ts.map +1 -1
  182. package/types/kirbydesign-designsystem-modal.d.ts +577 -455
  183. package/types/kirbydesign-designsystem-modal.d.ts.map +1 -1
  184. package/types/kirbydesign-designsystem-page.d.ts +304 -226
  185. package/types/kirbydesign-designsystem-page.d.ts.map +1 -1
  186. package/types/kirbydesign-designsystem-popover.d.ts +48 -40
  187. package/types/kirbydesign-designsystem-popover.d.ts.map +1 -1
  188. package/types/kirbydesign-designsystem-progress-circle.d.ts +59 -61
  189. package/types/kirbydesign-designsystem-progress-circle.d.ts.map +1 -1
  190. package/types/kirbydesign-designsystem-radio.d.ts +147 -98
  191. package/types/kirbydesign-designsystem-radio.d.ts.map +1 -1
  192. package/types/kirbydesign-designsystem-range.d.ts +90 -45
  193. package/types/kirbydesign-designsystem-range.d.ts.map +1 -1
  194. package/types/kirbydesign-designsystem-reorder-list.d.ts +44 -32
  195. package/types/kirbydesign-designsystem-reorder-list.d.ts.map +1 -1
  196. package/types/kirbydesign-designsystem-router-outlet.d.ts +23 -18
  197. package/types/kirbydesign-designsystem-router-outlet.d.ts.map +1 -1
  198. package/types/kirbydesign-designsystem-section-header.d.ts +5 -8
  199. package/types/kirbydesign-designsystem-section-header.d.ts.map +1 -1
  200. package/types/kirbydesign-designsystem-segmented-control.d.ts +123 -100
  201. package/types/kirbydesign-designsystem-segmented-control.d.ts.map +1 -1
  202. package/types/kirbydesign-designsystem-shared-floating.d.ts +183 -128
  203. package/types/kirbydesign-designsystem-shared-floating.d.ts.map +1 -1
  204. package/types/kirbydesign-designsystem-shared-portal.d.ts +29 -28
  205. package/types/kirbydesign-designsystem-shared-portal.d.ts.map +1 -1
  206. package/types/kirbydesign-designsystem-shared.d.ts +143 -139
  207. package/types/kirbydesign-designsystem-shared.d.ts.map +1 -1
  208. package/types/kirbydesign-designsystem-slide-button.d.ts +43 -34
  209. package/types/kirbydesign-designsystem-slide-button.d.ts.map +1 -1
  210. package/types/kirbydesign-designsystem-slide.d.ts +80 -59
  211. package/types/kirbydesign-designsystem-slide.d.ts.map +1 -1
  212. package/types/kirbydesign-designsystem-spinner.d.ts +13 -14
  213. package/types/kirbydesign-designsystem-spinner.d.ts.map +1 -1
  214. package/types/kirbydesign-designsystem-tab-navigation.d.ts +78 -55
  215. package/types/kirbydesign-designsystem-tab-navigation.d.ts.map +1 -1
  216. package/types/kirbydesign-designsystem-tabs.d.ts +50 -45
  217. package/types/kirbydesign-designsystem-tabs.d.ts.map +1 -1
  218. package/types/kirbydesign-designsystem-testing-base.d.ts +2430 -815
  219. package/types/kirbydesign-designsystem-testing-base.d.ts.map +1 -1
  220. package/types/kirbydesign-designsystem-testing-jasmine.d.ts +9 -10
  221. package/types/kirbydesign-designsystem-testing-jasmine.d.ts.map +1 -1
  222. package/types/kirbydesign-designsystem-testing-jest.d.ts +9 -10
  223. package/types/kirbydesign-designsystem-testing-jest.d.ts.map +1 -1
  224. package/types/kirbydesign-designsystem-testing.d.ts +52 -58
  225. package/types/kirbydesign-designsystem-testing.d.ts.map +1 -1
  226. package/types/kirbydesign-designsystem-toast.d.ts +25 -31
  227. package/types/kirbydesign-designsystem-toast.d.ts.map +1 -1
  228. package/types/kirbydesign-designsystem-toggle-button.d.ts +62 -56
  229. package/types/kirbydesign-designsystem-toggle-button.d.ts.map +1 -1
  230. package/types/kirbydesign-designsystem-toggle.d.ts +71 -63
  231. package/types/kirbydesign-designsystem-toggle.d.ts.map +1 -1
  232. package/types/kirbydesign-designsystem-types.d.ts +15 -22
  233. package/types/kirbydesign-designsystem-types.d.ts.map +1 -1
  234. package/types/kirbydesign-designsystem.d.ts +135 -123
  235. package/types/kirbydesign-designsystem.d.ts.map +1 -1
  236. package/accordion/package.json +0 -4
  237. package/action-group/package.json +0 -4
  238. package/avatar/package.json +0 -4
  239. package/badge/package.json +0 -4
  240. package/button/package.json +0 -4
  241. package/calendar/package.json +0 -4
  242. package/card/package.json +0 -4
  243. package/chart/package.json +0 -4
  244. package/checkbox/package.json +0 -4
  245. package/config/package.json +0 -4
  246. package/data-table/package.json +0 -4
  247. package/divider/package.json +0 -4
  248. package/dropdown/package.json +0 -4
  249. package/empty-state/package.json +0 -4
  250. package/fab-sheet/package.json +0 -4
  251. package/flag/package.json +0 -4
  252. package/form-field/package.json +0 -4
  253. package/gesture/package.json +0 -4
  254. package/header/package.json +0 -4
  255. package/helpers/package.json +0 -4
  256. package/helpers/scss/package.json +0 -4
  257. package/icon/package.json +0 -4
  258. package/item/package.json +0 -4
  259. package/item-group/package.json +0 -4
  260. package/item-sliding/package.json +0 -4
  261. package/kirby-app/package.json +0 -4
  262. package/list/package.json +0 -4
  263. package/loading-overlay/package.json +0 -4
  264. package/menu/package.json +0 -4
  265. package/modal/package.json +0 -4
  266. package/page/package.json +0 -4
  267. package/popover/package.json +0 -4
  268. package/progress-circle/package.json +0 -4
  269. package/radio/package.json +0 -4
  270. package/range/package.json +0 -4
  271. package/reorder-list/package.json +0 -4
  272. package/router-outlet/package.json +0 -4
  273. package/section-header/package.json +0 -4
  274. package/segmented-control/package.json +0 -4
  275. package/shared/floating/package.json +0 -4
  276. package/shared/package.json +0 -4
  277. package/shared/portal/package.json +0 -4
  278. package/slide/package.json +0 -4
  279. package/slide-button/package.json +0 -4
  280. package/spinner/package.json +0 -4
  281. package/tab-navigation/package.json +0 -4
  282. package/tabs/package.json +0 -4
  283. package/testing/package.json +0 -4
  284. package/testing-base/package.json +0 -4
  285. package/testing-jasmine/package.json +0 -4
  286. package/testing-jest/package.json +0 -4
  287. package/toast/package.json +0 -4
  288. package/toggle/package.json +0 -4
  289. package/toggle-button/package.json +0 -4
  290. package/types/package.json +0 -4
@@ -1,918 +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/standalone';
6
- import { IonHeader, IonToolbar, IonButtons, IonBackButton, IonTitle, IonContent, IonRefresher, IonFooter } from '@ionic/angular/standalone';
7
- import { componentOnReady } from '@ionic/core';
8
- import * as i4 from '@kirbydesign/designsystem/tabs';
9
- import { selectedTabClickEvent } from '@kirbydesign/designsystem/tabs';
10
- import { Subject } 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.18", ngImport: i0, type: PageTitleDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
33
- /** @nocollapse */ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.18", type: PageTitleDirective, isStandalone: true, selector: "[kirbyPageTitle]", ngImport: i0 }); }
34
- }
35
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.18", 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.18", ngImport: i0, type: PageSubtitleDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
41
- /** @nocollapse */ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.18", type: PageSubtitleDirective, isStandalone: true, selector: "[kirbyPageSubtitle]", ngImport: i0 }); }
42
- }
43
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.18", 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.18", ngImport: i0, type: PageToolbarTitleDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
49
- /** @nocollapse */ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.18", type: PageToolbarTitleDirective, isStandalone: true, selector: "[kirbyPageToolbarTitle]", ngImport: i0 }); }
50
- }
51
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.18", 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.18", 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.18", type: PageActionsDirective, isStandalone: true, selector: "[kirbyPageActions]", inputs: { config: ["kirbyPageActions", "config"] }, ngImport: i0 }); }
70
- }
71
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.18", 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.18", 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.18", type: PageContentDirective, isStandalone: true, selector: "[kirbyPageContent]", inputs: { config: ["kirbyPageContent", "config"] }, ngImport: i0 }); }
87
- }
88
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.18", 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.18", ngImport: i0, type: PageStickyContentDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
97
- /** @nocollapse */ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.18", type: PageStickyContentDirective, isStandalone: true, selector: "[kirbyPageStickyContent]", ngImport: i0 }); }
98
- }
99
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.18", 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.18", 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.18", 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.18", 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.18", 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.18", 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.18", 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.18", ngImport: i0, type: PageContentComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
148
- /** @nocollapse */ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.2.18", 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.18", 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.18", ngImport: i0, type: PageActionsComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
163
- /** @nocollapse */ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.2.18", 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.18", 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.ngOnDestroy$ = new Subject();
221
- this.navigationStart$ = this.router.events.pipe(filter((event) => event instanceof NavigationStart), takeUntil(this.ngOnDestroy$));
222
- this.navigationEnd$ = this.router.events.pipe(filter((event) => event instanceof NavigationEnd), takeUntil(this.ngOnDestroy$));
223
- }
224
- whenContentReady() {
225
- if (!this.contentReadyPromise) {
226
- this.contentReadyPromise = new Promise((resolve) => {
227
- this.resizeObserverService.observe(this.ionContentElement, (entry) => {
228
- if (entry.contentRect.height > 0) {
229
- this.resizeObserverService.unobserve(this.ionContentElement);
230
- resolve();
231
- }
232
- });
233
- });
234
- }
235
- return this.contentReadyPromise;
236
- }
237
- ngOnInit() {
238
- this.removeWrapper();
239
- this.ionicElementPartHelper.setPart('background', this.ionToolbarElement, '.toolbar-background');
240
- const actionGroupConfig = {
241
- isCondensed: true,
242
- maxVisibleActions: 1,
243
- };
244
- this.toolbarActionGroupInjector = Injector.create({
245
- providers: [
246
- {
247
- provide: ACTIONGROUP_CONFIG,
248
- useValue: actionGroupConfig,
249
- },
250
- ],
251
- parent: this.injector,
252
- });
253
- }
254
- ngOnChanges(changes) {
255
- if (changes.titleMaxLines) {
256
- this.fitHeadingConfig = {
257
- maxLines: changes.titleMaxLines.currentValue,
258
- };
259
- }
260
- if (changes.subtitle && !changes.subtitle.isFirstChange) {
261
- this.subtitle = changes.title.currentValue;
262
- this.hasPageSubtitle = this.subtitle !== undefined;
263
- }
264
- if (changes.title || changes.toolbarTitle) {
265
- this.setHTMLDocumentTitle(this.title || this.toolbarTitle);
266
- }
267
- }
268
- ngAfterViewInit() {
269
- this.zone.runOutsideAngular(() => {
270
- this.contentScrolled$ = this.content.ionScroll.pipe(debounceTime(contentScrollDebounceTimeInMS), map((event) => event.detail), takeUntil(this.ngOnDestroy$));
271
- this.contentScrolled$.subscribe((scrollInfo) => {
272
- if (scrollInfo.scrollTop > contentScrolledOffsetInPixels !== this.isContentScrolled) {
273
- this.isContentScrolled = !this.isContentScrolled;
274
- this.changeDetectorRef.detectChanges();
275
- }
276
- });
277
- });
278
- // This instance has observed a page enter so register the correct url for this instance
279
- this.url = this.router.url;
280
- this.onEnter();
281
- // Watch navigation events for page enter and leave
282
- this.navigationStart$.subscribe((event) => {
283
- if (this.getPathname(event.url) !== this.getPathname(this.url) &&
284
- !this.modalNavigationService.isModalRoute(this.url) &&
285
- !this.modalNavigationService.isModalRoute(event.url)) {
286
- this.onLeave();
287
- }
288
- });
289
- this.navigationEnd$.subscribe((event) => {
290
- if (this.getPathname(event.urlAfterRedirects) === this.getPathname(this.url)) {
291
- this.onEnter();
292
- }
293
- });
294
- this.interceptBackButtonClicksSetup();
295
- this.initializeStickyIntersectionObserver();
296
- this.setActionButtonsWidth();
297
- }
298
- ngAfterContentChecked() {
299
- this.initializeHeader();
300
- this.initializeTitle();
301
- this.initializeActions();
302
- this.initializeContent();
303
- this.initializeStickyContent();
304
- this.changeDetectorRef.detectChanges();
305
- }
306
- ngOnDestroy() {
307
- this.ngOnDestroy$.next();
308
- this.ngOnDestroy$.complete();
309
- this.titleIntersectionObserver?.disconnect();
310
- this.stickyActionsIntersectionObserver?.disconnect();
311
- this.stickyContentIntersectionObserver?.disconnect();
312
- this.unobserveTitleMutation?.();
313
- }
314
- delegateRefreshEvent(event) {
315
- this.refresh.emit({
316
- complete: event.target.complete.bind(event.target),
317
- });
318
- }
319
- getMaxWidthClasses() {
320
- if (!this.maxWidth) {
321
- return '';
322
- }
323
- if (this.maxWidth === 'default') {
324
- return '';
325
- }
326
- return `max-width-${this.maxWidth}`;
327
- }
328
- onTitleClick(event) {
329
- if (this.toolbarTitleClick.observed) {
330
- this.toolbarTitleClick.emit(event);
331
- }
332
- else {
333
- this.header?.titleClick.emit(event);
334
- }
335
- }
336
- removeWrapper() {
337
- const parent = this.elementRef.nativeElement.parentNode;
338
- this.renderer.removeChild(parent, this.elementRef.nativeElement);
339
- this.renderer.appendChild(parent, this.ionHeaderElement.nativeElement);
340
- this.renderer.appendChild(parent, this.ionContentElement.nativeElement);
341
- this.renderer.appendChild(parent, this.ionFooterElement.nativeElement);
342
- }
343
- onEnter() {
344
- if (this.isActive)
345
- return;
346
- this.isActive = true;
347
- this.enter.emit();
348
- this.patchIonLastFocused();
349
- this.observeTitle();
350
- this.observeActions();
351
- this.setHTMLDocumentTitle(this.header?.title || this.title || this.toolbarTitle);
352
- this.observeTitleDOMChanges();
353
- }
354
- onLeave() {
355
- if (!this.isActive)
356
- return;
357
- this.isActive = false;
358
- this.leave.emit();
359
- this.unobserveTitle();
360
- this.unobserveActions();
361
- this.unobserveTitleMutation?.();
362
- if (this.tabBarBottomHidden && this.tabsComponent) {
363
- this.tabsComponent.tabBarBottomHidden = false;
364
- }
365
- }
366
- interceptBackButtonClicksSetup() {
367
- if (this.backButtonOverride) {
368
- this.backButton.onClick = (event) => {
369
- event.preventDefault();
370
- this.backButtonOverride.navigateBack(this.routerOutlet, this.navCtrl, this.defaultBackHref);
371
- };
372
- }
373
- // Intercept back-button click events, defaulting to the built-in click-handler.
374
- if (this.backButtonClick.observers.length === 0) {
375
- this.backButtonClick
376
- .pipe(takeUntil(this.ngOnDestroy$))
377
- .subscribe(this.backButton.onClick.bind(this.backButton));
378
- }
379
- this.backButton.onClick = (event) => {
380
- this.backButtonClick.emit(event);
381
- };
382
- }
383
- patchIonLastFocused() {
384
- const ionLastFocus = this.ionContentElement.nativeElement.querySelector('[ion-last-focus="true"]');
385
- // When a focusManagerPriority is set, Ionic handles moving focus back to the element that presented the current view.
386
- // Unfortunately, we need to schedule a removal of tabindex="-1" from ionLastFocus element after Ionic might have set it
387
- // to work around elements becoming inaccessible after navigating back: https://github.com/ionic-team/ionic-framework/issues/29875
388
- setTimeout(() => {
389
- if (ionLastFocus?.getAttribute('tabindex') !== '-1')
390
- return;
391
- this.renderer.removeAttribute(ionLastFocus, 'tabindex');
392
- });
393
- }
394
- initializeStickyIntersectionObserver() {
395
- if (this.stickyContentTemplate) {
396
- // Sticky content present - start observing for stickiness
397
- if (!this.stickyContentIntersectionObserver) {
398
- this.stickyContentIntersectionObserver = this.createStickyContentIntersectionObserver();
399
- }
400
- setTimeout(() => {
401
- this.stickyContentIntersectionObserver.observe(this.stickyContentContainer.nativeElement);
402
- });
403
- }
404
- }
405
- initializeHeader() {
406
- if (this.hasHeader === undefined && !!this.header) {
407
- this.hasHeader = true;
408
- // Header could later be removed from DOM (e.g. in virtual scrolling scenarios),
409
- // so store a reference to `header.titleActionIconTemplate` and `header.titleClick`:
410
- this.titleActionIconTemplate = this.header.titleActionIconTemplate;
411
- if (this.header.titleClick.observed && this.hasInteractiveTitle === undefined) {
412
- this.hasInteractiveTitle = true;
413
- }
414
- // Set document title from header immediately if present, then subscribe to changes
415
- this.setHTMLDocumentTitle(this.header.title);
416
- this.header.title$.pipe(takeUntil(this.ngOnDestroy$)).subscribe(() => {
417
- this.setHTMLDocumentTitle(this.header.title);
418
- });
419
- }
420
- }
421
- initializeTitle() {
422
- if (this.hasHeader && this.isObservingTitle && !this.header?.titleElement) {
423
- // If we're already observing the header's title element, but it's no longer present,
424
- // it means it has been removed from DOM (e.g. in virtual scrolling scenarios).
425
- // Flip observing flag:
426
- this.isObservingTitle = false;
427
- }
428
- if (this.hasPageTitle) {
429
- if (!this.isObservingTitle && !!this.header?.titleElement) {
430
- // Header and title element re-attached to DOM - observe title:
431
- this.observeTitle();
432
- }
433
- // Ensures rest of initializeTitle() won't run, if already initialized
434
- return;
435
- }
436
- this.hasPageTitle =
437
- this.title !== undefined || !!this.customTitleTemplate || !!this.header?.title;
438
- this.toolbarTitleVisible = !this.hasPageTitle;
439
- this.hasPageSubtitle = this.subtitle !== undefined || !!this.customSubtitleTemplate;
440
- if (this.header?.title && !this.toolbarTitle) {
441
- this.toolbarTitle = this.header.title;
442
- this.header.title$.pipe(takeUntil(this.ngOnDestroy$)).subscribe((title) => {
443
- this.toolbarTitle = title;
444
- });
445
- }
446
- this.observeTitle();
447
- const defaultTitleTemplate = this.customTitleTemplate || this.simpleTitleTemplate;
448
- /* eslint-disable */
449
- // prettier-ignore
450
- this.toolbarTitleTemplate = this.customToolbarTitleTemplate
451
- ? this.customToolbarTitleTemplate
452
- : typeof this.toolbarTitle === 'string'
453
- ? this.simpleToolbarTitleTemplate
454
- : defaultTitleTemplate;
455
- if (this.toolbarTitleClick.observed && this.hasInteractiveTitle === undefined) {
456
- this.hasInteractiveTitle = true;
457
- }
458
- }
459
- observeTitle() {
460
- if (!this.hasPageTitle) {
461
- // Nothing to observe
462
- return;
463
- }
464
- if (this.isObservingTitle) {
465
- // Already observing
466
- return;
467
- }
468
- // We are not actually observing the title until after the `whenContentReady` promise has resolved,
469
- // but since we've already checked that the page has a title in the guard above,
470
- // we'll - eagerly - set this flag now to prevent unnecessary re-runs of the rest of this method:
471
- this.isObservingTitle = true;
472
- if (!this.titleIntersectionObserver) {
473
- this.titleIntersectionObserver = new IntersectionObserver((entries) => {
474
- // In rare scenarios we get more than 1 entry - use the last one:
475
- const lastEntry = entries[entries.length - 1];
476
- if (lastEntry) {
477
- const showToolbarTitle = !lastEntry.isIntersecting;
478
- // Only flip the flag and run Change Detection when changed:
479
- if (showToolbarTitle !== this.toolbarTitleVisible) {
480
- this.toolbarTitleVisible = showToolbarTitle;
481
- this.changeDetectorRef.detectChanges();
482
- }
483
- }
484
- }, { root: this.ionContentElement.nativeElement });
485
- }
486
- // Run outside Angular to prevent unnecessary triggering change detection
487
- // and - under certain conditions - an infinite loop when called within ngAfterContentChecked:
488
- this.zone.runOutsideAngular(() => {
489
- this.whenContentReady().then(() => {
490
- const titleElementRef = this.pageTitle || this.header?.titleElement;
491
- if (titleElementRef?.nativeElement) {
492
- this.titleIntersectionObserver.observe(titleElementRef.nativeElement);
493
- }
494
- });
495
- });
496
- }
497
- unobserveTitle() {
498
- const titleElementRef = this.pageTitle || this.header?.titleElement;
499
- if (titleElementRef) {
500
- this.titleIntersectionObserver?.unobserve(titleElementRef.nativeElement);
501
- }
502
- this.isObservingTitle = false;
503
- }
504
- observeTitleDOMChanges() {
505
- const globalKirbyConfig = getGlobalConfig();
506
- if (!globalKirbyConfig?.setHtmlDocTitle)
507
- return;
508
- if (this.isDocTitleSet)
509
- return; // we never want to observe if the document title is already set via any title properties (or already observed)
510
- const titleArea = this.ionHeaderElement.nativeElement.querySelector('ion-toolbar ion-title .toolbar-title');
511
- this.setHTMLDocumentTitle(titleArea.textContent);
512
- this.unobserveTitleMutation = observeContent(titleArea, () => {
513
- this.setHTMLDocumentTitle(titleArea.textContent);
514
- });
515
- }
516
- setHTMLDocumentTitle(title) {
517
- const globalKirbyConfig = getGlobalConfig();
518
- if (!globalKirbyConfig?.setHtmlDocTitle || !title || title.trim() === '')
519
- return;
520
- this.htmlDocTitle.setTitle(title);
521
- this.isDocTitleSet = true;
522
- }
523
- initializeActions() {
524
- if (this.headerActionsTemplate === undefined && !!this.header) {
525
- this.headerActionsTemplate = this.header.actionsTemplate;
526
- }
527
- if (this.hasHeader && this.isObservingActions && !this.header?.actionsElement) {
528
- // If we're already observing the header's actions element, but it's no longer present,
529
- // it means it has been removed from DOM (e.g. in virtual scrolling scenarios).
530
- // Flip observing flag:
531
- this.isObservingActions = false;
532
- }
533
- this.observeActions();
534
- this.customActions.forEach((pageAction) => {
535
- if (pageAction.isFixed) {
536
- this.fixedActionsTemplate = pageAction.template;
537
- }
538
- else if (pageAction.isSticky) {
539
- this.stickyActionsTemplate = pageAction.template;
540
- }
541
- else {
542
- this.pageActionsTemplate = pageAction.template;
543
- }
544
- });
545
- }
546
- observeActions() {
547
- if (!this.header?.actionsElement) {
548
- // Nothing to observe
549
- return;
550
- }
551
- if (this.isObservingActions) {
552
- // Already observing
553
- return;
554
- }
555
- // We are not actually observing actions until after the `whenContentReady` promise has resolved,
556
- // but since we've already checked that there's an actions element present in the guard above,
557
- // we'll - eagerly - set this flag now to prevent unnecessary re-runs of the rest of this method:
558
- this.isObservingActions = true;
559
- if (!this.stickyActionsIntersectionObserver) {
560
- this.stickyActionsIntersectionObserver = new IntersectionObserver((entries) => {
561
- // In rare scenarios we get more than 1 entry - use the last one:
562
- const lastEntry = entries[entries.length - 1];
563
- if (lastEntry) {
564
- const showToolbarActions = !lastEntry.isIntersecting;
565
- // Only flip the flag and run Change Detection when changed:
566
- if (showToolbarActions !== this.toolbarActionsVisible) {
567
- this.toolbarActionsVisible = showToolbarActions;
568
- this.changeDetectorRef.detectChanges();
569
- }
570
- }
571
- }, { root: this.ionContentElement.nativeElement });
572
- }
573
- // Run outside Angular to prevent unnecessary triggering change detection
574
- // and - under certain conditions - an infinite loop when called within ngAfterContentChecked:
575
- this.zone.runOutsideAngular(() => {
576
- this.whenContentReady().then(() => {
577
- if (this.header?.actionsElement?.nativeElement) {
578
- this.stickyActionsIntersectionObserver.observe(this.header.actionsElement.nativeElement);
579
- }
580
- });
581
- });
582
- }
583
- unobserveActions() {
584
- if (this.header?.actionsElement) {
585
- this.stickyActionsIntersectionObserver?.unobserve(this.header.actionsElement.nativeElement);
586
- }
587
- this.isObservingActions = false;
588
- }
589
- setActionButtonsWidth() {
590
- if (!this.ionToolbarButtonsElement)
591
- return;
592
- // Ensure ion-toolbar custom element has been defined (primarily when testing, but doesn't hurt):
593
- customElements.whenDefined(this.ionToolbarElement.nativeElement.localName).then(() => {
594
- // Ensure toolbar and buttons have been rendered and has dimensions:
595
- componentOnReady(this.ionToolbarElement.nativeElement, (toolbar) => {
596
- let startButtonsWidth = 0;
597
- let endButtonsWidth = 0;
598
- this.ionToolbarButtonsElement
599
- .map((ionButtonsElementRef) => ionButtonsElementRef.nativeElement)
600
- .forEach((ionButtonsElement) => {
601
- const style = getComputedStyle(ionButtonsElement);
602
- const margin = parseInt(style.marginLeft) + parseInt(style.marginRight);
603
- if (ionButtonsElement.getAttribute('slot') === 'start') {
604
- startButtonsWidth += ionButtonsElement.offsetWidth + margin;
605
- }
606
- else {
607
- endButtonsWidth += ionButtonsElement.offsetWidth + margin;
608
- }
609
- });
610
- const actionButtonsMaxWidth = Math.max(startButtonsWidth, endButtonsWidth);
611
- this.renderer.setStyle(toolbar, '--action-buttons-width', `${actionButtonsMaxWidth}px`, RendererStyleFlags2.DashCase);
612
- });
613
- });
614
- }
615
- initializeContent() {
616
- this.customContent.forEach((content) => {
617
- if (content.isFixed) {
618
- this.fixedContentTemplate = content.template;
619
- }
620
- else {
621
- this.customContentTemplate = content.template;
622
- }
623
- });
624
- }
625
- initializeStickyContent() {
626
- this.stickyContentTemplate = this.stickyContentRef;
627
- }
628
- createStickyContentIntersectionObserver() {
629
- const options = {
630
- root: this.ionContentElement.nativeElement,
631
- threshold: 1,
632
- };
633
- const callback = (entries) => {
634
- if (this.isStickyContentPinned !== !entries[0].isIntersecting) {
635
- this.isStickyContentPinned = !this.isStickyContentPinned;
636
- this.changeDetectorRef.detectChanges();
637
- }
638
- };
639
- return new IntersectionObserver(callback, options);
640
- }
641
- getPathname(url) {
642
- return url.split('?')[0];
643
- }
644
- _onKeyboardWillShow(info) {
645
- if (info && info.keyboardHeight) {
646
- this.ionContentElement.nativeElement.style.setProperty('--keyboard-offset', `${info.keyboardHeight}px`);
647
- }
648
- }
649
- _onKeyboardWillHide() {
650
- this.ionContentElement.nativeElement.style.setProperty('--keyboard-offset', '0px');
651
- }
652
- _onSelectedTabClick() {
653
- if (this.content) {
654
- this.content.scrollToTop(KirbyAnimation.Duration.LONG);
655
- }
656
- }
657
- /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.18", 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 }); }
658
- /** @nocollapse */ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.18", 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(clamp(14px,1.125rem,35px),21.6px)}ion-toolbar{--border-width: 0 !important;--padding-start: 16px;--padding-end: 16px;--padding-top: 0;--padding-bottom: 0;--ion-toolbar-color: var(--kirby-black);--min-height: 56px}@media(min-width:768px){ion-toolbar{--padding-start: 24px;--padding-end: 24px;--min-height: 72px}}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(243.294, 243.294, 243.294)}ion-toolbar.content-scrolled:before,ion-toolbar.content-scrolled::part(background){transition-duration:.2s}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:8px}ion-toolbar ion-buttons[slot=primary],ion-toolbar ion-buttons[slot=secondary]{margin-left:8px}ion-toolbar ion-buttons[slot=secondary]{order:6}ion-toolbar ion-title{box-sizing:border-box;font-size:clamp(13px,1rem,32px);font-weight:400;padding-inline:calc(var(--action-buttons-width, 48px) + 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:56px;scale:0;transition-property:opacity,transform;transition-duration:.15s;transition-timing-function:ease;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:40px;width:40px;opacity:1}ion-back-button::part(icon){margin-inline:0}ion-back-button::part(native){opacity:1;border-radius:999px;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, 792px);margin:0 auto}.page-header{margin-left:16px;margin-top:8px;margin-bottom:var(--kirby-page-title-margin-bottom, 40px)}.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:8px}.page-header.text-center{text-align:center;margin-left:0}.page-header.text-right{text-align:right}ion-content{--padding-top: 12px;--padding-start: var( --page-content-padding-start, calc(16px + var(--ion-safe-area-left)) );--padding-end: var(--page-content-padding-end, 16px);--background: var(--kirby-background-color);--color: var(--kirby-black)}@media(min-width:768px){ion-content{--padding-start: var(--page-content-padding-start, 48px);--padding-end: var(--page-content-padding-end, 48px)}}ion-content.has-header{--padding-top: 0}ion-content.max-width-lg{--page-content-max-width: 1092px}ion-content.max-width-xl{--page-content-max-width: 1392px}ion-content.max-width-full{--page-content-max-width: 100%}ion-content::part(scroll){scrollbar-gutter:stable}ion-content .content-inner{max-width:var(--page-content-max-width, 792px);margin:0 auto;padding-bottom:40px;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:-13px;left:0;right:0;padding-top:1px;margin-block-end:24px;z-index:10}.sticky-content-container div{max-width:var(--page-content-max-width, 792px);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"] }, { kind: "component", type: IonRefresher, selector: "ion-refresher", inputs: ["closeDuration", "disabled", "mode", "pullFactor", "pullMax", "pullMin", "snapbackDuration"] }, { 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 }); }
659
- }
660
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.18", ngImport: i0, type: PageComponent, decorators: [{
661
- type: Component,
662
- args: [{ selector: 'kirby-page', changeDetection: ChangeDetectionStrategy.OnPush, providers: [IonicElementPartHelper], imports: [
663
- IonHeader,
664
- IonToolbar,
665
- IonButtons,
666
- IonBackButton,
667
- IonTitle,
668
- NgTemplateOutlet,
669
- IonContent,
670
- IonRefresher,
671
- SpinnerComponent,
672
- NgClass,
673
- IonFooter,
674
- FitHeadingDirective,
675
- ], 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(clamp(14px,1.125rem,35px),21.6px)}ion-toolbar{--border-width: 0 !important;--padding-start: 16px;--padding-end: 16px;--padding-top: 0;--padding-bottom: 0;--ion-toolbar-color: var(--kirby-black);--min-height: 56px}@media(min-width:768px){ion-toolbar{--padding-start: 24px;--padding-end: 24px;--min-height: 72px}}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(243.294, 243.294, 243.294)}ion-toolbar.content-scrolled:before,ion-toolbar.content-scrolled::part(background){transition-duration:.2s}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:8px}ion-toolbar ion-buttons[slot=primary],ion-toolbar ion-buttons[slot=secondary]{margin-left:8px}ion-toolbar ion-buttons[slot=secondary]{order:6}ion-toolbar ion-title{box-sizing:border-box;font-size:clamp(13px,1rem,32px);font-weight:400;padding-inline:calc(var(--action-buttons-width, 48px) + 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:56px;scale:0;transition-property:opacity,transform;transition-duration:.15s;transition-timing-function:ease;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:40px;width:40px;opacity:1}ion-back-button::part(icon){margin-inline:0}ion-back-button::part(native){opacity:1;border-radius:999px;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, 792px);margin:0 auto}.page-header{margin-left:16px;margin-top:8px;margin-bottom:var(--kirby-page-title-margin-bottom, 40px)}.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:8px}.page-header.text-center{text-align:center;margin-left:0}.page-header.text-right{text-align:right}ion-content{--padding-top: 12px;--padding-start: var( --page-content-padding-start, calc(16px + var(--ion-safe-area-left)) );--padding-end: var(--page-content-padding-end, 16px);--background: var(--kirby-background-color);--color: var(--kirby-black)}@media(min-width:768px){ion-content{--padding-start: var(--page-content-padding-start, 48px);--padding-end: var(--page-content-padding-end, 48px)}}ion-content.has-header{--padding-top: 0}ion-content.max-width-lg{--page-content-max-width: 1092px}ion-content.max-width-xl{--page-content-max-width: 1392px}ion-content.max-width-full{--page-content-max-width: 100%}ion-content::part(scroll){scrollbar-gutter:stable}ion-content .content-inner{max-width:var(--page-content-max-width, 792px);margin:0 auto;padding-bottom:40px;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:-13px;left:0;right:0;padding-top:1px;margin-block-end:24px;z-index:10}.sticky-content-container div{max-width:var(--page-content-max-width, 792px);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"] }]
676
- }], 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: [{
677
- type: Optional
678
- }, {
679
- type: SkipSelf
680
- }] }, { type: undefined, decorators: [{
681
- type: Optional
682
- }, {
683
- type: Inject,
684
- args: [PAGE_BACK_BUTTON_OVERRIDE]
685
- }] }, { type: i5.IonRouterOutlet, decorators: [{
686
- type: Optional
687
- }] }, { type: i5.NavController, decorators: [{
688
- type: Optional
689
- }] }, { type: i6.IonicElementPartHelper }, { type: i3.TranslationService }, { type: i7.Title }], propDecorators: { title: [{
690
- type: Input
691
- }], subtitle: [{
692
- type: Input
693
- }], toolbarTitle: [{
694
- type: Input
695
- }], titleAlignment: [{
696
- type: Input
697
- }], defaultBackHref: [{
698
- type: Input
699
- }], hideBackButton: [{
700
- type: Input
701
- }], titleMaxLines: [{
702
- type: Input
703
- }], hasInteractiveTitle: [{
704
- type: Input
705
- }], maxWidth: [{
706
- type: Input
707
- }], tabBarBottomHidden: [{
708
- type: Input
709
- }], enter: [{
710
- type: Output
711
- }], leave: [{
712
- type: Output
713
- }], refresh: [{
714
- type: Output
715
- }], backButtonClick: [{
716
- type: Output
717
- }], toolbarTitleClick: [{
718
- type: Output
719
- }], content: [{
720
- type: ViewChild,
721
- args: [IonContent, { static: true }]
722
- }], ionContentElement: [{
723
- type: ViewChild,
724
- args: [IonContent, { static: true, read: ElementRef }]
725
- }], ionHeaderElement: [{
726
- type: ViewChild,
727
- args: [IonHeader, { static: true, read: ElementRef }]
728
- }], ionFooterElement: [{
729
- type: ViewChild,
730
- args: [IonFooter, { static: true, read: ElementRef }]
731
- }], ionToolbarElement: [{
732
- type: ViewChild,
733
- args: [IonToolbar, { static: true, read: ElementRef }]
734
- }], ionToolbarButtonsElement: [{
735
- type: ViewChildren,
736
- args: [IonButtons, { read: ElementRef }]
737
- }], backButton: [{
738
- type: ViewChild,
739
- args: [IonBackButton, { static: false }]
740
- }], pageTitle: [{
741
- type: ViewChild,
742
- args: ['pageTitle', { static: false, read: ElementRef }]
743
- }], stickyContentContainer: [{
744
- type: ViewChild,
745
- args: ['stickyContentContainer', { static: false, read: ElementRef }]
746
- }], simpleTitleTemplate: [{
747
- type: ViewChild,
748
- args: ['simpleTitleTemplate', { static: true, read: TemplateRef }]
749
- }], simpleToolbarTitleTemplate: [{
750
- type: ViewChild,
751
- args: ['simpleToolbarTitleTemplate', { static: true, read: TemplateRef }]
752
- }], customToolbarTitleTemplate: [{
753
- type: ContentChild,
754
- args: [PageToolbarTitleDirective, { static: false, read: TemplateRef }]
755
- }], customTitleTemplate: [{
756
- type: ContentChild,
757
- args: [PageTitleDirective, { static: false, read: TemplateRef }]
758
- }], customSubtitleTemplate: [{
759
- type: ContentChild,
760
- args: [PageSubtitleDirective, { static: false, read: TemplateRef }]
761
- }], customActions: [{
762
- type: ContentChildren,
763
- args: [PageActionsDirective]
764
- }], customContent: [{
765
- type: ContentChildren,
766
- args: [PageContentDirective]
767
- }], stickyContentRef: [{
768
- type: ContentChild,
769
- args: [PageStickyContentDirective, { static: false, read: TemplateRef }]
770
- }], header: [{
771
- type: ContentChild,
772
- args: [HeaderComponent]
773
- }], _onKeyboardWillShow: [{
774
- type: HostListener,
775
- args: ['window:keyboardWillShow', ['$event']]
776
- }], _onKeyboardWillHide: [{
777
- type: HostListener,
778
- args: ['window:keyboardWillHide']
779
- }], _onSelectedTabClick: [{
780
- type: HostListener,
781
- args: [`window:${selectedTabClickEvent}`]
782
- }] } });
783
-
784
- class PageFooterComponent {
785
- constructor(pageComponent, hostElement, renderer) {
786
- this.pageComponent = pageComponent;
787
- this.hostElement = hostElement;
788
- this.renderer = renderer;
789
- this.hasPadding = true;
790
- if (!pageComponent) {
791
- throw new Error('Page footer must reside inside of a Kirby page');
792
- }
793
- }
794
- close() {
795
- this.pageComponent.tabBarBottomHidden = false;
796
- this.renderer.removeChild(this.hostElement.nativeElement.parentElement, this.hostElement.nativeElement, true);
797
- }
798
- ngOnDestroy() {
799
- this.pageComponent.tabBarBottomHidden = false;
800
- }
801
- /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.18", ngImport: i0, type: PageFooterComponent, deps: [{ token: PageComponent, optional: true, skipSelf: true }, { token: i0.ElementRef }, { token: i0.Renderer2 }], target: i0.ɵɵFactoryTarget.Component }); }
802
- /** @nocollapse */ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.2.18", 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: [".kirby-line-clamp{display:-webkit-box;-webkit-line-clamp:var(--line-clamp, none);-webkit-box-orient:vertical;overflow:hidden}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, 792px);margin:0 auto;padding-bottom:var(--kirby-page-footer-safe-area-bottom, var(--kirby-safe-area-bottom))}:host .wrapper.padding{padding:8px 16px;padding-bottom:calc(8px + var(--kirby-page-footer-safe-area-bottom, var(--kirby-safe-area-bottom)))}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
803
- }
804
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.18", ngImport: i0, type: PageFooterComponent, decorators: [{
805
- type: Component,
806
- args: [{ selector: 'kirby-page-footer', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"wrapper\" [class.padding]=\"hasPadding\">\n <ng-content></ng-content>\n</div>\n", styles: [".kirby-line-clamp{display:-webkit-box;-webkit-line-clamp:var(--line-clamp, none);-webkit-box-orient:vertical;overflow:hidden}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, 792px);margin:0 auto;padding-bottom:var(--kirby-page-footer-safe-area-bottom, var(--kirby-safe-area-bottom))}:host .wrapper.padding{padding:8px 16px;padding-bottom:calc(8px + var(--kirby-page-footer-safe-area-bottom, var(--kirby-safe-area-bottom)))}\n"] }]
807
- }], ctorParameters: () => [{ type: PageComponent, decorators: [{
808
- type: Optional
809
- }, {
810
- type: SkipSelf
811
- }] }, { type: i0.ElementRef }, { type: i0.Renderer2 }], propDecorators: { hasPadding: [{
812
- type: Input
813
- }] } });
814
-
815
- class PageModule {
816
- /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.18", ngImport: i0, type: PageModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
817
- /** @nocollapse */ static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "21.2.18", ngImport: i0, type: PageModule, imports: [CommonModule,
818
- FitHeadingDirective,
819
- SpinnerModule,
820
- HeaderModule,
821
- IonHeader,
822
- IonToolbar,
823
- IonButtons,
824
- IonBackButton,
825
- IonContent,
826
- IonTitle,
827
- IonRefresher,
828
- IonFooter,
829
- PageComponent,
830
- PageActionsComponent,
831
- PageActionsDirective,
832
- PageContentComponent,
833
- PageFooterComponent,
834
- PageContentDirective,
835
- PageProgressComponent,
836
- PageTitleComponent,
837
- PageTitleDirective,
838
- PageSubtitleDirective,
839
- PageToolbarTitleDirective,
840
- PageStickyContentDirective], exports: [PageComponent,
841
- PageActionsComponent,
842
- PageActionsDirective,
843
- PageContentComponent,
844
- PageFooterComponent,
845
- PageContentDirective,
846
- PageProgressComponent,
847
- PageTitleComponent,
848
- PageTitleDirective,
849
- PageSubtitleDirective,
850
- PageToolbarTitleDirective,
851
- FitHeadingDirective,
852
- PageStickyContentDirective] }); }
853
- /** @nocollapse */ static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "21.2.18", ngImport: i0, type: PageModule, imports: [CommonModule,
854
- SpinnerModule,
855
- HeaderModule,
856
- IonHeader,
857
- IonToolbar,
858
- IonButtons,
859
- IonBackButton,
860
- IonContent,
861
- IonTitle,
862
- IonRefresher,
863
- IonFooter,
864
- PageComponent] }); }
865
- }
866
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.18", ngImport: i0, type: PageModule, decorators: [{
867
- type: NgModule,
868
- args: [{
869
- imports: [
870
- CommonModule,
871
- FitHeadingDirective,
872
- SpinnerModule,
873
- HeaderModule,
874
- IonHeader,
875
- IonToolbar,
876
- IonButtons,
877
- IonBackButton,
878
- IonContent,
879
- IonTitle,
880
- IonRefresher,
881
- IonFooter,
882
- PageComponent,
883
- PageActionsComponent,
884
- PageActionsDirective,
885
- PageContentComponent,
886
- PageFooterComponent,
887
- PageContentDirective,
888
- PageProgressComponent,
889
- PageTitleComponent,
890
- PageTitleDirective,
891
- PageSubtitleDirective,
892
- PageToolbarTitleDirective,
893
- PageStickyContentDirective,
894
- ],
895
- exports: [
896
- PageComponent,
897
- PageActionsComponent,
898
- PageActionsDirective,
899
- PageContentComponent,
900
- PageFooterComponent,
901
- PageContentDirective,
902
- PageProgressComponent,
903
- PageTitleComponent,
904
- PageTitleDirective,
905
- PageSubtitleDirective,
906
- PageToolbarTitleDirective,
907
- FitHeadingDirective,
908
- PageStickyContentDirective,
909
- ],
910
- }]
911
- }] });
912
-
913
- /**
914
- * Generated bundle index. Do not edit.
915
- */
916
-
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-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"],
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-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"]
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\" [class.padding]=\"hasPadding\">\n <ng-content></ng-content>\n</div>\n",
1352
+ 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"],
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\" [class.padding]=\"hasPadding\">\n <ng-content></ng-content>\n</div>\n",
1368
+ 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"]
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
+ });
917
1516
  export { PAGE_BACK_BUTTON_OVERRIDE, PageActionsComponent, PageActionsDirective, PageComponent, PageContentComponent, PageContentDirective, PageFooterComponent, PageModule, PageProgressComponent, PageStickyContentDirective, PageSubtitleDirective, PageTitleComponent, PageTitleDirective, PageToolbarTitleDirective };
918
- //# sourceMappingURL=kirbydesign-designsystem-page.mjs.map
1517
+
1518
+ //# sourceMappingURL=kirbydesign-designsystem-page.mjs.map