@kirbydesign/designsystem 11.11.4 → 12.0.0-dev-286cdc0

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