@ionic/core 8.8.16-dev.11784841344.1aa1a41c → 8.8.16-dev.11784914346.10d0804c

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 (205) hide show
  1. package/components/ion-accordion.js +1 -1
  2. package/components/ion-action-sheet.js +1 -1
  3. package/components/ion-alert.js +1 -1
  4. package/components/ion-avatar.js +1 -1
  5. package/components/ion-back-button.js +1 -1
  6. package/components/ion-badge.js +1 -1
  7. package/components/ion-breadcrumb.js +1 -1
  8. package/components/ion-button.js +1 -1
  9. package/components/ion-buttons.js +1 -1
  10. package/components/ion-content.js +1 -1
  11. package/components/ion-datetime.js +1 -1
  12. package/components/ion-fab-button.js +1 -1
  13. package/components/ion-footer.js +1 -1
  14. package/components/ion-header.js +1 -1
  15. package/components/ion-icon.js +1 -1
  16. package/components/ion-input-password-toggle.js +1 -1
  17. package/components/ion-input.js +1 -1
  18. package/components/ion-item-option.js +1 -1
  19. package/components/ion-item.js +1 -1
  20. package/components/ion-menu-button.js +1 -1
  21. package/components/ion-refresher-content.js +1 -1
  22. package/components/ion-reorder.js +1 -1
  23. package/components/ion-searchbar.js +1 -1
  24. package/components/ion-segment-button.js +1 -1
  25. package/components/ion-select-modal.js +1 -1
  26. package/components/ion-select-popover.js +1 -1
  27. package/components/ion-select.js +1 -1
  28. package/components/ion-tab-bar.js +1 -1
  29. package/components/ion-tab-button.js +1 -1
  30. package/components/ion-title.js +1 -1
  31. package/components/ion-toast.js +1 -1
  32. package/components/ion-toggle.js +1 -1
  33. package/components/{p-DiKh2eQw.js → p-4u9RNymb.js} +1 -1
  34. package/components/{p-B8KYxaMx.js → p-B8xhFBOE.js} +1 -1
  35. package/components/p-BAnNwWMA.js +4 -0
  36. package/components/p-BYZR_5L4.js +4 -0
  37. package/components/p-B_zaqq5F.js +4 -0
  38. package/components/p-CO9VfZyc.js +4 -0
  39. package/components/p-Cjx0xPoU.js +4 -0
  40. package/components/p-CyWeCU8e.js +4 -0
  41. package/components/p-DRnK3A-V.js +4 -0
  42. package/components/p-DcVqGRkT.js +4 -0
  43. package/components/p-Dght1fh7.js +4 -0
  44. package/components/p-GpxJMpJu.js +4 -0
  45. package/dist/cjs/{index-Cu9JNpPi.js → index-CgAbCW6L.js} +1 -1
  46. package/dist/cjs/ion-accordion_2.cjs.entry.js +1 -1
  47. package/dist/cjs/ion-action-sheet.cjs.entry.js +3 -3
  48. package/dist/cjs/ion-alert.cjs.entry.js +3 -3
  49. package/dist/cjs/ion-app_8.cjs.entry.js +194 -65
  50. package/dist/cjs/ion-avatar_3.cjs.entry.js +4 -4
  51. package/dist/cjs/ion-back-button.cjs.entry.js +1 -1
  52. package/dist/cjs/ion-breadcrumb_2.cjs.entry.js +1 -1
  53. package/dist/cjs/ion-button_2.cjs.entry.js +3 -3
  54. package/dist/cjs/ion-datetime_3.cjs.entry.js +1 -1
  55. package/dist/cjs/ion-fab_3.cjs.entry.js +1 -1
  56. package/dist/cjs/ion-input-password-toggle.cjs.entry.js +1 -1
  57. package/dist/cjs/ion-input.cjs.entry.js +4 -4
  58. package/dist/cjs/ion-item-option_3.cjs.entry.js +1 -1
  59. package/dist/cjs/ion-item_8.cjs.entry.js +1 -1
  60. package/dist/cjs/ion-menu_3.cjs.entry.js +1 -1
  61. package/dist/cjs/ion-refresher_2.cjs.entry.js +1 -1
  62. package/dist/cjs/ion-reorder_2.cjs.entry.js +1 -1
  63. package/dist/cjs/ion-searchbar.cjs.entry.js +2 -2
  64. package/dist/cjs/ion-segment_2.cjs.entry.js +1 -1
  65. package/dist/cjs/ion-select-modal.cjs.entry.js +4 -4
  66. package/dist/cjs/ion-select_3.cjs.entry.js +5 -5
  67. package/dist/cjs/ion-tab-bar_2.cjs.entry.js +78 -80
  68. package/dist/cjs/ion-toggle.cjs.entry.js +1 -1
  69. package/dist/cjs/ionic.cjs.js +1 -1
  70. package/dist/cjs/loader.cjs.js +1 -1
  71. package/dist/cjs/scroll-hide-controller-G9HOmmhN.js +345 -0
  72. package/dist/collection/components/action-sheet/action-sheet.ionic.css +2 -5
  73. package/dist/collection/components/action-sheet/action-sheet.ios.css +2 -1
  74. package/dist/collection/components/action-sheet/action-sheet.md.css +2 -1
  75. package/dist/collection/components/alert/alert.ionic.css +2 -5
  76. package/dist/collection/components/alert/alert.ios.css +2 -1
  77. package/dist/collection/components/alert/alert.md.css +2 -1
  78. package/dist/collection/components/avatar/avatar.ionic.css +12 -6
  79. package/dist/collection/components/badge/badge.ionic.css +6 -3
  80. package/dist/collection/components/badge/badge.ios.css +4 -2
  81. package/dist/collection/components/badge/badge.md.css +2 -1
  82. package/dist/collection/components/button/button.ionic.css +4 -2
  83. package/dist/collection/components/buttons/buttons.ionic.css +1 -1
  84. package/dist/collection/components/content/content.css +39 -0
  85. package/dist/collection/components/footer/footer-interface.js +1 -0
  86. package/dist/collection/components/footer/footer.ios.css +19 -4
  87. package/dist/collection/components/footer/footer.js +102 -15
  88. package/dist/collection/components/footer/footer.md.css +28 -0
  89. package/dist/collection/components/header/header-interface.js +1 -0
  90. package/dist/collection/components/header/header.ionic.css +153 -0
  91. package/dist/collection/components/header/header.ios.css +153 -123
  92. package/dist/collection/components/header/header.js +139 -28
  93. package/dist/collection/components/header/header.md.css +176 -1
  94. package/dist/collection/components/header/header.utils.js +6 -13
  95. package/dist/collection/components/input/input.ionic.css +2 -1
  96. package/dist/collection/components/input/input.ios.css +2 -1
  97. package/dist/collection/components/input/input.md.css +2 -1
  98. package/dist/collection/components/item-option/item-option.ionic.css +2 -1
  99. package/dist/collection/components/searchbar/searchbar.ionic.css +6 -2
  100. package/dist/collection/components/segment-button/segment-button.ionic.css +2 -1
  101. package/dist/collection/components/select/select.ionic.css +2 -1
  102. package/dist/collection/components/select-modal/select-modal.ionic.css +2 -5
  103. package/dist/collection/components/select-modal/select-modal.ios.css +2 -1
  104. package/dist/collection/components/select-modal/select-modal.md.css +2 -1
  105. package/dist/collection/components/select-popover/select-popover.ionic.css +2 -5
  106. package/dist/collection/components/select-popover/select-popover.ios.css +2 -1
  107. package/dist/collection/components/select-popover/select-popover.md.css +2 -1
  108. package/dist/collection/components/tab-bar/tab-bar.ionic.css +25 -3
  109. package/dist/collection/components/tab-bar/tab-bar.ios.css +15 -0
  110. package/dist/collection/components/tab-bar/tab-bar.js +94 -88
  111. package/dist/collection/components/tab-bar/tab-bar.md.css +15 -0
  112. package/dist/collection/components/tab-button/tab-button.ionic.css +2 -1
  113. package/dist/collection/components/title/title.md.css +7 -0
  114. package/dist/collection/utils/scroll-hide-controller.js +178 -0
  115. package/dist/docs.json +144 -32
  116. package/dist/esm/{index-1y3VhUSy.js → index-D2tu5BUg.js} +1 -1
  117. package/dist/esm/ion-accordion_2.entry.js +1 -1
  118. package/dist/esm/ion-action-sheet.entry.js +3 -3
  119. package/dist/esm/ion-alert.entry.js +3 -3
  120. package/dist/esm/ion-app_8.entry.js +194 -65
  121. package/dist/esm/ion-avatar_3.entry.js +4 -4
  122. package/dist/esm/ion-back-button.entry.js +1 -1
  123. package/dist/esm/ion-breadcrumb_2.entry.js +1 -1
  124. package/dist/esm/ion-button_2.entry.js +3 -3
  125. package/dist/esm/ion-datetime_3.entry.js +1 -1
  126. package/dist/esm/ion-fab_3.entry.js +1 -1
  127. package/dist/esm/ion-input-password-toggle.entry.js +1 -1
  128. package/dist/esm/ion-input.entry.js +4 -4
  129. package/dist/esm/ion-item-option_3.entry.js +1 -1
  130. package/dist/esm/ion-item_8.entry.js +1 -1
  131. package/dist/esm/ion-menu_3.entry.js +1 -1
  132. package/dist/esm/ion-refresher_2.entry.js +1 -1
  133. package/dist/esm/ion-reorder_2.entry.js +1 -1
  134. package/dist/esm/ion-searchbar.entry.js +2 -2
  135. package/dist/esm/ion-segment_2.entry.js +1 -1
  136. package/dist/esm/ion-select-modal.entry.js +4 -4
  137. package/dist/esm/ion-select_3.entry.js +5 -5
  138. package/dist/esm/ion-tab-bar_2.entry.js +79 -81
  139. package/dist/esm/ion-toggle.entry.js +1 -1
  140. package/dist/esm/ionic.js +1 -1
  141. package/dist/esm/loader.js +1 -1
  142. package/dist/esm/scroll-hide-controller-CUNW7EpD.js +342 -0
  143. package/dist/html.html-data.json +36 -4
  144. package/dist/ionic/ionic.esm.js +1 -1
  145. package/dist/ionic/p-07bd8446.entry.js +4 -0
  146. package/dist/ionic/p-103e1d9f.entry.js +4 -0
  147. package/dist/ionic/{p-eeb7b373.entry.js → p-18bc4f2d.entry.js} +1 -1
  148. package/dist/ionic/p-248265c2.entry.js +4 -0
  149. package/dist/ionic/{p-fb457fdd.entry.js → p-3bc5b5e9.entry.js} +1 -1
  150. package/dist/ionic/{p-42a882b7.entry.js → p-43b00c5b.entry.js} +1 -1
  151. package/dist/ionic/{p-d0f253fc.entry.js → p-56224b93.entry.js} +1 -1
  152. package/dist/ionic/p-5732396e.entry.js +4 -0
  153. package/dist/ionic/{p-b3d04a86.entry.js → p-58d8877d.entry.js} +1 -1
  154. package/dist/ionic/{p-9e9be378.entry.js → p-5d079dc1.entry.js} +1 -1
  155. package/dist/ionic/{p-d0dfc9a3.entry.js → p-5e9665dd.entry.js} +1 -1
  156. package/dist/ionic/{p-7b2fe639.entry.js → p-5fee5cc1.entry.js} +1 -1
  157. package/dist/ionic/p-64734604.entry.js +4 -0
  158. package/dist/ionic/p-69feeff9.entry.js +4 -0
  159. package/dist/ionic/p-83acfa2d.entry.js +4 -0
  160. package/dist/ionic/{p-f692219d.entry.js → p-849b1759.entry.js} +1 -1
  161. package/dist/ionic/{p-a09c7a4c.entry.js → p-86f040e0.entry.js} +1 -1
  162. package/dist/ionic/p-8cb23f27.entry.js +4 -0
  163. package/dist/ionic/p-C1I_d964.js +4 -0
  164. package/dist/ionic/p-b97778f5.entry.js +4 -0
  165. package/dist/ionic/p-be9db7e8.entry.js +4 -0
  166. package/dist/ionic/{p-2fba8f15.entry.js → p-c04429f2.entry.js} +1 -1
  167. package/dist/ionic/p-c25a2a9b.entry.js +4 -0
  168. package/dist/ionic/{p-a797625e.entry.js → p-d272ff4f.entry.js} +1 -1
  169. package/dist/types/components/footer/footer-interface.d.ts +1 -0
  170. package/dist/types/components/footer/footer.d.ts +16 -0
  171. package/dist/types/components/header/header-interface.d.ts +1 -0
  172. package/dist/types/components/header/header.d.ts +17 -0
  173. package/dist/types/components/header/header.utils.d.ts +4 -5
  174. package/dist/types/components/tab-bar/tab-bar-interface.d.ts +1 -0
  175. package/dist/types/components/tab-bar/tab-bar.d.ts +17 -14
  176. package/dist/types/components.d.ts +37 -13
  177. package/dist/types/utils/scroll-hide-controller.d.ts +56 -0
  178. package/hydrate/index.js +477 -175
  179. package/hydrate/index.mjs +477 -175
  180. package/package.json +2 -2
  181. package/components/p-BZwQa9ey.js +0 -4
  182. package/components/p-CJCMdFb9.js +0 -4
  183. package/components/p-Ck_9SoHZ.js +0 -4
  184. package/components/p-CmnPD02Z.js +0 -4
  185. package/components/p-D-Xa9lMG.js +0 -4
  186. package/components/p-DFSqPtzD.js +0 -4
  187. package/components/p-NPsFR8Ng.js +0 -4
  188. package/components/p-U2gyA6Z0.js +0 -4
  189. package/components/p-q8wGOPJB.js +0 -4
  190. package/dist/cjs/keyboard-controller-CefyW9lm.js +0 -169
  191. package/dist/esm/keyboard-controller-BFwRdk2T.js +0 -167
  192. package/dist/ionic/p-0c4d9d7c.entry.js +0 -4
  193. package/dist/ionic/p-40dc9dbd.entry.js +0 -4
  194. package/dist/ionic/p-54419365.entry.js +0 -4
  195. package/dist/ionic/p-6293e9f1.entry.js +0 -4
  196. package/dist/ionic/p-7de397c7.entry.js +0 -4
  197. package/dist/ionic/p-8cf82b85.entry.js +0 -4
  198. package/dist/ionic/p-MqqcZQSB.js +0 -4
  199. package/dist/ionic/p-a6e04ca3.entry.js +0 -4
  200. package/dist/ionic/p-a6fe63f0.entry.js +0 -4
  201. package/dist/ionic/p-b275f17e.entry.js +0 -4
  202. package/dist/ionic/p-c5635175.entry.js +0 -4
  203. package/dist/ionic/p-dc8e0b91.entry.js +0 -4
  204. /package/components/{p-J03hHbbL.js → p-BaPtaYEC.js} +0 -0
  205. /package/dist/ionic/{p-1y3VhUSy.js → p-D2tu5BUg.js} +0 -0
@@ -1,14 +1,14 @@
1
1
  /*!
2
2
  * (C) Ionic http://ionicframework.com - MIT License
3
3
  */
4
- import { r as registerInstance, h, e as config, d as Host, g as getElement, c as createEvent, a as readTask, i as forceUpdate, w as writeTask, j as printIonError } from './index-C0EQceqV.js';
4
+ import { r as registerInstance, h, e as config, d as Host, g as getElement, c as createEvent, a as readTask, i as forceUpdate, w as writeTask, f as printIonWarning, j as printIonError } from './index-C0EQceqV.js';
5
5
  import { focusElements } from './focus-visible-vXpMhGrs.js';
6
6
  import { c as getIonTheme, a as isPlatform, b as getIonMode } from './ionic-global-BpkTponr.js';
7
7
  import { i as inheritAriaAttributes, h as hasLazyBuild, c as componentOnReady, e as clamp, s as shallowEqualStringMap } from './helpers-DfF5_wJc.js';
8
8
  import { i as isRTL } from './dir-C53feagD.js';
9
9
  import { c as createColorClasses, h as hostContext } from './theme-DaJxRxSQ.js';
10
10
  import { a as findIonContent, p as printIonContentErrorMsg, g as getScrollElement } from './index-KxK0gcRp.js';
11
- import { c as createKeyboardController } from './keyboard-controller-BFwRdk2T.js';
11
+ import { c as createScrollHideController, a as createKeyboardController } from './scroll-hide-controller-CUNW7EpD.js';
12
12
  import { g as getTimeGivenProgression } from './cubic-bezier-hHmYLOfE.js';
13
13
  import { a as attachComponent, d as detachComponent } from './framework-delegate-DO2QXccA.js';
14
14
  import { c as createLockController } from './lock-controller-B-hirT0v.js';
@@ -52,7 +52,7 @@ const App = class {
52
52
  };
53
53
  App.style = appCss();
54
54
 
55
- const buttonsIonicCss = () => `.sc-ion-buttons-ionic-h{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-webkit-transform:translateZ(0);transform:translateZ(0)}.sc-ion-buttons-ionic-s ion-button{--padding-top:0;--padding-bottom:0;margin-left:0;margin-right:0;margin-top:0;margin-bottom:0}.sc-ion-buttons-ionic-s .button-has-icon-only{--padding-top:0;--padding-bottom:0}.sc-ion-buttons-ionic-s .button-clear{--color:var(--token-text-default, var(--token-primitives-neutral-1200, #242424));--background:transparent;--background-activated:transparent;--background-focused:transparent;--background-hover:transparent}.sc-ion-buttons-ionic-s .button-has-icon-only{width:var(--token-scale-1000, 40px);height:var(--token-scale-1000, 40px)}.sc-ion-buttons-ionic-s ion-icon[slot=icon-only]{font-size:var(--token-font-size-500, 1.25rem)}`;
55
+ const buttonsIonicCss = () => `.sc-ion-buttons-ionic-h{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-webkit-transform:translateZ(0);transform:translateZ(0)}.sc-ion-buttons-ionic-s ion-button{--padding-top:0;--padding-bottom:0;margin-left:0;margin-right:0;margin-top:0;margin-bottom:0}.sc-ion-buttons-ionic-s .button-has-icon-only{--padding-top:0;--padding-bottom:0}.sc-ion-buttons-ionic-s .button-clear{--color:var(--token-text-default, var(--token-primitives-neutral-1200, #242424));--background:transparent;--background-activated:transparent;--background-focused:transparent;--background-hover:transparent}.sc-ion-buttons-ionic-s .button-has-icon-only{width:var(--token-scale-1000, 40px);height:var(--token-scale-1000, 40px)}.sc-ion-buttons-ionic-s ion-icon[slot=icon-only]{font-size:var(--token-font-size-600, 1.5rem)}`;
56
56
 
57
57
  const buttonsIosCss = () => `.sc-ion-buttons-ios-h{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-webkit-transform:translateZ(0);transform:translateZ(0)}.sc-ion-buttons-ios-s ion-button{--padding-top:0;--padding-bottom:0;margin-left:0;margin-right:0;margin-top:0;margin-bottom:0}.sc-ion-buttons-ios-h{z-index:99}.sc-ion-buttons-ios-s ion-button{--padding-top:0;--padding-bottom:0;margin-left:0;margin-right:0;margin-top:0;margin-bottom:0}.sc-ion-buttons-ios-s ion-button{--padding-top:3px;--padding-bottom:3px;--padding-start:5px;--padding-end:5px;-webkit-margin-start:2px;margin-inline-start:2px;-webkit-margin-end:2px;margin-inline-end:2px;min-height:32px}.sc-ion-buttons-ios-s .button-has-icon-only{--padding-top:0;--padding-bottom:0}.sc-ion-buttons-ios-s ion-button:not(.button-round){--border-radius:4px}.sc-ion-buttons-ios-h.ion-color.sc-ion-buttons-ios-s .button,.ion-color .sc-ion-buttons-ios-h.sc-ion-buttons-ios-s .button{--color:initial;--border-color:initial;--background-focused:var(--ion-color-contrast)}.sc-ion-buttons-ios-h.ion-color.sc-ion-buttons-ios-s .button-solid,.ion-color .sc-ion-buttons-ios-h.sc-ion-buttons-ios-s .button-solid{--background:var(--ion-color-contrast);--background-focused:#000;--background-focused-opacity:0.12;--background-activated:#000;--background-activated-opacity:0.12;--background-hover:var(--ion-color-base);--background-hover-opacity:0.45;--color:var(--ion-color-base);--color-focused:var(--ion-color-base)}.sc-ion-buttons-ios-h.ion-color.sc-ion-buttons-ios-s .button-clear,.ion-color .sc-ion-buttons-ios-h.sc-ion-buttons-ios-s .button-clear{--color-activated:var(--ion-color-contrast);--color-focused:var(--ion-color-contrast)}.sc-ion-buttons-ios-h.ion-color.sc-ion-buttons-ios-s .button-outline,.ion-color .sc-ion-buttons-ios-h.sc-ion-buttons-ios-s .button-outline{--color-activated:var(--ion-color-base);--color-focused:var(--ion-color-contrast);--background-activated:var(--ion-color-contrast)}.sc-ion-buttons-ios-s .button-clear,.sc-ion-buttons-ios-s .button-outline{--background-activated:transparent;--background-focused:currentColor;--background-hover:transparent}.sc-ion-buttons-ios-s .button-solid:not(.ion-color){--background-focused:#000;--background-focused-opacity:0.12;--background-activated:#000;--background-activated-opacity:0.12}.sc-ion-buttons-ios-s ion-icon[slot=start]{margin-left:0;margin-right:0;margin-top:0;margin-bottom:0;-webkit-margin-end:0.3em;margin-inline-end:0.3em;font-size:1.41em;line-height:0.67}.sc-ion-buttons-ios-s ion-icon[slot=end]{margin-left:0;margin-right:0;margin-top:0;margin-bottom:0;-webkit-margin-start:0.4em;margin-inline-start:0.4em;font-size:1.41em;line-height:0.67}.sc-ion-buttons-ios-s ion-icon[slot=icon-only]{padding-left:0;padding-right:0;padding-top:0;padding-bottom:0;margin-left:0;margin-right:0;margin-top:0;margin-bottom:0;font-size:1.65em;line-height:0.67}`;
58
58
 
@@ -89,7 +89,7 @@ Buttons.style = {
89
89
  md: buttonsMdCss()
90
90
  };
91
91
 
92
- const contentCss = () => `:host{--background:var(--ion-background-color, #fff);--color:var(--ion-text-color, #000);--padding-top:0px;--padding-bottom:0px;--padding-start:0px;--padding-end:0px;--keyboard-offset:0px;--offset-top:0px;--offset-bottom:0px;--overflow:auto;display:block;position:relative;-ms-flex:1;flex:1;width:100%;height:100%;margin:0 !important;padding:0 !important;font-family:var(--ion-font-family, inherit);contain:size style}:host(.ion-color) .inner-scroll{background:var(--ion-color-base);color:var(--ion-color-contrast)}#background-content{right:0px;left:0px;top:calc(var(--offset-top) * -1);bottom:calc(var(--offset-bottom) * -1);position:absolute;background:var(--background)}.inner-scroll{right:0px;left:0px;top:calc(var(--offset-top) * -1);bottom:calc(var(--offset-bottom) * -1);-webkit-padding-start:var(--padding-start);padding-inline-start:var(--padding-start);-webkit-padding-end:var(--padding-end);padding-inline-end:var(--padding-end);padding-top:calc(var(--padding-top) + var(--offset-top));padding-bottom:calc(var(--padding-bottom) + var(--keyboard-offset) + var(--offset-bottom) + var(--internal-content-safe-area-padding-bottom, 0px));position:absolute;color:var(--color);-webkit-box-sizing:border-box;box-sizing:border-box;overflow:hidden;-ms-touch-action:pan-x pan-y pinch-zoom;touch-action:pan-x pan-y pinch-zoom}.scroll-y,.scroll-x{-webkit-overflow-scrolling:touch;z-index:0;will-change:scroll-position}.scroll-y{overflow-y:var(--overflow);overscroll-behavior-y:contain}.scroll-x{overflow-x:var(--overflow);overscroll-behavior-x:contain}.overscroll::before,.overscroll::after{position:absolute;width:1px;height:1px;content:""}.overscroll::before{bottom:-1px}.overscroll::after{top:-1px}:host(.content-sizing){display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;min-height:0;contain:none}:host(.content-sizing) .inner-scroll{position:relative;top:0;bottom:0;margin-top:calc(var(--offset-top) * -1);margin-bottom:calc(var(--offset-bottom) * -1)}.transition-effect{display:none;position:absolute;width:100%;height:100vh;opacity:0;pointer-events:none}:host(.content-ltr) .transition-effect{left:-100%;}:host(.content-rtl) .transition-effect{right:-100%;}.transition-cover{position:absolute;right:0;width:100%;height:100%;background:black;opacity:0.1}.transition-shadow{display:block;position:absolute;width:100%;height:100%;-webkit-box-shadow:inset -9px 0 9px 0 rgba(0, 0, 100, 0.03);box-shadow:inset -9px 0 9px 0 rgba(0, 0, 100, 0.03)}:host(.content-ltr) .transition-shadow{right:0;}:host(.content-rtl) .transition-shadow{left:0;-webkit-transform:scaleX(-1);transform:scaleX(-1)}::slotted([slot=fixed]){position:absolute;-webkit-transform:translateZ(0);transform:translateZ(0)}`;
92
+ const contentCss = () => `:host{--background:var(--ion-background-color, #fff);--color:var(--ion-text-color, #000);--padding-top:0px;--padding-bottom:0px;--padding-start:0px;--padding-end:0px;--keyboard-offset:0px;--offset-top:0px;--offset-bottom:0px;--overflow:auto;display:block;position:relative;-ms-flex:1;flex:1;width:100%;height:100%;margin:0 !important;padding:0 !important;font-family:var(--ion-font-family, inherit);contain:size style}:host(.ion-color) .inner-scroll{background:var(--ion-color-base);color:var(--ion-color-contrast)}#background-content{right:0px;left:0px;top:calc(var(--offset-top) * -1);bottom:calc(var(--offset-bottom) * -1);position:absolute;background:var(--background)}.inner-scroll{right:0px;left:0px;top:calc(var(--offset-top) * -1);bottom:calc(var(--offset-bottom) * -1);-webkit-padding-start:var(--padding-start);padding-inline-start:var(--padding-start);-webkit-padding-end:var(--padding-end);padding-inline-end:var(--padding-end);padding-top:calc(var(--padding-top) + var(--offset-top));padding-bottom:calc(var(--padding-bottom) + var(--keyboard-offset) + var(--offset-bottom) + var(--internal-content-safe-area-padding-bottom, 0px));position:absolute;color:var(--color);-webkit-box-sizing:border-box;box-sizing:border-box;overflow:hidden;-ms-touch-action:pan-x pan-y pinch-zoom;touch-action:pan-x pan-y pinch-zoom}.scroll-y,.scroll-x{-webkit-overflow-scrolling:touch;z-index:0;will-change:scroll-position}.scroll-y{overflow-y:var(--overflow);overscroll-behavior-y:contain}.scroll-x{overflow-x:var(--overflow);overscroll-behavior-x:contain}.overscroll::before,.overscroll::after{position:absolute;width:1px;height:1px;content:""}.overscroll::before{bottom:-1px}.overscroll::after{top:-1px}:host(.content-sizing){display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;min-height:0;contain:none}:host(.content-sizing) .inner-scroll{position:relative;top:0;bottom:0;margin-top:calc(var(--offset-top) * -1);margin-bottom:calc(var(--offset-bottom) * -1)}.transition-effect{display:none;position:absolute;width:100%;height:100vh;opacity:0;pointer-events:none}:host(.content-ltr) .transition-effect{left:-100%;}:host(.content-rtl) .transition-effect{right:-100%;}.transition-cover{position:absolute;right:0;width:100%;height:100%;background:black;opacity:0.1}.transition-shadow{display:block;position:absolute;width:100%;height:100%;-webkit-box-shadow:inset -9px 0 9px 0 rgba(0, 0, 100, 0.03);box-shadow:inset -9px 0 9px 0 rgba(0, 0, 100, 0.03)}:host(.content-ltr) .transition-shadow{right:0;}:host(.content-rtl) .transition-shadow{left:0;-webkit-transform:scaleX(-1);transform:scaleX(-1)}::slotted([slot=fixed]){position:absolute;-webkit-transform:translateZ(0);transform:translateZ(0)}:host(.content-header-hide-scroll-partner:not(.content-fullscreen)) .inner-scroll{-webkit-transition:height 300ms cubic-bezier(0, 0, 0.2, 1), -webkit-transform 300ms cubic-bezier(0, 0, 0.2, 1);transition:height 300ms cubic-bezier(0, 0, 0.2, 1), -webkit-transform 300ms cubic-bezier(0, 0, 0.2, 1);transition:transform 300ms cubic-bezier(0, 0, 0.2, 1), height 300ms cubic-bezier(0, 0, 0.2, 1);transition:transform 300ms cubic-bezier(0, 0, 0.2, 1), height 300ms cubic-bezier(0, 0, 0.2, 1), -webkit-transform 300ms cubic-bezier(0, 0, 0.2, 1)}:host(.content-header-hide-scroll-partner:not(.content-fullscreen).content-header-hide-scroll-hidden) .inner-scroll{height:calc(100% + var(--internal-header-hide-height, 0px));-webkit-transform:translateY(calc(-1 * var(--internal-header-hide-height, 0px)));transform:translateY(calc(-1 * var(--internal-header-hide-height, 0px)));-webkit-transition:height 200ms cubic-bezier(0.4, 0, 1, 1), -webkit-transform 200ms cubic-bezier(0.4, 0, 1, 1);transition:height 200ms cubic-bezier(0.4, 0, 1, 1), -webkit-transform 200ms cubic-bezier(0.4, 0, 1, 1);transition:transform 200ms cubic-bezier(0.4, 0, 1, 1), height 200ms cubic-bezier(0.4, 0, 1, 1);transition:transform 200ms cubic-bezier(0.4, 0, 1, 1), height 200ms cubic-bezier(0.4, 0, 1, 1), -webkit-transform 200ms cubic-bezier(0.4, 0, 1, 1)}:host(.content-footer-hide-scroll-partner:not(.content-fullscreen)) .inner-scroll{-webkit-transition:height 200ms cubic-bezier(0.16, 1, 0.3, 1);transition:height 200ms cubic-bezier(0.16, 1, 0.3, 1)}:host(.content-footer-hide-scroll-partner:not(.content-fullscreen).content-footer-hide-scroll-hidden) .inner-scroll{height:calc(100% + var(--internal-footer-hide-height, 0px));-webkit-transition:height 350ms cubic-bezier(0.4, 0, 1, 1);transition:height 350ms cubic-bezier(0.4, 0, 1, 1)}:host(.content-tab-bar-hide-scroll-partner:not(.content-fullscreen)) .inner-scroll{-webkit-transition:height 200ms cubic-bezier(0.16, 1, 0.3, 1);transition:height 200ms cubic-bezier(0.16, 1, 0.3, 1)}:host(.content-tab-bar-hide-scroll-partner:not(.content-fullscreen).content-tab-bar-hide-scroll-hidden) .inner-scroll{height:calc(100% + var(--internal-tab-bar-hide-height, 0px));-webkit-transition:height 350ms cubic-bezier(0.4, 0, 1, 1);transition:height 350ms cubic-bezier(0.4, 0, 1, 1)}@media (prefers-reduced-motion: reduce){:host(.content-header-hide-scroll-partner:not(.content-fullscreen)) .inner-scroll,:host(.content-header-hide-scroll-partner:not(.content-fullscreen).content-header-hide-scroll-hidden) .inner-scroll,:host(.content-footer-hide-scroll-partner:not(.content-fullscreen)) .inner-scroll,:host(.content-footer-hide-scroll-partner:not(.content-fullscreen).content-footer-hide-scroll-hidden) .inner-scroll,:host(.content-tab-bar-hide-scroll-partner:not(.content-fullscreen)) .inner-scroll,:host(.content-tab-bar-hide-scroll-partner:not(.content-fullscreen).content-tab-bar-hide-scroll-hidden) .inner-scroll{-webkit-transition:none;transition:none}}`;
93
93
 
94
94
  const Content = class {
95
95
  constructor(hostRef) {
@@ -559,17 +559,20 @@ const handleFooterFade = (scrollEl, baseEl) => {
559
559
  });
560
560
  };
561
561
 
562
- const ionicFooterMdCss = () => `ion-footer{display:block;position:relative;-ms-flex-order:1;order:1;width:100%;z-index:10}ion-footer.footer-toolbar-padding ion-toolbar:last-of-type{padding-bottom:var(--ion-safe-area-bottom, 0)}.footer-md{-webkit-box-shadow:0 2px 4px -1px rgba(0, 0, 0, 0.2), 0 4px 5px 0 rgba(0, 0, 0, 0.14), 0 1px 10px 0 rgba(0, 0, 0, 0.12);box-shadow:0 2px 4px -1px rgba(0, 0, 0, 0.2), 0 4px 5px 0 rgba(0, 0, 0, 0.14), 0 1px 10px 0 rgba(0, 0, 0, 0.12)}.footer-md.ion-no-border{-webkit-box-shadow:none;box-shadow:none}`;
562
+ const ionicFooterMdCss = () => `ion-footer{display:block;position:relative;-ms-flex-order:1;order:1;width:100%;z-index:10}ion-footer.footer-toolbar-padding ion-toolbar:last-of-type{padding-bottom:var(--ion-safe-area-bottom, 0)}.footer-collapse-fade ion-toolbar{--opacity-scale:inherit}ion-footer.footer-scroll-effect-hide{-webkit-transition:-webkit-transform 200ms cubic-bezier(0.16, 1, 0.3, 1);transition:-webkit-transform 200ms cubic-bezier(0.16, 1, 0.3, 1);transition:transform 200ms cubic-bezier(0.16, 1, 0.3, 1);transition:transform 200ms cubic-bezier(0.16, 1, 0.3, 1), -webkit-transform 200ms cubic-bezier(0.16, 1, 0.3, 1)}ion-footer.footer-scroll-effect-hide.footer-scroll-hidden{-webkit-transform:translateY(100%);transform:translateY(100%);-webkit-transition:-webkit-transform 350ms cubic-bezier(0.4, 0, 1, 1);transition:-webkit-transform 350ms cubic-bezier(0.4, 0, 1, 1);transition:transform 350ms cubic-bezier(0.4, 0, 1, 1);transition:transform 350ms cubic-bezier(0.4, 0, 1, 1), -webkit-transform 350ms cubic-bezier(0.4, 0, 1, 1)}@media (prefers-reduced-motion: reduce){ion-footer.footer-scroll-effect-hide,ion-footer.footer-scroll-effect-hide.footer-scroll-hidden{-webkit-transition:none;transition:none}}.footer-md{-webkit-box-shadow:0 2px 4px -1px rgba(0, 0, 0, 0.2), 0 4px 5px 0 rgba(0, 0, 0, 0.14), 0 1px 10px 0 rgba(0, 0, 0, 0.12);box-shadow:0 2px 4px -1px rgba(0, 0, 0, 0.2), 0 4px 5px 0 rgba(0, 0, 0, 0.14), 0 1px 10px 0 rgba(0, 0, 0, 0.12)}.footer-md.footer-collapse-fade{-webkit-box-shadow:none;box-shadow:none}.footer-md.ion-no-border{-webkit-box-shadow:none;box-shadow:none}`;
563
563
 
564
- const footerIosCss = () => `ion-footer{display:block;position:relative;-ms-flex-order:1;order:1;width:100%;z-index:10}ion-footer.footer-toolbar-padding ion-toolbar:last-of-type{padding-bottom:var(--ion-safe-area-bottom, 0)}.footer-ios ion-toolbar:first-of-type{--border-width:0.55px 0 0}@supports ((-webkit-backdrop-filter: blur(0)) or (backdrop-filter: blur(0))){.footer-background{right:0;left:0;top:0;bottom:0;position:absolute;-webkit-backdrop-filter:saturate(180%) blur(20px);backdrop-filter:saturate(180%) blur(20px)}.footer-translucent-ios ion-toolbar{--opacity:0.8}}.footer-ios.ion-no-border ion-toolbar:first-of-type{--border-width:0}.footer-collapse-fade ion-toolbar{--opacity-scale:inherit}`;
564
+ const footerIosCss = () => `ion-footer{display:block;position:relative;-ms-flex-order:1;order:1;width:100%;z-index:10}ion-footer.footer-toolbar-padding ion-toolbar:last-of-type{padding-bottom:var(--ion-safe-area-bottom, 0)}.footer-collapse-fade ion-toolbar{--opacity-scale:inherit}ion-footer.footer-scroll-effect-hide{-webkit-transition:-webkit-transform 200ms cubic-bezier(0.16, 1, 0.3, 1);transition:-webkit-transform 200ms cubic-bezier(0.16, 1, 0.3, 1);transition:transform 200ms cubic-bezier(0.16, 1, 0.3, 1);transition:transform 200ms cubic-bezier(0.16, 1, 0.3, 1), -webkit-transform 200ms cubic-bezier(0.16, 1, 0.3, 1)}ion-footer.footer-scroll-effect-hide.footer-scroll-hidden{-webkit-transform:translateY(100%);transform:translateY(100%);-webkit-transition:-webkit-transform 350ms cubic-bezier(0.4, 0, 1, 1);transition:-webkit-transform 350ms cubic-bezier(0.4, 0, 1, 1);transition:transform 350ms cubic-bezier(0.4, 0, 1, 1);transition:transform 350ms cubic-bezier(0.4, 0, 1, 1), -webkit-transform 350ms cubic-bezier(0.4, 0, 1, 1)}@media (prefers-reduced-motion: reduce){ion-footer.footer-scroll-effect-hide,ion-footer.footer-scroll-effect-hide.footer-scroll-hidden{-webkit-transition:none;transition:none}}.footer-ios ion-toolbar:first-of-type{--border-width:0.55px 0 0}@supports ((-webkit-backdrop-filter: blur(0)) or (backdrop-filter: blur(0))){.footer-background{right:0;left:0;top:0;bottom:0;position:absolute;-webkit-backdrop-filter:saturate(180%) blur(20px);backdrop-filter:saturate(180%) blur(20px)}.footer-translucent-ios ion-toolbar{--opacity:0.8}}.footer-ios.ion-no-border ion-toolbar:first-of-type{--border-width:0}`;
565
565
 
566
- const footerMdCss = () => `ion-footer{display:block;position:relative;-ms-flex-order:1;order:1;width:100%;z-index:10}ion-footer.footer-toolbar-padding ion-toolbar:last-of-type{padding-bottom:var(--ion-safe-area-bottom, 0)}.footer-md{-webkit-box-shadow:0 2px 4px -1px rgba(0, 0, 0, 0.2), 0 4px 5px 0 rgba(0, 0, 0, 0.14), 0 1px 10px 0 rgba(0, 0, 0, 0.12);box-shadow:0 2px 4px -1px rgba(0, 0, 0, 0.2), 0 4px 5px 0 rgba(0, 0, 0, 0.14), 0 1px 10px 0 rgba(0, 0, 0, 0.12)}.footer-md.ion-no-border{-webkit-box-shadow:none;box-shadow:none}`;
566
+ const footerMdCss = () => `ion-footer{display:block;position:relative;-ms-flex-order:1;order:1;width:100%;z-index:10}ion-footer.footer-toolbar-padding ion-toolbar:last-of-type{padding-bottom:var(--ion-safe-area-bottom, 0)}.footer-collapse-fade ion-toolbar{--opacity-scale:inherit}ion-footer.footer-scroll-effect-hide{-webkit-transition:-webkit-transform 200ms cubic-bezier(0.16, 1, 0.3, 1);transition:-webkit-transform 200ms cubic-bezier(0.16, 1, 0.3, 1);transition:transform 200ms cubic-bezier(0.16, 1, 0.3, 1);transition:transform 200ms cubic-bezier(0.16, 1, 0.3, 1), -webkit-transform 200ms cubic-bezier(0.16, 1, 0.3, 1)}ion-footer.footer-scroll-effect-hide.footer-scroll-hidden{-webkit-transform:translateY(100%);transform:translateY(100%);-webkit-transition:-webkit-transform 350ms cubic-bezier(0.4, 0, 1, 1);transition:-webkit-transform 350ms cubic-bezier(0.4, 0, 1, 1);transition:transform 350ms cubic-bezier(0.4, 0, 1, 1);transition:transform 350ms cubic-bezier(0.4, 0, 1, 1), -webkit-transform 350ms cubic-bezier(0.4, 0, 1, 1)}@media (prefers-reduced-motion: reduce){ion-footer.footer-scroll-effect-hide,ion-footer.footer-scroll-effect-hide.footer-scroll-hidden{-webkit-transition:none;transition:none}}.footer-md{-webkit-box-shadow:0 2px 4px -1px rgba(0, 0, 0, 0.2), 0 4px 5px 0 rgba(0, 0, 0, 0.14), 0 1px 10px 0 rgba(0, 0, 0, 0.12);box-shadow:0 2px 4px -1px rgba(0, 0, 0, 0.2), 0 4px 5px 0 rgba(0, 0, 0, 0.14), 0 1px 10px 0 rgba(0, 0, 0, 0.12)}.footer-md.footer-collapse-fade{-webkit-box-shadow:none;box-shadow:none}.footer-md.ion-no-border{-webkit-box-shadow:none;box-shadow:none}`;
567
567
 
568
568
  const Footer = class {
569
569
  constructor(hostRef) {
570
570
  registerInstance(this, hostRef);
571
571
  this.keyboardCtrl = null;
572
572
  this.keyboardCtrlPromise = null;
573
+ this.scrollHideCtrlPromise = null;
574
+ this.hasWarnedCollapse = false;
575
+ this.fadeSetupId = 0;
573
576
  this.keyboardVisible = false;
574
577
  /**
575
578
  * If `true`, the footer will be translucent.
@@ -580,27 +583,66 @@ const Footer = class {
580
583
  * attribute needs to be set on the content.
581
584
  */
582
585
  this.translucent = false;
583
- this.checkCollapsibleFooter = () => {
584
- const theme = getIonTheme(this);
585
- if (theme !== 'ios') {
586
+ this.checkCollapsibleFooter = async () => {
587
+ const { scrollEffect, collapse } = this;
588
+ if (collapse !== undefined && scrollEffect === undefined && !this.hasWarnedCollapse) {
589
+ this.hasWarnedCollapse = true;
590
+ printIonWarning(`[ion-footer] - The \`collapse\` property is deprecated. Use \`scrollEffect\` instead.\nExample: <ion-footer scroll-effect="${collapse}">`, this.el);
591
+ }
592
+ const effect = scrollEffect !== null && scrollEffect !== void 0 ? scrollEffect : collapse;
593
+ // Skip teardown/rebuild if the effect hasn't changed.
594
+ // This prevents keyboard toggles (which trigger re-renders via
595
+ // @State keyboardVisible) from destroying the scroll controller
596
+ // and resetting isHidden.
597
+ if (effect === this.activeEffect) {
586
598
  return;
587
599
  }
588
- const { collapse } = this;
589
- const hasFade = collapse === 'fade';
600
+ const hasHide = effect === 'hide';
601
+ const hasFade = effect === 'fade';
590
602
  this.destroyCollapsibleFooter();
591
- if (hasFade) {
592
- const appRootSelector = config.get('appRootSelector', 'ion-app');
593
- const pageEl = this.el.closest(`${appRootSelector},ion-page,.ion-page,page-inner`);
594
- const contentEl = pageEl ? findIonContent(pageEl) : null;
603
+ const appRootSelector = config.get('appRootSelector', 'ion-app');
604
+ const pageEl = this.el.closest(`${appRootSelector}, ion-page, .ion-page, page-inner`);
605
+ const contentEl = pageEl ? findIonContent(pageEl) : null;
606
+ if (hasHide && contentEl) {
607
+ this.activeEffect = effect;
608
+ await this.setupScrollEffectHide(contentEl);
609
+ return;
610
+ }
611
+ // fade via the deprecated `collapse` prop is iOS-only.
612
+ // fade via the new `scrollEffect` prop works in all themes.
613
+ const isModeRestricted = scrollEffect === undefined && getIonTheme(this) !== 'ios';
614
+ if (hasFade && !isModeRestricted) {
595
615
  if (!contentEl) {
596
616
  printIonContentErrorMsg(this.el);
597
617
  return;
598
618
  }
599
619
  this.setupFadeFooter(contentEl);
620
+ this.activeEffect = effect;
621
+ }
622
+ };
623
+ this.setupScrollEffectHide = async (contentEl) => {
624
+ const setupPromise = createScrollHideController(contentEl, {
625
+ el: this.el,
626
+ cssVar: '--internal-footer-hide-height',
627
+ hiddenClass: 'footer-scroll-hidden',
628
+ contentPartnerClass: 'content-footer-hide-scroll-partner',
629
+ contentHiddenClass: 'content-footer-hide-scroll-hidden',
630
+ });
631
+ this.scrollHideCtrlPromise = setupPromise;
632
+ const controller = await setupPromise;
633
+ if (this.scrollHideCtrlPromise === setupPromise) {
634
+ this.scrollHideCtrlPromise = null;
635
+ controller.init();
636
+ this.scrollHideCtrl = controller;
600
637
  }
601
638
  };
602
639
  this.setupFadeFooter = async (contentEl) => {
603
- const scrollEl = (this.scrollEl = await getScrollElement(contentEl));
640
+ const setupId = ++this.fadeSetupId;
641
+ const scrollEl = await getScrollElement(contentEl);
642
+ if (this.fadeSetupId !== setupId) {
643
+ return;
644
+ }
645
+ this.scrollEl = scrollEl;
604
646
  /**
605
647
  * Handle fading of toolbars on scroll
606
648
  */
@@ -645,6 +687,7 @@ const Footer = class {
645
687
  }
646
688
  }
647
689
  disconnectedCallback() {
690
+ this.destroyCollapsibleFooter();
648
691
  if (this.keyboardCtrlPromise) {
649
692
  this.keyboardCtrlPromise.then((ctrl) => ctrl.destroy());
650
693
  this.keyboardCtrlPromise = null;
@@ -655,25 +698,38 @@ const Footer = class {
655
698
  }
656
699
  }
657
700
  destroyCollapsibleFooter() {
701
+ this.activeEffect = undefined;
702
+ this.fadeSetupId++;
703
+ this.scrollHideCtrlPromise = null;
704
+ if (this.scrollHideCtrl) {
705
+ this.scrollHideCtrl.destroy();
706
+ this.scrollHideCtrl = undefined;
707
+ }
658
708
  if (this.scrollEl && this.contentScrollCallback) {
659
709
  this.scrollEl.removeEventListener('scroll', this.contentScrollCallback);
660
710
  this.contentScrollCallback = undefined;
661
711
  }
662
712
  }
663
713
  render() {
664
- const { translucent, collapse } = this;
714
+ const { translucent, scrollEffect, collapse } = this;
665
715
  const theme = getIonTheme(this);
716
+ const effect = scrollEffect !== null && scrollEffect !== void 0 ? scrollEffect : collapse;
717
+ // fade via the deprecated `collapse` prop is iOS-only.
718
+ const isModeRestricted = scrollEffect === undefined && theme !== 'ios';
719
+ const hasHide = effect === 'hide';
720
+ const hasFade = effect === 'fade' && !isModeRestricted;
666
721
  const tabs = this.el.closest('ion-tabs');
667
722
  const tabBar = tabs === null || tabs === void 0 ? void 0 : tabs.querySelector(':scope > ion-tab-bar');
668
- return (h(Host, { key: '4a2989a177b47ee26ffa23e2c9f5418773584796', role: "contentinfo", class: {
723
+ return (h(Host, { key: 'a0777b4a639d22e15374879f018efcf589e756f8', role: "contentinfo", class: {
669
724
  [theme]: true,
670
725
  // Used internally for styling
671
726
  [`footer-${theme}`]: true,
672
727
  [`footer-translucent`]: translucent,
673
728
  [`footer-translucent-${theme}`]: translucent,
674
729
  ['footer-toolbar-padding']: !this.keyboardVisible && (!tabBar || tabBar.slot !== 'bottom'),
675
- [`footer-collapse-${collapse}`]: collapse !== undefined,
676
- } }, theme === 'ios' && translucent && h("div", { key: 'c644963db3e06254014e398ea02189d6127ccf61', class: "footer-background" }), h("slot", { key: '839e33c6c30f5c1c703239a19458ff10da9a5e76' })));
730
+ 'footer-collapse-fade': hasFade,
731
+ 'footer-scroll-effect-hide': hasHide,
732
+ } }, theme === 'ios' && translucent && h("div", { key: 'd78b46870cbf11c95b066d649c04ec398b66e614', class: "footer-background" }), h("slot", { key: '9dc34787cd29597fe1b1198db317602014ac1483' })));
677
733
  }
678
734
  get el() { return getElement(this); }
679
735
  };
@@ -730,13 +786,14 @@ const handleContentScroll = (scrollEl, scrollHeaderIndex, contentEl) => {
730
786
  });
731
787
  };
732
788
  const setToolbarBackgroundOpacity = (headerEl, opacity) => {
789
+ var _a;
733
790
  /**
734
791
  * Fading in the backdrop opacity
735
792
  * should happen after the large title
736
793
  * has collapsed, so it is handled
737
794
  * by handleHeaderFade()
738
795
  */
739
- if (headerEl.collapse === 'fade') {
796
+ if (((_a = headerEl.scrollEffect) !== null && _a !== void 0 ? _a : headerEl.collapse) === 'fade') {
740
797
  return;
741
798
  }
742
799
  if (opacity === undefined) {
@@ -894,37 +951,32 @@ const handleHeaderFade = (scrollEl, baseEl, condenseHeader) => {
894
951
  * Get the role type for the ion-header.
895
952
  *
896
953
  * @param isInsideMenu If ion-header is inside ion-menu.
897
- * @param isCondensed If ion-header has collapse="condense".
898
- * @param theme The current theme.
899
- * @returns 'none' if inside ion-menu or if condensed in md
900
- * theme, otherwise 'banner'.
954
+ * @returns 'none' if inside ion-menu, otherwise 'banner'.
955
+ * Condensed headers start as 'banner' and have their role
956
+ * toggled dynamically by setHeaderActive() on scroll.
901
957
  */
902
- const getRoleType = (isInsideMenu, isCondensed, theme) => {
958
+ const getRoleType = (isInsideMenu) => {
903
959
  // If the header is inside a menu, it should not have the banner role.
904
960
  if (isInsideMenu) {
905
961
  return ROLE_NONE;
906
962
  }
907
- /**
908
- * Only apply role="none" to `md` & `ionic` theme condensed headers
909
- * since the large header is never shown.
910
- */
911
- if (isCondensed && theme !== 'ios') {
912
- return ROLE_NONE;
913
- }
914
963
  // Default to banner role.
915
964
  return ROLE_BANNER;
916
965
  };
917
966
 
918
- const headerIonicCss = () => `ion-header{display:block;position:relative;-ms-flex-order:-1;order:-1;width:100%}ion-header ion-toolbar:first-of-type{padding-top:var(--ion-safe-area-top, 0)}ion-header{z-index:10}ion-header.header-divider{border-bottom:var(--token-border-size-025, var(--token-scale-025, 1px)) var(--token-border-style-solid, solid) var(--token-border-default, var(--token-primitives-neutral-400, #d5d5d5))}ion-toolbar+ion-toolbar{--padding-start:var(--token-space-400, var(--token-scale-400, 16px));--padding-end:var(--token-space-400, var(--token-scale-400, 16px))}@supports ((-webkit-backdrop-filter: blur(0)) or (backdrop-filter: blur(0))){.header-background{right:0;left:0;top:0;bottom:0;position:absolute;-webkit-backdrop-filter:saturate(180%) blur(var(--token-scale-100, 4px));backdrop-filter:saturate(180%) blur(var(--token-scale-100, 4px))}.header-translucent-ionic ion-toolbar{--opacity:0.7}}`;
967
+ const headerIonicCss = () => `ion-header{display:block;position:relative;-ms-flex-order:-1;order:-1;width:100%}ion-header ion-toolbar:first-of-type{padding-top:var(--ion-safe-area-top, 0)}.header-collapse-fade ion-toolbar{--opacity-scale:inherit}.header-collapse-fade.header-transitioning ion-toolbar{--background:transparent;--border-style:none}.header-collapse-condense{z-index:9}.header-collapse-condense ion-toolbar{position:-webkit-sticky;position:sticky;top:0}.header-collapse-condense ion-toolbar:first-of-type{padding-top:0px;z-index:1}.header-collapse-condense ion-toolbar{z-index:0}.header-collapse-condense ion-toolbar:last-of-type{--border-width:0px}.header-collapse-condense ion-toolbar ion-searchbar{padding-top:0px;padding-bottom:13px}.header-collapse-main{--opacity-scale:1}.header-collapse-main ion-toolbar{--opacity-scale:inherit}.header-collapse-main ion-toolbar.in-toolbar ion-title,.header-collapse-main ion-toolbar.in-toolbar ion-buttons{-webkit-transition:all 0.2s ease-in-out;transition:all 0.2s ease-in-out}.header-collapse-condense ion-toolbar,.header-collapse-condense-inactive.header-transitioning:not(.header-collapse-condense) ion-toolbar{--background:var(--ion-background-color, #fff)}.header-collapse-condense-inactive.header-transitioning:not(.header-collapse-condense) ion-toolbar{--border-style:none;--opacity-scale:1}.header-collapse-condense-inactive:not(.header-collapse-condense) ion-toolbar.in-toolbar ion-title,.header-collapse-condense-inactive:not(.header-collapse-condense) ion-toolbar.in-toolbar ion-buttons.buttons-collapse{opacity:0;pointer-events:none}.header-collapse-condense-inactive.header-collapse-condense ion-toolbar.in-toolbar ion-title,.header-collapse-condense-inactive.header-collapse-condense ion-toolbar.in-toolbar ion-buttons.buttons-collapse{visibility:hidden}ion-header:not(.header-collapse-main):has(~ion-content ion-header.header-collapse-condense){opacity:0}.header-collapse-condense-hidden{display:none}ion-header.header-scroll-effect-hide{-webkit-transition:opacity 300ms cubic-bezier(0, 0, 0.2, 1), -webkit-transform 300ms cubic-bezier(0, 0, 0.2, 1);transition:opacity 300ms cubic-bezier(0, 0, 0.2, 1), -webkit-transform 300ms cubic-bezier(0, 0, 0.2, 1);transition:transform 300ms cubic-bezier(0, 0, 0.2, 1), opacity 300ms cubic-bezier(0, 0, 0.2, 1);transition:transform 300ms cubic-bezier(0, 0, 0.2, 1), opacity 300ms cubic-bezier(0, 0, 0.2, 1), -webkit-transform 300ms cubic-bezier(0, 0, 0.2, 1)}ion-header.header-scroll-effect-hide.header-scroll-hidden{-webkit-transform:translateY(-100%);transform:translateY(-100%);-webkit-transition:opacity 300ms cubic-bezier(0.4, 0, 1, 1), -webkit-transform 200ms cubic-bezier(0.4, 0, 1, 1);transition:opacity 300ms cubic-bezier(0.4, 0, 1, 1), -webkit-transform 200ms cubic-bezier(0.4, 0, 1, 1);transition:transform 200ms cubic-bezier(0.4, 0, 1, 1), opacity 300ms cubic-bezier(0.4, 0, 1, 1);transition:transform 200ms cubic-bezier(0.4, 0, 1, 1), opacity 300ms cubic-bezier(0.4, 0, 1, 1), -webkit-transform 200ms cubic-bezier(0.4, 0, 1, 1);opacity:0}@media (prefers-reduced-motion: reduce){ion-header.header-scroll-effect-hide,ion-header.header-scroll-effect-hide.header-scroll-hidden{-webkit-transition:none;transition:none}}ion-header{z-index:10}ion-header.header-divider{border-bottom:var(--token-border-size-025, var(--token-scale-025, 1px)) var(--token-border-style-solid, solid) var(--token-border-default, var(--token-primitives-neutral-400, #d5d5d5))}ion-toolbar+ion-toolbar{--padding-start:var(--token-space-400, var(--token-scale-400, 16px));--padding-end:var(--token-space-400, var(--token-scale-400, 16px))}@supports ((-webkit-backdrop-filter: blur(0)) or (backdrop-filter: blur(0))){.header-background{right:0;left:0;top:0;bottom:0;position:absolute;-webkit-backdrop-filter:saturate(180%) blur(var(--token-scale-100, 4px));backdrop-filter:saturate(180%) blur(var(--token-scale-100, 4px))}.header-translucent-ionic ion-toolbar{--opacity:0.7}}`;
919
968
 
920
- const headerIosCss = () => `ion-header{display:block;position:relative;-ms-flex-order:-1;order:-1;width:100%}ion-header ion-toolbar:first-of-type{padding-top:var(--ion-safe-area-top, 0)}ion-header{z-index:10}.header-ios ion-toolbar:last-of-type{--border-width:0 0 0.55px}@supports ((-webkit-backdrop-filter: blur(0)) or (backdrop-filter: blur(0))){.header-background{right:0;left:0;top:0;bottom:0;position:absolute;-webkit-backdrop-filter:saturate(180%) blur(20px);backdrop-filter:saturate(180%) blur(20px)}.header-translucent-ios ion-toolbar{--opacity:0.8}.header-collapse-condense-inactive .header-background{-webkit-backdrop-filter:blur(20px);backdrop-filter:blur(20px)}}.header-ios.ion-no-border ion-toolbar:last-of-type{--border-width:0}.header-collapse-fade ion-toolbar{--opacity-scale:inherit}.header-collapse-fade.header-transitioning ion-toolbar{--background:transparent;--border-style:none}.header-collapse-condense{z-index:9}.header-collapse-condense ion-toolbar{position:-webkit-sticky;position:sticky;top:0}.header-collapse-condense ion-toolbar:first-of-type{padding-top:0px;z-index:1}.header-collapse-condense ion-toolbar{z-index:0}.header-collapse-condense ion-toolbar:last-of-type{--border-width:0px}.header-collapse-condense ion-toolbar ion-searchbar{padding-top:0px;padding-bottom:13px}.header-collapse-main{--opacity-scale:1}.header-collapse-main ion-toolbar{--opacity-scale:inherit}.header-collapse-main ion-toolbar.in-toolbar ion-title,.header-collapse-main ion-toolbar.in-toolbar ion-buttons{-webkit-transition:all 0.2s ease-in-out;transition:all 0.2s ease-in-out}.header-collapse-condense ion-toolbar,.header-collapse-condense-inactive.header-transitioning:not(.header-collapse-condense) ion-toolbar{--background:var(--ion-background-color, #fff)}.header-collapse-condense-inactive.header-transitioning:not(.header-collapse-condense) ion-toolbar{--border-style:none;--opacity-scale:1}.header-collapse-condense-inactive:not(.header-collapse-condense) ion-toolbar.in-toolbar ion-title,.header-collapse-condense-inactive:not(.header-collapse-condense) ion-toolbar.in-toolbar ion-buttons.buttons-collapse{opacity:0;pointer-events:none}.header-collapse-condense-inactive.header-collapse-condense ion-toolbar.in-toolbar ion-title,.header-collapse-condense-inactive.header-collapse-condense ion-toolbar.in-toolbar ion-buttons.buttons-collapse{visibility:hidden}ion-header.header-ios:not(.header-collapse-main):has(~ion-content ion-header.header-ios[collapse=condense],~ion-content ion-header.header-ios.header-collapse-condense){opacity:0}`;
969
+ const headerIosCss = () => `ion-header{display:block;position:relative;-ms-flex-order:-1;order:-1;width:100%}ion-header ion-toolbar:first-of-type{padding-top:var(--ion-safe-area-top, 0)}.header-collapse-fade ion-toolbar{--opacity-scale:inherit}.header-collapse-fade.header-transitioning ion-toolbar{--background:transparent;--border-style:none}.header-collapse-condense{z-index:9}.header-collapse-condense ion-toolbar{position:-webkit-sticky;position:sticky;top:0}.header-collapse-condense ion-toolbar:first-of-type{padding-top:0px;z-index:1}.header-collapse-condense ion-toolbar{z-index:0}.header-collapse-condense ion-toolbar:last-of-type{--border-width:0px}.header-collapse-condense ion-toolbar ion-searchbar{padding-top:0px;padding-bottom:13px}.header-collapse-main{--opacity-scale:1}.header-collapse-main ion-toolbar{--opacity-scale:inherit}.header-collapse-main ion-toolbar.in-toolbar ion-title,.header-collapse-main ion-toolbar.in-toolbar ion-buttons{-webkit-transition:all 0.2s ease-in-out;transition:all 0.2s ease-in-out}.header-collapse-condense ion-toolbar,.header-collapse-condense-inactive.header-transitioning:not(.header-collapse-condense) ion-toolbar{--background:var(--ion-background-color, #fff)}.header-collapse-condense-inactive.header-transitioning:not(.header-collapse-condense) ion-toolbar{--border-style:none;--opacity-scale:1}.header-collapse-condense-inactive:not(.header-collapse-condense) ion-toolbar.in-toolbar ion-title,.header-collapse-condense-inactive:not(.header-collapse-condense) ion-toolbar.in-toolbar ion-buttons.buttons-collapse{opacity:0;pointer-events:none}.header-collapse-condense-inactive.header-collapse-condense ion-toolbar.in-toolbar ion-title,.header-collapse-condense-inactive.header-collapse-condense ion-toolbar.in-toolbar ion-buttons.buttons-collapse{visibility:hidden}ion-header:not(.header-collapse-main):has(~ion-content ion-header.header-collapse-condense){opacity:0}.header-collapse-condense-hidden{display:none}ion-header.header-scroll-effect-hide{-webkit-transition:opacity 300ms cubic-bezier(0, 0, 0.2, 1), -webkit-transform 300ms cubic-bezier(0, 0, 0.2, 1);transition:opacity 300ms cubic-bezier(0, 0, 0.2, 1), -webkit-transform 300ms cubic-bezier(0, 0, 0.2, 1);transition:transform 300ms cubic-bezier(0, 0, 0.2, 1), opacity 300ms cubic-bezier(0, 0, 0.2, 1);transition:transform 300ms cubic-bezier(0, 0, 0.2, 1), opacity 300ms cubic-bezier(0, 0, 0.2, 1), -webkit-transform 300ms cubic-bezier(0, 0, 0.2, 1)}ion-header.header-scroll-effect-hide.header-scroll-hidden{-webkit-transform:translateY(-100%);transform:translateY(-100%);-webkit-transition:opacity 300ms cubic-bezier(0.4, 0, 1, 1), -webkit-transform 200ms cubic-bezier(0.4, 0, 1, 1);transition:opacity 300ms cubic-bezier(0.4, 0, 1, 1), -webkit-transform 200ms cubic-bezier(0.4, 0, 1, 1);transition:transform 200ms cubic-bezier(0.4, 0, 1, 1), opacity 300ms cubic-bezier(0.4, 0, 1, 1);transition:transform 200ms cubic-bezier(0.4, 0, 1, 1), opacity 300ms cubic-bezier(0.4, 0, 1, 1), -webkit-transform 200ms cubic-bezier(0.4, 0, 1, 1);opacity:0}@media (prefers-reduced-motion: reduce){ion-header.header-scroll-effect-hide,ion-header.header-scroll-effect-hide.header-scroll-hidden{-webkit-transition:none;transition:none}}ion-header{z-index:10}.header-ios ion-toolbar:last-of-type{--border-width:0 0 0.55px}@supports ((-webkit-backdrop-filter: blur(0)) or (backdrop-filter: blur(0))){.header-background{right:0;left:0;top:0;bottom:0;position:absolute;-webkit-backdrop-filter:saturate(180%) blur(20px);backdrop-filter:saturate(180%) blur(20px)}.header-translucent-ios ion-toolbar{--opacity:0.8}.header-collapse-condense-inactive .header-background{-webkit-backdrop-filter:blur(20px);backdrop-filter:blur(20px)}}.header-ios.ion-no-border ion-toolbar:last-of-type{--border-width:0}.header-collapse-condense ion-toolbar:last-of-type{--border-width:0px}`;
921
970
 
922
- const headerMdCss = () => `ion-header{display:block;position:relative;-ms-flex-order:-1;order:-1;width:100%}ion-header ion-toolbar:first-of-type{padding-top:var(--ion-safe-area-top, 0)}ion-header{z-index:10}.header-md{-webkit-box-shadow:0 2px 4px -1px rgba(0, 0, 0, 0.2), 0 4px 5px 0 rgba(0, 0, 0, 0.14), 0 1px 10px 0 rgba(0, 0, 0, 0.12);box-shadow:0 2px 4px -1px rgba(0, 0, 0, 0.2), 0 4px 5px 0 rgba(0, 0, 0, 0.14), 0 1px 10px 0 rgba(0, 0, 0, 0.12)}.header-md.header-collapse-condense{display:none}.header-md.ion-no-border{-webkit-box-shadow:none;box-shadow:none}`;
971
+ const headerMdCss = () => `ion-header{display:block;position:relative;-ms-flex-order:-1;order:-1;width:100%}ion-header ion-toolbar:first-of-type{padding-top:var(--ion-safe-area-top, 0)}.header-collapse-fade ion-toolbar{--opacity-scale:inherit}.header-collapse-fade.header-transitioning ion-toolbar{--background:transparent;--border-style:none}.header-collapse-condense{z-index:9}.header-collapse-condense ion-toolbar{position:-webkit-sticky;position:sticky;top:0}.header-collapse-condense ion-toolbar:first-of-type{padding-top:0px;z-index:1}.header-collapse-condense ion-toolbar{z-index:0}.header-collapse-condense ion-toolbar:last-of-type{--border-width:0px}.header-collapse-condense ion-toolbar ion-searchbar{padding-top:0px;padding-bottom:13px}.header-collapse-main{--opacity-scale:1}.header-collapse-main ion-toolbar{--opacity-scale:inherit}.header-collapse-main ion-toolbar.in-toolbar ion-title,.header-collapse-main ion-toolbar.in-toolbar ion-buttons{-webkit-transition:all 0.2s ease-in-out;transition:all 0.2s ease-in-out}.header-collapse-condense ion-toolbar,.header-collapse-condense-inactive.header-transitioning:not(.header-collapse-condense) ion-toolbar{--background:var(--ion-background-color, #fff)}.header-collapse-condense-inactive.header-transitioning:not(.header-collapse-condense) ion-toolbar{--border-style:none;--opacity-scale:1}.header-collapse-condense-inactive:not(.header-collapse-condense) ion-toolbar.in-toolbar ion-title,.header-collapse-condense-inactive:not(.header-collapse-condense) ion-toolbar.in-toolbar ion-buttons.buttons-collapse{opacity:0;pointer-events:none}.header-collapse-condense-inactive.header-collapse-condense ion-toolbar.in-toolbar ion-title,.header-collapse-condense-inactive.header-collapse-condense ion-toolbar.in-toolbar ion-buttons.buttons-collapse{visibility:hidden}ion-header:not(.header-collapse-main):has(~ion-content ion-header.header-collapse-condense){opacity:0}.header-collapse-condense-hidden{display:none}ion-header.header-scroll-effect-hide{-webkit-transition:opacity 300ms cubic-bezier(0, 0, 0.2, 1), -webkit-transform 300ms cubic-bezier(0, 0, 0.2, 1);transition:opacity 300ms cubic-bezier(0, 0, 0.2, 1), -webkit-transform 300ms cubic-bezier(0, 0, 0.2, 1);transition:transform 300ms cubic-bezier(0, 0, 0.2, 1), opacity 300ms cubic-bezier(0, 0, 0.2, 1);transition:transform 300ms cubic-bezier(0, 0, 0.2, 1), opacity 300ms cubic-bezier(0, 0, 0.2, 1), -webkit-transform 300ms cubic-bezier(0, 0, 0.2, 1)}ion-header.header-scroll-effect-hide.header-scroll-hidden{-webkit-transform:translateY(-100%);transform:translateY(-100%);-webkit-transition:opacity 300ms cubic-bezier(0.4, 0, 1, 1), -webkit-transform 200ms cubic-bezier(0.4, 0, 1, 1);transition:opacity 300ms cubic-bezier(0.4, 0, 1, 1), -webkit-transform 200ms cubic-bezier(0.4, 0, 1, 1);transition:transform 200ms cubic-bezier(0.4, 0, 1, 1), opacity 300ms cubic-bezier(0.4, 0, 1, 1);transition:transform 200ms cubic-bezier(0.4, 0, 1, 1), opacity 300ms cubic-bezier(0.4, 0, 1, 1), -webkit-transform 200ms cubic-bezier(0.4, 0, 1, 1);opacity:0}@media (prefers-reduced-motion: reduce){ion-header.header-scroll-effect-hide,ion-header.header-scroll-effect-hide.header-scroll-hidden{-webkit-transition:none;transition:none}}ion-header{z-index:10}.header-md{-webkit-box-shadow:0 2px 4px -1px rgba(0, 0, 0, 0.2), 0 4px 5px 0 rgba(0, 0, 0, 0.14), 0 1px 10px 0 rgba(0, 0, 0, 0.12);box-shadow:0 2px 4px -1px rgba(0, 0, 0, 0.2), 0 4px 5px 0 rgba(0, 0, 0, 0.14), 0 1px 10px 0 rgba(0, 0, 0, 0.12)}.header-md.header-collapse-condense{-webkit-box-shadow:none;box-shadow:none}.header-md.header-collapse-condense-inactive:not(.header-collapse-condense){-webkit-box-shadow:none;box-shadow:none}.header-md.header-collapse-fade{-webkit-box-shadow:none;box-shadow:none}.header-md.ion-no-border{-webkit-box-shadow:none;box-shadow:none}`;
923
972
 
924
973
  const Header = class {
925
974
  constructor(hostRef) {
926
975
  registerInstance(this, hostRef);
927
976
  this.inheritedAttributes = {};
977
+ this.scrollHideCtrlPromise = null;
978
+ this.hasWarnedCollapse = false;
979
+ this.fadeCondenseSetupId = 0;
928
980
  /**
929
981
  * If `true`, the header will have a line at the bottom.
930
982
  * TODO(ROU-10855): add support for this prop on ios/md themes
@@ -939,8 +991,29 @@ const Header = class {
939
991
  * attribute needs to be set on the content.
940
992
  */
941
993
  this.translucent = false;
994
+ this.setupScrollEffectHide = async (contentEl) => {
995
+ const setupPromise = createScrollHideController(contentEl, {
996
+ el: this.el,
997
+ cssVar: '--internal-header-hide-height',
998
+ hiddenClass: 'header-scroll-hidden',
999
+ contentPartnerClass: 'content-header-hide-scroll-partner',
1000
+ contentHiddenClass: 'content-header-hide-scroll-hidden',
1001
+ });
1002
+ this.scrollHideCtrlPromise = setupPromise;
1003
+ const controller = await setupPromise;
1004
+ if (this.scrollHideCtrlPromise === setupPromise) {
1005
+ this.scrollHideCtrlPromise = null;
1006
+ controller.init();
1007
+ this.scrollHideCtrl = controller;
1008
+ }
1009
+ };
942
1010
  this.setupFadeHeader = async (contentEl, condenseHeader) => {
943
- const scrollEl = (this.scrollEl = await getScrollElement(contentEl));
1011
+ const setupId = ++this.fadeCondenseSetupId;
1012
+ const scrollEl = await getScrollElement(contentEl);
1013
+ if (this.fadeCondenseSetupId !== setupId) {
1014
+ return;
1015
+ }
1016
+ this.scrollEl = scrollEl;
944
1017
  /**
945
1018
  * Handle fading of toolbars on scroll
946
1019
  */
@@ -964,38 +1037,63 @@ const Header = class {
964
1037
  this.destroyCollapsibleHeader();
965
1038
  }
966
1039
  async checkCollapsibleHeader() {
967
- const theme = getIonTheme(this);
968
- if (theme !== 'ios') {
1040
+ const { scrollEffect, collapse } = this;
1041
+ if (collapse !== undefined && scrollEffect === undefined && !this.hasWarnedCollapse) {
1042
+ this.hasWarnedCollapse = true;
1043
+ printIonWarning(`[ion-header] - The \`collapse\` property is deprecated. Use \`scrollEffect\` instead.\nExample: <ion-header scroll-effect="${collapse}">`, this.el);
1044
+ }
1045
+ const effect = scrollEffect !== null && scrollEffect !== void 0 ? scrollEffect : collapse;
1046
+ // Skip teardown/rebuild if the effect hasn't changed.
1047
+ // This prevents re-renders from destroying the scroll controller
1048
+ // and resetting isHidden.
1049
+ if (effect === this.activeEffect) {
969
1050
  return;
970
1051
  }
971
- const { collapse } = this;
972
- const hasCondense = collapse === 'condense';
973
- const hasFade = collapse === 'fade';
1052
+ const hasHide = effect === 'hide';
1053
+ const hasCondense = effect === 'condense';
1054
+ const hasFade = effect === 'fade';
974
1055
  this.destroyCollapsibleHeader();
975
1056
  const appRootSelector = config.get('appRootSelector', 'ion-app');
976
- if (hasCondense) {
977
- const pageEl = this.el.closest(`${appRootSelector},ion-page,.ion-page,page-inner`);
978
- const contentEl = pageEl ? findIonContent(pageEl) : null;
1057
+ const pageEl = this.el.closest(`${appRootSelector}, ion-page, .ion-page, page-inner`);
1058
+ const contentEl = pageEl ? findIonContent(pageEl) : null;
1059
+ if (hasHide && contentEl) {
1060
+ this.activeEffect = effect;
1061
+ await this.setupScrollEffectHide(contentEl);
1062
+ return;
1063
+ }
1064
+ // condense/fade via the deprecated `collapse` prop are iOS-only.
1065
+ // condense/fade via the new `scrollEffect` prop work in all themes.
1066
+ const isModeRestricted = scrollEffect === undefined && getIonTheme(this) !== 'ios';
1067
+ if (hasCondense && !isModeRestricted) {
979
1068
  // Cloned elements are always needed in iOS transition
980
1069
  writeTask(() => {
981
1070
  const title = cloneElement('ion-title');
982
1071
  title.size = 'large';
983
1072
  cloneElement('ion-back-button');
984
1073
  });
985
- await this.setupCondenseHeader(contentEl, pageEl);
1074
+ const didSetup = await this.setupCondenseHeader(contentEl, pageEl);
1075
+ if (didSetup) {
1076
+ this.activeEffect = effect;
1077
+ }
986
1078
  }
987
- else if (hasFade) {
988
- const pageEl = this.el.closest(`${appRootSelector},ion-page,.ion-page,page-inner`);
989
- const contentEl = pageEl ? findIonContent(pageEl) : null;
1079
+ else if (hasFade && !isModeRestricted) {
990
1080
  if (!contentEl) {
991
1081
  printIonContentErrorMsg(this.el);
992
1082
  return;
993
1083
  }
994
- const condenseHeader = contentEl.querySelector('ion-header[collapse="condense"]');
1084
+ const condenseHeader = contentEl.querySelector('ion-header[collapse="condense"],ion-header[scroll-effect="condense"]');
1085
+ this.activeEffect = effect;
995
1086
  await this.setupFadeHeader(contentEl, condenseHeader);
996
1087
  }
997
1088
  }
998
1089
  destroyCollapsibleHeader() {
1090
+ this.activeEffect = undefined;
1091
+ this.fadeCondenseSetupId++;
1092
+ this.scrollHideCtrlPromise = null;
1093
+ if (this.scrollHideCtrl) {
1094
+ this.scrollHideCtrl.destroy();
1095
+ this.scrollHideCtrl = undefined;
1096
+ }
999
1097
  if (this.intersectionObserver) {
1000
1098
  this.intersectionObserver.disconnect();
1001
1099
  this.intersectionObserver = undefined;
@@ -1012,21 +1110,40 @@ const Header = class {
1012
1110
  async setupCondenseHeader(contentEl, pageEl) {
1013
1111
  if (!contentEl || !pageEl) {
1014
1112
  printIonContentErrorMsg(this.el);
1015
- return;
1113
+ return false;
1016
1114
  }
1017
1115
  if (typeof IntersectionObserver === 'undefined') {
1018
- return;
1116
+ return false;
1117
+ }
1118
+ const setupId = ++this.fadeCondenseSetupId;
1119
+ const scrollEl = await getScrollElement(contentEl);
1120
+ if (this.fadeCondenseSetupId !== setupId) {
1121
+ return false;
1122
+ }
1123
+ this.scrollEl = scrollEl;
1124
+ /**
1125
+ * The condense effect requires an ion-title with size="large"
1126
+ * in the condense header. Without it, there is nothing to
1127
+ * collapse into the main header toolbar.
1128
+ */
1129
+ const hasLargeTitle = this.el.querySelector('ion-title[size="large"]') !== null;
1130
+ if (!hasLargeTitle) {
1131
+ printIonWarning('[ion-header] - The condense scroll effect requires an <ion-title size="large"> in the condense header.', this.el);
1132
+ return false;
1019
1133
  }
1020
- this.scrollEl = await getScrollElement(contentEl);
1021
1134
  const headers = pageEl.querySelectorAll('ion-header');
1022
- this.collapsibleMainHeader = Array.from(headers).find((header) => header.collapse !== 'condense');
1135
+ this.collapsibleMainHeader = Array.from(headers).find((header) => {
1136
+ var _a;
1137
+ const effect = (_a = header.scrollEffect) !== null && _a !== void 0 ? _a : header.collapse;
1138
+ return effect !== 'condense';
1139
+ });
1023
1140
  if (!this.collapsibleMainHeader) {
1024
- return;
1141
+ return false;
1025
1142
  }
1026
1143
  const mainHeaderIndex = createHeaderIndex(this.collapsibleMainHeader);
1027
1144
  const scrollHeaderIndex = createHeaderIndex(this.el);
1028
1145
  if (!mainHeaderIndex || !scrollHeaderIndex) {
1029
- return;
1146
+ return false;
1030
1147
  }
1031
1148
  setHeaderActive(mainHeaderIndex, false);
1032
1149
  setToolbarBackgroundOpacity(mainHeaderIndex.el, 0);
@@ -1058,23 +1175,35 @@ const Header = class {
1058
1175
  this.collapsibleMainHeader.classList.add('header-collapse-main');
1059
1176
  }
1060
1177
  });
1178
+ return true;
1061
1179
  }
1062
1180
  render() {
1063
- const { translucent, inheritedAttributes, divider } = this;
1181
+ const { translucent, inheritedAttributes, divider, scrollEffect, collapse } = this;
1064
1182
  const theme = getIonTheme(this);
1065
- const collapse = this.collapse || 'none';
1066
- const isCondensed = collapse === 'condense';
1183
+ const effect = scrollEffect !== null && scrollEffect !== void 0 ? scrollEffect : collapse;
1184
+ // condense/fade via the deprecated `collapse` prop are iOS-only.
1185
+ const isModeRestricted = scrollEffect === undefined && theme !== 'ios';
1186
+ const hasHide = effect === 'hide';
1187
+ const hasCondense = effect === 'condense' && !isModeRestricted && this.el.querySelector('ion-title[size="large"]') !== null;
1188
+ const hasFade = effect === 'fade' && !isModeRestricted;
1189
+ // The condense header should be hidden when
1190
+ // - deprecated collapse prop is used on non-iOS (mode restricted), or
1191
+ // - scrollEffect="condense" is set but no ion-title[size="large"] is present
1192
+ const isHiddenCondense = effect === 'condense' && !hasCondense;
1067
1193
  // banner role must be at top level, so remove role if inside a menu
1068
- const roleType = getRoleType(hostContext('ion-menu', this.el), isCondensed, theme);
1069
- return (h(Host, Object.assign({ key: '3395dedfd5165ba6e9f3ad1a25f0bb5b3678704a', role: roleType, class: {
1194
+ const roleType = isHiddenCondense ? 'none' : getRoleType(hostContext('ion-menu', this.el));
1195
+ return (h(Host, Object.assign({ key: '09f60ca014bb7b3a85d3c0a94e7989d5dbc43f46', role: roleType, class: {
1070
1196
  [theme]: true,
1071
1197
  // Used internally for styling
1072
1198
  [`header-${theme}`]: true,
1073
1199
  [`header-translucent`]: this.translucent,
1074
- [`header-collapse-${collapse}`]: true,
1200
+ ['header-collapse-condense']: hasCondense,
1201
+ ['header-collapse-condense-hidden']: isHiddenCondense,
1202
+ ['header-collapse-fade']: hasFade,
1075
1203
  [`header-translucent-${theme}`]: this.translucent,
1076
1204
  ['header-divider']: divider,
1077
- } }, inheritedAttributes), theme !== 'md' && translucent && h("div", { key: 'cafeb88b6e73d64b264514ea46590fd3477b3052', class: "header-background" }), h("slot", { key: 'ad681aaf866d7e7a5e5e731c0b5d6f5cc9fe94d2' })));
1205
+ 'header-scroll-effect-hide': hasHide,
1206
+ } }, inheritedAttributes), theme !== 'md' && translucent && h("div", { key: 'fd5ff245ae0166e5e1d50936cacc98c90625db48', class: "header-background" }), h("slot", { key: '1baa31af87b9eb6406a21073ec65afa191dfbb3d' })));
1078
1207
  }
1079
1208
  get el() { return getElement(this); }
1080
1209
  };
@@ -1276,7 +1405,7 @@ const titleIonicCss = () => `:host{--color:initial;display:-ms-flexbox;display:f
1276
1405
 
1277
1406
  const titleIosCss = () => `:host{--color:initial;display:-ms-flexbox;display:flex;-ms-flex:1;flex:1;-ms-flex-align:center;align-items:center;-webkit-transform:translateZ(0);transform:translateZ(0);color:var(--color)}.toolbar-title{display:block;width:100%;text-overflow:ellipsis;white-space:nowrap;overflow:hidden;pointer-events:auto}:host(.title-small) .toolbar-title{white-space:normal}:host(.ion-color){color:var(--ion-color-base)}:host{top:0;-webkit-padding-start:90px;padding-inline-start:90px;-webkit-padding-end:90px;padding-inline-end:90px;padding-top:var(--padding-top);padding-bottom:var(--padding-bottom);position:absolute;width:100%;height:100%;-webkit-transform:translateZ(0);transform:translateZ(0);font-size:min(1.0625rem, 20.4px);font-weight:600;text-align:center;-webkit-box-sizing:border-box;box-sizing:border-box;pointer-events:none}:host{inset-inline-start:0}:host(.title-small){-webkit-padding-start:9px;padding-inline-start:9px;-webkit-padding-end:9px;padding-inline-end:9px;padding-top:6px;padding-bottom:16px;position:relative;font-size:min(0.8125rem, 23.4px);font-weight:normal}:host(.title-large){-webkit-padding-start:12px;padding-inline-start:12px;-webkit-padding-end:12px;padding-inline-end:12px;padding-top:2px;padding-bottom:4px;-webkit-transform-origin:left center;transform-origin:left center;position:static;-ms-flex-align:end;align-items:flex-end;min-width:100%;font-size:min(2.125rem, 61.2px);font-weight:700;text-align:start}:host(.title-large.title-rtl){-webkit-transform-origin:right center;transform-origin:right center}:host(.title-large.ion-cloned-element){--color:var(--ion-text-color, #000);font-family:var(--ion-font-family)}:host(.title-large) .toolbar-title{-webkit-transform-origin:inherit;transform-origin:inherit;width:auto}:host-context([dir=rtl]):host(.title-large) .toolbar-title,:host-context([dir=rtl]).title-large .toolbar-title{-webkit-transform-origin:calc(100% - inherit);transform-origin:calc(100% - inherit)}@supports selector(:dir(rtl)){:host(.title-large:dir(rtl)) .toolbar-title{-webkit-transform-origin:calc(100% - inherit);transform-origin:calc(100% - inherit)}}`;
1278
1407
 
1279
- const titleMdCss = () => `:host{--color:initial;display:-ms-flexbox;display:flex;-ms-flex:1;flex:1;-ms-flex-align:center;align-items:center;-webkit-transform:translateZ(0);transform:translateZ(0);color:var(--color)}.toolbar-title{display:block;width:100%;text-overflow:ellipsis;white-space:nowrap;overflow:hidden;pointer-events:auto}:host(.title-small) .toolbar-title{white-space:normal}:host(.ion-color){color:var(--ion-color-base)}:host{-webkit-padding-start:20px;padding-inline-start:20px;-webkit-padding-end:20px;padding-inline-end:20px;padding-top:0;padding-bottom:0;font-size:1.25rem;font-weight:500;letter-spacing:0.0125em}:host(.title-small){width:100%;height:100%;font-size:0.9375rem;font-weight:normal}`;
1408
+ const titleMdCss = () => `:host{--color:initial;display:-ms-flexbox;display:flex;-ms-flex:1;flex:1;-ms-flex-align:center;align-items:center;-webkit-transform:translateZ(0);transform:translateZ(0);color:var(--color)}.toolbar-title{display:block;width:100%;text-overflow:ellipsis;white-space:nowrap;overflow:hidden;pointer-events:auto}:host(.title-small) .toolbar-title{white-space:normal}:host(.ion-color){color:var(--ion-color-base)}:host{-webkit-padding-start:20px;padding-inline-start:20px;-webkit-padding-end:20px;padding-inline-end:20px;padding-top:0;padding-bottom:0;font-size:1.25rem;font-weight:500;letter-spacing:0.0125em}:host(.title-small){width:100%;height:100%;font-size:0.9375rem;font-weight:normal}:host(.title-large){width:100%;height:100%;font-size:1.75rem;font-weight:400}`;
1280
1409
 
1281
1410
  const ToolbarTitle = class {
1282
1411
  constructor(hostRef) {