@ionic/core 9.0.4-nightly.20260914 → 9.0.4-nightly.20260915

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 (475) hide show
  1. package/components/index.js +1 -1
  2. package/components/ion-accordion-group.js +1 -1
  3. package/components/ion-accordion.js +1 -1
  4. package/components/ion-action-sheet.js +1 -1
  5. package/components/ion-alert.js +1 -1
  6. package/components/ion-app.js +1 -1
  7. package/components/ion-avatar.js +1 -1
  8. package/components/ion-back-button.js +1 -1
  9. package/components/ion-backdrop.js +1 -1
  10. package/components/ion-badge.js +1 -1
  11. package/components/ion-breadcrumb.js +1 -1
  12. package/components/ion-breadcrumbs.js +1 -1
  13. package/components/ion-button.js +1 -1
  14. package/components/ion-buttons.js +1 -1
  15. package/components/ion-card-content.js +1 -1
  16. package/components/ion-card-header.js +1 -1
  17. package/components/ion-card-subtitle.js +1 -1
  18. package/components/ion-card-title.js +1 -1
  19. package/components/ion-card.js +1 -1
  20. package/components/ion-checkbox.js +1 -1
  21. package/components/ion-chip.js +1 -1
  22. package/components/ion-col.js +1 -1
  23. package/components/ion-content.js +1 -1
  24. package/components/ion-datetime-button.js +1 -1
  25. package/components/ion-datetime.js +1 -1
  26. package/components/ion-fab-button.js +1 -1
  27. package/components/ion-fab-list.js +1 -1
  28. package/components/ion-fab.js +1 -1
  29. package/components/ion-footer.js +1 -1
  30. package/components/ion-grid.js +1 -1
  31. package/components/ion-header.js +1 -1
  32. package/components/ion-icon.js +1 -1
  33. package/components/ion-img.js +1 -1
  34. package/components/ion-infinite-scroll-content.js +1 -1
  35. package/components/ion-infinite-scroll.js +1 -1
  36. package/components/ion-input-otp.js +1 -1
  37. package/components/ion-input-password-toggle.js +1 -1
  38. package/components/ion-input.js +1 -1
  39. package/components/ion-item-divider.js +1 -1
  40. package/components/ion-item-group.js +1 -1
  41. package/components/ion-item-option.js +1 -1
  42. package/components/ion-item-options.js +1 -1
  43. package/components/ion-item-sliding.js +1 -1
  44. package/components/ion-item.js +1 -1
  45. package/components/ion-label.js +1 -1
  46. package/components/ion-list-header.js +1 -1
  47. package/components/ion-list.js +1 -1
  48. package/components/ion-loading.js +1 -1
  49. package/components/ion-menu-button.js +1 -1
  50. package/components/ion-menu-toggle.js +1 -1
  51. package/components/ion-menu.js +1 -1
  52. package/components/ion-modal.js +1 -1
  53. package/components/ion-nav-link.js +1 -1
  54. package/components/ion-nav.js +1 -1
  55. package/components/ion-note.js +1 -1
  56. package/components/ion-picker-column-option.js +1 -1
  57. package/components/ion-picker-column.js +1 -1
  58. package/components/ion-picker.js +1 -1
  59. package/components/ion-popover.js +1 -1
  60. package/components/ion-progress-bar.js +1 -1
  61. package/components/ion-radio-group.js +1 -1
  62. package/components/ion-radio.js +1 -1
  63. package/components/ion-range.js +1 -1
  64. package/components/ion-refresher-content.js +1 -1
  65. package/components/ion-refresher.js +1 -1
  66. package/components/ion-reorder-group.js +1 -1
  67. package/components/ion-reorder.js +1 -1
  68. package/components/ion-ripple-effect.js +1 -1
  69. package/components/ion-route-redirect.js +1 -1
  70. package/components/ion-route.js +1 -1
  71. package/components/ion-router-link.js +1 -1
  72. package/components/ion-router-outlet.js +1 -1
  73. package/components/ion-router.js +1 -1
  74. package/components/ion-row.js +1 -1
  75. package/components/ion-searchbar.js +1 -1
  76. package/components/ion-segment-button.js +1 -1
  77. package/components/ion-segment-content.js +1 -1
  78. package/components/ion-segment-view.js +1 -1
  79. package/components/ion-segment.js +1 -1
  80. package/components/ion-select-modal.js +1 -1
  81. package/components/ion-select-option.js +1 -1
  82. package/components/ion-select-popover.js +1 -1
  83. package/components/ion-select.js +1 -1
  84. package/components/ion-skeleton-text.js +1 -1
  85. package/components/ion-spinner.js +1 -1
  86. package/components/ion-split-pane.js +1 -1
  87. package/components/ion-tab-bar.js +1 -1
  88. package/components/ion-tab-button.js +1 -1
  89. package/components/ion-tab.js +1 -1
  90. package/components/ion-tabs.js +1 -1
  91. package/components/ion-text.js +1 -1
  92. package/components/ion-textarea.js +1 -1
  93. package/components/ion-thumbnail.js +1 -1
  94. package/components/ion-title.js +1 -1
  95. package/components/ion-toast.js +1 -1
  96. package/components/ion-toggle.js +1 -1
  97. package/components/ion-toolbar.js +1 -1
  98. package/components/p--pR3YKVX.js +4 -0
  99. package/components/{p-BJr2B5hZ.js → p-2ta4uE9-.js} +1 -1
  100. package/components/{p-YjMkHuvH.js → p-47h0_nN4.js} +1 -1
  101. package/components/{p-C8Ck7_Eo.js → p-8MzqWBTT.js} +1 -1
  102. package/components/{p-CNLioZ3B.js → p-BGChz0G8.js} +1 -1
  103. package/components/{p-DZRZic9C.js → p-BLe-edUh.js} +1 -1
  104. package/components/{p-CJgnoKcN.js → p-BMHhG7Xh.js} +1 -1
  105. package/components/{p-TWw4e4sO.js → p-BPbgEuCf.js} +1 -1
  106. package/components/{p-DnBNYc7u.js → p-Bc-3W2an.js} +1 -1
  107. package/{dist/ionic/p-DTxBioUO.js → components/p-BezPzC13.js} +1 -1
  108. package/components/{p-B1_TL6RQ.js → p-BezRi1ML.js} +1 -1
  109. package/{dist/ionic/p-DcCEP7Ss.js → components/p-Bi8VGu4M.js} +1 -1
  110. package/components/{p-DL13ieTa.js → p-BjizFeM6.js} +1 -1
  111. package/components/{p-BF48Oc0v.js → p-BuxZkazO.js} +1 -1
  112. package/components/p-BxCcX93a.js +4 -0
  113. package/components/{p-BW_SlU2D.js → p-C0tpzcpi.js} +1 -1
  114. package/components/{p-DMBiAyOR.js → p-C6WYVtle.js} +1 -1
  115. package/components/p-CDt7Q7Dj.js +4 -0
  116. package/components/p-CDvyV0r0.js +4 -0
  117. package/components/{p-C4VpVfrJ.js → p-CEs5NmKW.js} +1 -1
  118. package/components/{p-CMRYD_yR.js → p-CLVgYpRn.js} +1 -1
  119. package/components/{p-Cd1WaN-0.js → p-CMT0YmOj.js} +1 -1
  120. package/components/{p-DFLJvuRK.js → p-CPGp3WWG.js} +1 -1
  121. package/components/{p-B4lxwJ8N.js → p-CXuRZoWE.js} +1 -1
  122. package/components/{p-D7wDJdFn.js → p-CaY8IRMT.js} +1 -1
  123. package/components/{p-BQyuFxYc.js → p-CcOl6jEv.js} +1 -1
  124. package/components/{p-Ctop2IWW.js → p-CeGQfrDU.js} +1 -1
  125. package/components/{p-cEN43Ahr.js → p-CkffScdn.js} +1 -1
  126. package/components/{p-BT9-hMMz.js → p-CpcdCRug.js} +1 -1
  127. package/components/{p-Hp8t4RMX.js → p-Csi6iX-c.js} +1 -1
  128. package/components/{p-1sJ0ZDPe.js → p-CthoZqG1.js} +1 -1
  129. package/components/{p-Fl7ZFU74.js → p-DBGxvxkE.js} +1 -1
  130. package/components/p-DEvF_E6y.js +4 -0
  131. package/components/{p-COO0eJOA.js → p-DKX1mWld.js} +1 -1
  132. package/components/{p-CqbGBmqb.js → p-DMT-4tHM.js} +1 -1
  133. package/components/p-DOwsU7Mc.js +4 -0
  134. package/components/{p-5ldEpNdG.js → p-DSuBagxs.js} +1 -1
  135. package/{dist/ionic/p-DZ6Hmc-8.js → components/p-DVHC9GYb.js} +1 -1
  136. package/components/p-DWe-YApm.js +4 -0
  137. package/components/{p-Bi-it1EH.js → p-DX_3N4fh.js} +1 -1
  138. package/components/{p-C-NbvXu4.js → p-DcrAT6v8.js} +1 -1
  139. package/components/p-DftucGJR.js +4 -0
  140. package/components/{p-qAXsfUff.js → p-HO1CDBeU.js} +1 -1
  141. package/components/{p-DM1gJSMP.js → p-MLplUp3U.js} +1 -1
  142. package/{dist/ionic/p-BMiZX1LT.js → components/p-MOwrp7hX.js} +1 -1
  143. package/components/{p-D5w_FlVa.js → p-MSr4IlyS.js} +1 -1
  144. package/components/{p-GGbIHyEF.js → p-PWHvigWP.js} +1 -1
  145. package/components/p-S-gGoI4A.js +4 -0
  146. package/components/{p-BYJRZKHa.js → p-gyjG_IM4.js} +1 -1
  147. package/components/p-k92zpBT6.js +4 -0
  148. package/components/{p-DxhHlJln.js → p-rDUBp56G.js} +1 -1
  149. package/css/core.css +1 -1
  150. package/css/core.css.map +1 -1
  151. package/css/ionic.bundle.css +1 -1
  152. package/css/ionic.bundle.css.map +1 -1
  153. package/dist/cjs/{animation-Kd1N7WTN.js → animation-2DHlng-f.js} +3 -3
  154. package/dist/cjs/{app-globals-b1G4t26O.js → app-globals-BeC95igM.js} +1 -1
  155. package/dist/cjs/{button-active-CQCFubJJ.js → button-active-CTyeZB16.js} +2 -2
  156. package/dist/cjs/{capacitor-DmA66EwP.js → capacitor-cADDPMtd.js} +3 -3
  157. package/dist/cjs/{format-bHU8N1g5.js → format-BbkxKT7p.js} +1 -1
  158. package/dist/cjs/{framework-delegate-d-fWfeI6.js → framework-delegate-DYIuFqQx.js} +1 -1
  159. package/dist/cjs/{haptic-Ch-X4gRx.js → haptic-CqPss9_L.js} +1 -1
  160. package/dist/cjs/{helpers-7wzdhdeg.js → helpers-DHjAEaU9.js} +45 -1
  161. package/dist/cjs/{index-C74Q3t6a.js → index-B-R-H1Z2.js} +7 -8
  162. package/dist/cjs/{index-DtvKGwdh.js → index-BLq7TkUV.js} +2 -2
  163. package/dist/cjs/{index-CQfEIyLK.js → index-D_D542p0.js} +4 -4
  164. package/dist/cjs/{index-DFNrCX7M.js → index-Da83wbmS.js} +8 -9
  165. package/dist/cjs/{index-KiSZqhYS.js → index-MdIUU940.js} +1 -1
  166. package/dist/cjs/{index-DXoo08JC.js → index-T36W_eKv.js} +13 -8
  167. package/dist/cjs/index.cjs.js +17 -19
  168. package/dist/cjs/{input-shims-VJIiKBKv.js → input-shims-DYxL0Fdm.js} +16 -17
  169. package/dist/cjs/{input.utils-EHVE2RK_.js → input.utils-B_32Xwga.js} +1 -1
  170. package/dist/cjs/ion-accordion_2.cjs.entry.js +3 -3
  171. package/dist/cjs/ion-action-sheet.cjs.entry.js +26 -28
  172. package/dist/cjs/ion-alert.cjs.entry.js +27 -29
  173. package/dist/cjs/ion-app_8.cjs.entry.js +72 -24
  174. package/dist/cjs/ion-avatar_3.cjs.entry.js +2 -2
  175. package/dist/cjs/ion-back-button.cjs.entry.js +3 -3
  176. package/dist/cjs/ion-backdrop.cjs.entry.js +2 -2
  177. package/dist/cjs/ion-breadcrumb_2.cjs.entry.js +3 -3
  178. package/dist/cjs/ion-button_2.cjs.entry.js +3 -3
  179. package/dist/cjs/ion-card_5.cjs.entry.js +3 -3
  180. package/dist/cjs/ion-checkbox.cjs.entry.js +4 -4
  181. package/dist/cjs/ion-chip.cjs.entry.js +2 -2
  182. package/dist/cjs/ion-col_3.cjs.entry.js +2 -2
  183. package/dist/cjs/ion-datetime-button.cjs.entry.js +4 -4
  184. package/dist/cjs/ion-datetime.cjs.entry.js +7 -9
  185. package/dist/cjs/ion-fab_3.cjs.entry.js +3 -3
  186. package/dist/cjs/ion-img.cjs.entry.js +3 -3
  187. package/dist/cjs/ion-infinite-scroll_2.cjs.entry.js +5 -5
  188. package/dist/cjs/ion-input-otp.cjs.entry.js +3 -3
  189. package/dist/cjs/ion-input-password-toggle.cjs.entry.js +2 -2
  190. package/dist/cjs/ion-input.cjs.entry.js +5 -6
  191. package/dist/cjs/ion-item-option_3.cjs.entry.js +4 -4
  192. package/dist/cjs/ion-item_8.cjs.entry.js +3 -3
  193. package/dist/cjs/ion-loading.cjs.entry.js +18 -20
  194. package/dist/cjs/ion-menu_3.cjs.entry.js +15 -17
  195. package/dist/cjs/ion-modal.cjs.entry.js +177 -172
  196. package/dist/cjs/ion-nav_2.cjs.entry.js +6 -6
  197. package/dist/cjs/ion-picker-column-option.cjs.entry.js +3 -3
  198. package/dist/cjs/ion-picker-column.cjs.entry.js +8 -9
  199. package/dist/cjs/ion-picker.cjs.entry.js +2 -2
  200. package/dist/cjs/ion-popover.cjs.entry.js +18 -20
  201. package/dist/cjs/ion-progress-bar.cjs.entry.js +3 -3
  202. package/dist/cjs/ion-radio_2.cjs.entry.js +4 -4
  203. package/dist/cjs/ion-range.cjs.entry.js +4 -4
  204. package/dist/cjs/ion-refresher_2.cjs.entry.js +8 -9
  205. package/dist/cjs/ion-reorder_2.cjs.entry.js +6 -7
  206. package/dist/cjs/ion-ripple-effect.cjs.entry.js +2 -2
  207. package/dist/cjs/ion-route_4.cjs.entry.js +4 -4
  208. package/dist/cjs/ion-searchbar.cjs.entry.js +3 -3
  209. package/dist/cjs/ion-segment-content.cjs.entry.js +1 -1
  210. package/dist/cjs/ion-segment-view.cjs.entry.js +1 -1
  211. package/dist/cjs/ion-segment_2.cjs.entry.js +3 -3
  212. package/dist/cjs/ion-select-modal.cjs.entry.js +8 -10
  213. package/dist/cjs/ion-select_3.cjs.entry.js +13 -15
  214. package/dist/cjs/ion-spinner.cjs.entry.js +2 -2
  215. package/dist/cjs/ion-split-pane.cjs.entry.js +2 -2
  216. package/dist/cjs/ion-tab-bar_2.cjs.entry.js +6 -7
  217. package/dist/cjs/ion-tab_2.cjs.entry.js +3 -3
  218. package/dist/cjs/ion-text.cjs.entry.js +2 -2
  219. package/dist/cjs/ion-textarea.cjs.entry.js +5 -6
  220. package/dist/cjs/ion-toast.cjs.entry.js +49 -51
  221. package/dist/cjs/ion-toggle.cjs.entry.js +6 -7
  222. package/dist/cjs/{ionic-global-CYJNT-2P.js → ionic-global-BWd7usAF.js} +1 -1
  223. package/dist/cjs/ionic.cjs.js +5 -5
  224. package/dist/cjs/{ios.transition-DYGiD6gM.js → ios.transition-6AFNO6uU.js} +4 -5
  225. package/dist/cjs/{item-multiple-inputs-Dv6qrMhm.js → item-multiple-inputs-BaBx_Te8.js} +1 -1
  226. package/dist/cjs/{keyboard-Cix5TVkD.js → keyboard-BJEm-3HF.js} +5 -3
  227. package/dist/cjs/{keyboard-cHxZlTyz.js → keyboard-DstMw6u1.js} +1 -1
  228. package/dist/cjs/{keyboard-controller-PtZoN2GS.js → keyboard-controller-DaUNT15d.js} +9 -9
  229. package/dist/cjs/loader.cjs.js +4 -4
  230. package/dist/cjs/{md.transition-CrSkaoz6.js → md.transition-CPq0ckrU.js} +4 -5
  231. package/dist/cjs/{overlays-BR21NUIG.js → overlays-DwMDYc_O.js} +162 -9
  232. package/dist/cjs/{select-option-render-D8ZEjYji.js → select-option-render-Cu-ABBRH.js} +2 -2
  233. package/dist/cjs/{slot-mutation-controller-yNStVQqX.js → slot-mutation-controller-CtYZdaWI.js} +4 -5
  234. package/dist/cjs/{status-tap-CNP5eD1R.js → status-tap-BUfv_eD4.js} +3 -3
  235. package/dist/cjs/{swipe-back-BYb_nLJe.js → swipe-back-DYKxJU5r.js} +2 -2
  236. package/dist/collection/collection-manifest.json +1 -1
  237. package/dist/collection/components/content/content.js +62 -8
  238. package/dist/collection/components/modal/modal.ios.css +12 -1
  239. package/dist/collection/components/modal/modal.js +31 -8
  240. package/dist/collection/components/modal/modal.md.css +12 -1
  241. package/dist/collection/components/modal/safe-area-utils.js +69 -90
  242. package/dist/collection/components/modal/utils.js +7 -0
  243. package/dist/collection/utils/helpers.js +39 -0
  244. package/dist/collection/utils/overlays.js +34 -0
  245. package/dist/docs.json +2 -2
  246. package/dist/esm/{animation-BFNVlYum.js → animation-CAzXJ2I1.js} +2 -2
  247. package/dist/esm/{app-globals-BgX0BGL1.js → app-globals-DGJXnnkm.js} +1 -1
  248. package/dist/esm/{button-active-BfOvDr3b.js → button-active-DyyWVqU3.js} +2 -2
  249. package/dist/esm/{capacitor-CFERIeaU.js → capacitor-C041I3qZ.js} +1 -1
  250. package/dist/esm/{format-DDFE9jM5.js → format-D78cdY12.js} +1 -1
  251. package/dist/esm/{framework-delegate-BwNhx9NR.js → framework-delegate-CUDbUfWS.js} +1 -1
  252. package/dist/esm/{haptic-Cq4UAeka.js → haptic-D3njgGLB.js} +1 -1
  253. package/dist/esm/{helpers-BSmc0nst.js → helpers-BJFnZngp.js} +43 -2
  254. package/dist/esm/{index-DnA_7Bnx.js → index-CdoVp_rZ.js} +4 -4
  255. package/dist/esm/{index-D76bbuoi.js → index-DmnOg_xm.js} +1 -1
  256. package/dist/esm/{index-CJln0gS3.js → index-DoY4e_3F.js} +2 -3
  257. package/dist/esm/{index-C23AVPx9.js → index-Dvqtt_WK.js} +13 -8
  258. package/dist/esm/{index-BuPaALjU.js → index-iurdcGHg.js} +5 -6
  259. package/dist/esm/{index-C1b9CLFg.js → index-obGyiHiO.js} +2 -2
  260. package/dist/esm/index.js +11 -13
  261. package/dist/esm/{input-shims-Dqk-Ou25.js → input-shims-DognYvwv.js} +5 -6
  262. package/dist/esm/{input.utils-rqoH22pW.js → input.utils-C3mVJhji.js} +1 -1
  263. package/dist/esm/ion-accordion_2.entry.js +3 -3
  264. package/dist/esm/ion-action-sheet.entry.js +11 -13
  265. package/dist/esm/ion-alert.entry.js +11 -13
  266. package/dist/esm/ion-app_8.entry.js +72 -24
  267. package/dist/esm/ion-avatar_3.entry.js +2 -2
  268. package/dist/esm/ion-back-button.entry.js +3 -3
  269. package/dist/esm/ion-backdrop.entry.js +2 -2
  270. package/dist/esm/ion-breadcrumb_2.entry.js +3 -3
  271. package/dist/esm/ion-button_2.entry.js +3 -3
  272. package/dist/esm/ion-card_5.entry.js +3 -3
  273. package/dist/esm/ion-checkbox.entry.js +4 -4
  274. package/dist/esm/ion-chip.entry.js +2 -2
  275. package/dist/esm/ion-col_3.entry.js +2 -2
  276. package/dist/esm/ion-datetime-button.entry.js +4 -4
  277. package/dist/esm/ion-datetime.entry.js +6 -8
  278. package/dist/esm/ion-fab_3.entry.js +3 -3
  279. package/dist/esm/ion-img.entry.js +3 -3
  280. package/dist/esm/ion-infinite-scroll_2.entry.js +5 -5
  281. package/dist/esm/ion-input-otp.entry.js +3 -3
  282. package/dist/esm/ion-input-password-toggle.entry.js +2 -2
  283. package/dist/esm/ion-input.entry.js +5 -6
  284. package/dist/esm/ion-item-option_3.entry.js +4 -4
  285. package/dist/esm/ion-item_8.entry.js +3 -3
  286. package/dist/esm/ion-loading.entry.js +7 -9
  287. package/dist/esm/ion-menu_3.entry.js +7 -9
  288. package/dist/esm/ion-modal.entry.js +115 -110
  289. package/dist/esm/ion-nav_2.entry.js +6 -6
  290. package/dist/esm/ion-picker-column-option.entry.js +3 -3
  291. package/dist/esm/ion-picker-column.entry.js +5 -6
  292. package/dist/esm/ion-picker.entry.js +2 -2
  293. package/dist/esm/ion-popover.entry.js +7 -9
  294. package/dist/esm/ion-progress-bar.entry.js +3 -3
  295. package/dist/esm/ion-radio_2.entry.js +4 -4
  296. package/dist/esm/ion-range.entry.js +4 -4
  297. package/dist/esm/ion-refresher_2.entry.js +8 -9
  298. package/dist/esm/ion-reorder_2.entry.js +6 -7
  299. package/dist/esm/ion-ripple-effect.entry.js +2 -2
  300. package/dist/esm/ion-route_4.entry.js +4 -4
  301. package/dist/esm/ion-searchbar.entry.js +3 -3
  302. package/dist/esm/ion-segment-content.entry.js +1 -1
  303. package/dist/esm/ion-segment-view.entry.js +1 -1
  304. package/dist/esm/ion-segment_2.entry.js +3 -3
  305. package/dist/esm/ion-select-modal.entry.js +7 -9
  306. package/dist/esm/ion-select_3.entry.js +8 -10
  307. package/dist/esm/ion-spinner.entry.js +2 -2
  308. package/dist/esm/ion-split-pane.entry.js +2 -2
  309. package/dist/esm/ion-tab-bar_2.entry.js +6 -7
  310. package/dist/esm/ion-tab_2.entry.js +3 -3
  311. package/dist/esm/ion-text.entry.js +2 -2
  312. package/dist/esm/ion-textarea.entry.js +5 -6
  313. package/dist/esm/ion-toast.entry.js +7 -9
  314. package/dist/esm/ion-toggle.entry.js +6 -7
  315. package/dist/esm/{ionic-global-ZXjCXKH0.js → ionic-global-BSaFA7np.js} +1 -1
  316. package/dist/esm/ionic.js +6 -6
  317. package/dist/esm/{ios.transition-CWAgfQ1r.js → ios.transition-ofa92pAl.js} +4 -5
  318. package/dist/esm/{item-multiple-inputs-DZnIiOO_.js → item-multiple-inputs-CffmpUe9.js} +1 -1
  319. package/dist/esm/{keyboard-DAF8GNJ9.js → keyboard-Cz4hUjuj.js} +1 -1
  320. package/dist/esm/{keyboard-Cj8mLJeq.js → keyboard-Dsc85bts.js} +5 -3
  321. package/dist/esm/{keyboard-controller-DEwoa1ev.js → keyboard-controller-BLvRgxgP.js} +2 -2
  322. package/dist/esm/loader.js +5 -5
  323. package/dist/esm/{md.transition-ZuqDDdDW.js → md.transition-DnFfqsAv.js} +4 -5
  324. package/dist/esm/{overlays-DKE0DgvE.js → overlays-a_5AhqWk.js} +156 -7
  325. package/dist/esm/{select-option-render-CRP_teb1.js → select-option-render-C_PCwA67.js} +2 -2
  326. package/dist/esm/{slot-mutation-controller-BVnANfIt.js → slot-mutation-controller-D7n8Peo2.js} +1 -2
  327. package/dist/esm/{status-tap-Cv9gb3ja.js → status-tap-BsTKKfug.js} +3 -3
  328. package/dist/esm/{swipe-back-B2CmabKY.js → swipe-back-ibFGqXH2.js} +2 -2
  329. package/dist/ionic/index.esm.js +1 -1
  330. package/dist/ionic/ionic.esm.js +1 -1
  331. package/dist/ionic/p-063769cf.entry.js +4 -0
  332. package/dist/ionic/{p-d8c138d9.entry.js → p-097a0cf5.entry.js} +1 -1
  333. package/dist/ionic/{p-ec00fd0d.entry.js → p-0a14a6a3.entry.js} +1 -1
  334. package/dist/ionic/p-0a824cef.entry.js +4 -0
  335. package/dist/ionic/{p-9c5f2691.entry.js → p-12ea6d13.entry.js} +1 -1
  336. package/dist/ionic/p-1c4926e9.entry.js +4 -0
  337. package/dist/ionic/p-1dac4211.entry.js +4 -0
  338. package/dist/ionic/{p-a8ff2489.entry.js → p-23afeeb2.entry.js} +1 -1
  339. package/dist/ionic/{p-ca1b8865.entry.js → p-25abc69d.entry.js} +1 -1
  340. package/dist/ionic/{p-099b7f9f.entry.js → p-26d89234.entry.js} +1 -1
  341. package/dist/ionic/{p-8b80d9f9.entry.js → p-28952272.entry.js} +1 -1
  342. package/dist/ionic/{p-5cc09b40.entry.js → p-29687c0b.entry.js} +1 -1
  343. package/dist/ionic/p-2ecebfd9.entry.js +4 -0
  344. package/dist/ionic/p-302e4d74.entry.js +4 -0
  345. package/dist/ionic/p-38d3e1cb.entry.js +4 -0
  346. package/dist/ionic/p-41254776.entry.js +4 -0
  347. package/dist/ionic/{p-6e386853.entry.js → p-416bec74.entry.js} +1 -1
  348. package/dist/ionic/{p-354d38d3.entry.js → p-41ae57ea.entry.js} +1 -1
  349. package/dist/ionic/{p-7bfeccb3.entry.js → p-4dc3f2b3.entry.js} +1 -1
  350. package/dist/ionic/{p-efc0cf82.entry.js → p-5272e103.entry.js} +1 -1
  351. package/dist/ionic/{p-68cc89a6.entry.js → p-59305088.entry.js} +1 -1
  352. package/dist/ionic/p-5b9b245e.entry.js +4 -0
  353. package/dist/ionic/{p-561af487.entry.js → p-5eadc64e.entry.js} +1 -1
  354. package/dist/ionic/p-5f695204.entry.js +4 -0
  355. package/dist/ionic/{p-38b9375b.entry.js → p-60ca717e.entry.js} +1 -1
  356. package/dist/ionic/{p-4c3e50f8.entry.js → p-63eb4550.entry.js} +1 -1
  357. package/dist/ionic/{p-90f50a65.entry.js → p-689f7a37.entry.js} +1 -1
  358. package/dist/ionic/{p-54cbb0a7.entry.js → p-7da532af.entry.js} +1 -1
  359. package/dist/ionic/{p-271c3640.entry.js → p-84dea138.entry.js} +1 -1
  360. package/dist/ionic/{p-4712a8a9.entry.js → p-88cf4127.entry.js} +1 -1
  361. package/dist/ionic/{p-3bba83ee.entry.js → p-89e04e63.entry.js} +1 -1
  362. package/dist/ionic/{p-dd01be0a.entry.js → p-8af458bf.entry.js} +1 -1
  363. package/dist/ionic/p-8d68604a.entry.js +4 -0
  364. package/dist/ionic/p-B13Uv-FT.js +4 -0
  365. package/dist/ionic/p-B8K6OHqa.js +4 -0
  366. package/dist/ionic/p-BD0v0Sx_.js +4 -0
  367. package/dist/ionic/p-BDs20Dfe.js +4 -0
  368. package/dist/ionic/p-BIj0Lfim.js +4 -0
  369. package/dist/ionic/p-BRZstBYy.js +4 -0
  370. package/dist/ionic/{p-T71k3C35.js → p-BRlwrQ6h.js} +1 -1
  371. package/dist/ionic/{p-DYUjHcuH.js → p-BT0-h-eD.js} +1 -1
  372. package/dist/ionic/p-Ba_yQZdQ.js +4 -0
  373. package/dist/ionic/p-BnMJqJBa.js +4 -0
  374. package/{components/p-6ZLn6K5e.js → dist/ionic/p-BrbwGxm1.js} +1 -1
  375. package/dist/ionic/p-Bu6uWqQM.js +4 -0
  376. package/dist/ionic/p-Bx46Dlpo.js +4 -0
  377. package/dist/ionic/p-C0vJzNM9.js +4 -0
  378. package/dist/ionic/p-C4FdGOym.js +4 -0
  379. package/dist/ionic/p-C5SsTfux.js +4 -0
  380. package/dist/ionic/p-CD77BF32.js +4 -0
  381. package/dist/ionic/p-CESQIy-V.js +4 -0
  382. package/dist/ionic/{p-BaeKWZ-a.js → p-CazJOH5P.js} +1 -1
  383. package/dist/ionic/p-D14knedj.js +4 -0
  384. package/dist/ionic/p-DQcKi6P6.js +4 -0
  385. package/dist/ionic/p-DlvB1Idh.js +4 -0
  386. package/dist/ionic/{p-C23AVPx9.js → p-Dvqtt_WK.js} +1 -1
  387. package/dist/ionic/{p-CJv-wOAd.js → p-NL1pxcde.js} +1 -1
  388. package/dist/ionic/{p-191a651e.entry.js → p-a1d733a3.entry.js} +1 -1
  389. package/dist/ionic/p-a4a2ce90.entry.js +4 -0
  390. package/dist/ionic/p-a6a95175.entry.js +4 -0
  391. package/dist/ionic/p-ac6a1168.entry.js +4 -0
  392. package/dist/ionic/{p-cc4320d3.entry.js → p-bcf18c26.entry.js} +1 -1
  393. package/dist/ionic/p-be8ae1cc.entry.js +4 -0
  394. package/dist/ionic/{p-85599fe3.entry.js → p-c0dd14f4.entry.js} +1 -1
  395. package/dist/ionic/{p-f0fb23c1.entry.js → p-c9952851.entry.js} +1 -1
  396. package/dist/ionic/p-cb893f35.entry.js +4 -0
  397. package/dist/ionic/p-d7fb1d2a.entry.js +4 -0
  398. package/dist/ionic/{p-ee09ac9d.entry.js → p-d8a6ebfd.entry.js} +1 -1
  399. package/dist/ionic/{p-7fbb3319.entry.js → p-dd89474c.entry.js} +1 -1
  400. package/dist/ionic/{p-fe9ed9bd.entry.js → p-df272a41.entry.js} +1 -1
  401. package/dist/ionic/{p-b9b4e85d.entry.js → p-e04a7110.entry.js} +1 -1
  402. package/dist/ionic/{p-D7jHfs0Y.js → p-e0g1fYYm.js} +1 -1
  403. package/dist/ionic/{p-a8df96c8.entry.js → p-e3a98575.entry.js} +1 -1
  404. package/dist/ionic/{p-d6755739.entry.js → p-efa78f73.entry.js} +1 -1
  405. package/dist/ionic/{p-1f24cb24.entry.js → p-f97ef975.entry.js} +1 -1
  406. package/dist/ionic/p-fc3312a4.entry.js +4 -0
  407. package/dist/ionic/{p-5d9094ac.entry.js → p-fd220f9c.entry.js} +1 -1
  408. package/dist/ionic/p-g9SK-dv1.js +4 -0
  409. package/dist/ionic/p-yYEBg4iw.js +4 -0
  410. package/dist/ionic/{p-BMPN55of.js → p-yiP8rgDC.js} +1 -1
  411. package/dist/types/components/content/content.d.ts +28 -3
  412. package/dist/types/components/modal/modal.d.ts +9 -1
  413. package/dist/types/components/modal/safe-area-utils.d.ts +28 -14
  414. package/dist/types/components/modal/utils.d.ts +4 -0
  415. package/dist/types/components.d.ts +1 -1
  416. package/dist/types/stencil-public-runtime.d.ts +61 -55
  417. package/dist/types/utils/helpers.d.ts +17 -0
  418. package/dist/types/utils/overlays.d.ts +15 -0
  419. package/hydrate/index.js +315 -136
  420. package/hydrate/index.mjs +315 -136
  421. package/package.json +1 -1
  422. package/components/p-BNIsryb2.js +0 -4
  423. package/components/p-BU8a2IhR.js +0 -4
  424. package/components/p-BWoa-cki.js +0 -4
  425. package/components/p-BgkOsq-d.js +0 -4
  426. package/components/p-C09TXohi.js +0 -4
  427. package/components/p-CG_zZq_I.js +0 -4
  428. package/components/p-CWAks_S_.js +0 -4
  429. package/components/p-CWuIRJQN.js +0 -4
  430. package/components/p-CobW5muY.js +0 -4
  431. package/components/p-CrAKlX71.js +0 -4
  432. package/components/p-DhNuxvJH.js +0 -4
  433. package/components/p-DiuOa1vw.js +0 -4
  434. package/components/p-M34T2gyX.js +0 -4
  435. package/dist/cjs/hardware-back-button-Bu4Dzw8l.js +0 -121
  436. package/dist/cjs/index-DkNv4J_i.js +0 -10
  437. package/dist/esm/hardware-back-button-DmkiRgOT.js +0 -115
  438. package/dist/esm/index-ZjP4CjeZ.js +0 -7
  439. package/dist/ionic/p-171a2278.entry.js +0 -4
  440. package/dist/ionic/p-1e64f5c7.entry.js +0 -4
  441. package/dist/ionic/p-2ea4bb36.entry.js +0 -4
  442. package/dist/ionic/p-338a02e0.entry.js +0 -4
  443. package/dist/ionic/p-3e01c744.entry.js +0 -4
  444. package/dist/ionic/p-458715a9.entry.js +0 -4
  445. package/dist/ionic/p-5906ea6f.entry.js +0 -4
  446. package/dist/ionic/p-612ea3b1.entry.js +0 -4
  447. package/dist/ionic/p-723f4dcd.entry.js +0 -4
  448. package/dist/ionic/p-77c96e08.entry.js +0 -4
  449. package/dist/ionic/p-803059b6.entry.js +0 -4
  450. package/dist/ionic/p-9595e305.entry.js +0 -4
  451. package/dist/ionic/p-BY6BzzPF.js +0 -4
  452. package/dist/ionic/p-Bd72UYI2.js +0 -4
  453. package/dist/ionic/p-BgOvhHy_.js +0 -4
  454. package/dist/ionic/p-BhamHSw3.js +0 -4
  455. package/dist/ionic/p-BijjLYjT.js +0 -4
  456. package/dist/ionic/p-C8XilMh0.js +0 -4
  457. package/dist/ionic/p-CER8qW8Y.js +0 -4
  458. package/dist/ionic/p-CFuOr1Tu.js +0 -4
  459. package/dist/ionic/p-CIGNaXM1.js +0 -4
  460. package/dist/ionic/p-CMZYmFb4.js +0 -4
  461. package/dist/ionic/p-CmXuiRT6.js +0 -4
  462. package/dist/ionic/p-D5t_-oMk.js +0 -4
  463. package/dist/ionic/p-D6rHcCvc.js +0 -4
  464. package/dist/ionic/p-DLM95R4x.js +0 -4
  465. package/dist/ionic/p-D_gb-kdd.js +0 -4
  466. package/dist/ionic/p-DajLgJ4d.js +0 -4
  467. package/dist/ionic/p-Do3zTvCA.js +0 -4
  468. package/dist/ionic/p-ZjP4CjeZ.js +0 -4
  469. package/dist/ionic/p-aff52029.entry.js +0 -4
  470. package/dist/ionic/p-b3532b8d.entry.js +0 -4
  471. package/dist/ionic/p-d526798a.entry.js +0 -4
  472. package/dist/ionic/p-e7f4b1e0.entry.js +0 -4
  473. package/dist/ionic/p-ed725cdf.entry.js +0 -4
  474. package/dist/ionic/p-fa50d493.entry.js +0 -4
  475. package/dist/ionic/p-zWf7R2xV.js +0 -4
package/hydrate/index.mjs CHANGED
@@ -5,6 +5,10 @@ import { Readable } from 'stream';
5
5
 
6
6
  const modeResolutionChain = [];
7
7
 
8
+ // captured here, at true module scope, before hydrateFactory shadows the
9
+ // AbortController identifier for component code below.
10
+ var $stencilNativeAbortController = AbortController;
11
+
8
12
  function hydrateFactory($stencilWindow, $stencilHydrateOpts, $stencilHydrateResults, $stencilAfterHydrate, $stencilHydrateResolve) {
9
13
  var globalThis = $stencilWindow;
10
14
  var self = $stencilWindow;
@@ -96,8 +100,46 @@ function hydrateFactory($stencilWindow, $stencilHydrateOpts, $stencilHydrateResu
96
100
 
97
101
  var fetch, FetchError, Headers, Request, Response;
98
102
 
103
+ // Aborted when the render times out or errors, so in-flight fetch() calls
104
+ // made by component code stop holding the render's window/results alive
105
+ // instead of running to completion against a torn-down window. See #6864.
106
+ var $stencilAbortController = new $stencilNativeAbortController();
107
+
108
+ // Any AbortController a component creates itself is transparently wired to
109
+ // cascade-abort when the render times out too, so component code using the
110
+ // standard AbortController convention for its own cancellable work (axios,
111
+ // aws-sdk v3, the mongodb driver, etc.) gets cancelled automatically.
112
+ var AbortController = function () {
113
+ var controller = new $stencilNativeAbortController();
114
+ $stencilAbortController.signal.addEventListener(
115
+ 'abort',
116
+ function () {
117
+ controller.abort();
118
+ },
119
+ { once: true },
120
+ );
121
+ return controller;
122
+ };
123
+
124
+ function $stencilFetchSignal(callerSignal) {
125
+ if (!callerSignal) {
126
+ return $stencilAbortController.signal;
127
+ }
128
+ if (callerSignal.aborted || $stencilAbortController.signal.aborted) {
129
+ return callerSignal.aborted ? callerSignal : $stencilAbortController.signal;
130
+ }
131
+ var merged = new $stencilNativeAbortController();
132
+ var onAbort = function () { merged.abort(); };
133
+ callerSignal.addEventListener('abort', onAbort, { once: true });
134
+ $stencilAbortController.signal.addEventListener('abort', onAbort, { once: true });
135
+ return merged.signal;
136
+ }
137
+
99
138
  if (typeof $stencilWindow.fetch === 'function') {
100
- fetch = $stencilWindow.fetch;
139
+ var $stencilRawFetch = $stencilWindow.fetch;
140
+ fetch = $stencilWindow.fetch = function(input, init) {
141
+ return $stencilRawFetch(input, Object.assign({}, init, { signal: $stencilFetchSignal(init && init.signal) }));
142
+ };
101
143
  } else {
102
144
  fetch = $stencilWindow.fetch = function() { throw new Error('fetch() is not implemented'); };
103
145
  }
@@ -420,7 +462,7 @@ const appGlobalScript = initialize || (() => {});
420
462
  const globalScripts = appGlobalScript;
421
463
 
422
464
  /*
423
- Stencil Hydrate Platform v4.44.2 | MIT Licensed | https://stenciljs.com
465
+ Stencil Hydrate Platform v4.45.0 | MIT Licensed | https://stenciljs.com
424
466
  */
425
467
  var __create = Object.create;
426
468
  var __defProp = Object.defineProperty;
@@ -1884,13 +1926,14 @@ var scopeSelector = (selector, scopeSelectorText, hostSelector, slotSelector) =>
1884
1926
  }
1885
1927
  }).join(", ");
1886
1928
  };
1929
+ var isScopableAtRule = (selector) => selector.startsWith("@media") || selector.startsWith("@supports") || selector.startsWith("@page") || selector.startsWith("@document") || selector.startsWith("@layer");
1887
1930
  var scopeSelectors = (cssText, scopeSelectorText, hostSelector, slotSelector, commentOriginalSelector) => {
1888
1931
  return processRules(cssText, (rule) => {
1889
1932
  let selector = rule.selector;
1890
1933
  let content = rule.content;
1891
1934
  if (rule.selector[0] !== "@") {
1892
1935
  selector = scopeSelector(rule.selector, scopeSelectorText, hostSelector, slotSelector);
1893
- } else if (rule.selector.startsWith("@media") || rule.selector.startsWith("@supports") || rule.selector.startsWith("@page") || rule.selector.startsWith("@document")) {
1936
+ } else if (isScopableAtRule(rule.selector)) {
1894
1937
  content = scopeSelectors(rule.content, scopeSelectorText, hostSelector, slotSelector);
1895
1938
  }
1896
1939
  const cssRule = {
@@ -1969,15 +2012,16 @@ var scopeCss = (cssText, scopeId2, commentOriginalSelector) => {
1969
2012
  rule.selector = placeholder + rule.selector;
1970
2013
  return rule;
1971
2014
  };
1972
- cssText = processRules(cssText, (rule) => {
2015
+ const commentSelectors = (input) => processRules(input, (rule) => {
1973
2016
  if (rule.selector[0] !== "@") {
1974
2017
  return processCommentedSelector(rule);
1975
- } else if (rule.selector.startsWith("@media") || rule.selector.startsWith("@supports") || rule.selector.startsWith("@page") || rule.selector.startsWith("@document")) {
1976
- rule.content = processRules(rule.content, processCommentedSelector);
1977
- return rule;
2018
+ }
2019
+ if (isScopableAtRule(rule.selector)) {
2020
+ rule.content = commentSelectors(rule.content);
1978
2021
  }
1979
2022
  return rule;
1980
2023
  });
2024
+ cssText = commentSelectors(cssText);
1981
2025
  }
1982
2026
  const scoped = scopeCssText(cssText, scopeId2, hostScopeId, slotScopeId);
1983
2027
  cssText = [scoped.cssText, ...commentsWithHash].join("\n");
@@ -2618,7 +2662,7 @@ var updateChildren = (parentElm, oldCh, newVNode2, newCh, isInitialRender = fals
2618
2662
  if (idxInOld >= 0) {
2619
2663
  elmToMove = oldCh[idxInOld];
2620
2664
  if (elmToMove.$tag$ !== newStartVnode.$tag$) {
2621
- node = createElm(oldCh && oldCh[newStartIdx], newVNode2, idxInOld);
2665
+ node = createElm(oldCh && oldCh[newStartIdx], newVNode2, newStartIdx);
2622
2666
  } else {
2623
2667
  patch(elmToMove, newStartVnode, isInitialRender);
2624
2668
  oldCh[idxInOld] = void 0;
@@ -5393,7 +5437,7 @@ function forceUpdate2() {
5393
5437
  }
5394
5438
 
5395
5439
  // src/hydrate/platform/hydrate-app.ts
5396
- function hydrateApp(win2, opts, results, afterHydrate, resolve) {
5440
+ function hydrateApp(win2, opts, results, afterHydrate, resolve, abortController) {
5397
5441
  const connectedElements = /* @__PURE__ */ new Set();
5398
5442
  const createdElements = /* @__PURE__ */ new Set();
5399
5443
  const waitingElements = /* @__PURE__ */ new Set();
@@ -5403,6 +5447,13 @@ function hydrateApp(win2, opts, results, afterHydrate, resolve) {
5403
5447
  setScopedSSR(opts);
5404
5448
  let tmrId;
5405
5449
  let ranCompleted = false;
5450
+ const abortedPromise = new Promise((res) => {
5451
+ if (abortController.signal.aborted) {
5452
+ res();
5453
+ } else {
5454
+ abortController.signal.addEventListener("abort", () => res(), { once: true });
5455
+ }
5456
+ });
5406
5457
  function hydratedComplete() {
5407
5458
  globalThis.clearTimeout(tmrId);
5408
5459
  createdElements.clear();
@@ -5424,6 +5475,7 @@ function hydrateApp(win2, opts, results, afterHydrate, resolve) {
5424
5475
  }
5425
5476
  function hydratedError(err2) {
5426
5477
  renderCatchError(opts, results, err2);
5478
+ abortController.abort();
5427
5479
  hydratedComplete();
5428
5480
  }
5429
5481
  function timeoutExceeded() {
@@ -5469,7 +5521,7 @@ function hydrateApp(win2, opts, results, afterHydrate, resolve) {
5469
5521
  if (isValidComponent(elm, opts) && results.hydratedCount < opts.maxHydrateCount) {
5470
5522
  if (!connectedElements.has(elm) && shouldHydrate(elm)) {
5471
5523
  connectedElements.add(elm);
5472
- return hydrateComponent.call(elm, win2, results, elm.nodeName, elm, waitingElements);
5524
+ return hydrateComponent.call(elm, win2, results, elm.nodeName, elm, waitingElements, abortedPromise);
5473
5525
  }
5474
5526
  }
5475
5527
  return resolved2;
@@ -5499,7 +5551,7 @@ function hydrateApp(win2, opts, results, afterHydrate, resolve) {
5499
5551
  hydratedError(e);
5500
5552
  }
5501
5553
  }
5502
- async function hydrateComponent(win2, results, tagName, elm, waitingElements) {
5554
+ async function hydrateComponent(win2, results, tagName, elm, waitingElements, aborted) {
5503
5555
  tagName = tagName.toLowerCase();
5504
5556
  const Cstr = loadModule(
5505
5557
  {
@@ -5515,17 +5567,19 @@ async function hydrateComponent(win2, results, tagName, elm, waitingElements) {
5515
5567
  addHostEventListeners(this, hostRef, cmpMeta.$listeners$);
5516
5568
  try {
5517
5569
  connectedCallback(elm);
5518
- await elm.componentOnReady();
5519
- results.hydratedCount++;
5520
- const ref = getHostRef(elm);
5521
- const modeName = !(ref == null ? void 0 : ref.$modeName$) ? "$" : ref == null ? void 0 : ref.$modeName$;
5522
- if (!results.components.some((c) => c.tag === tagName && c.mode === modeName)) {
5523
- results.components.push({
5524
- tag: tagName,
5525
- mode: modeName,
5526
- count: 0,
5527
- depth: -1
5528
- });
5570
+ const wasAborted = await Promise.race([elm.componentOnReady().then(() => false), aborted.then(() => true)]);
5571
+ if (!wasAborted) {
5572
+ results.hydratedCount++;
5573
+ const ref = getHostRef(elm);
5574
+ const modeName = !(ref == null ? void 0 : ref.$modeName$) ? "$" : ref == null ? void 0 : ref.$modeName$;
5575
+ if (!results.components.some((c) => c.tag === tagName && c.mode === modeName)) {
5576
+ results.components.push({
5577
+ tag: tagName,
5578
+ mode: modeName,
5579
+ count: 0,
5580
+ depth: -1
5581
+ });
5582
+ }
5529
5583
  }
5530
5584
  } catch (e) {
5531
5585
  win2.console.error(e);
@@ -5783,6 +5837,9 @@ var setScopedSSR = (opts) => {
5783
5837
  var needsScopedSSR = () => scopedSSR;
5784
5838
  var scopedSSR = false;
5785
5839
 
5840
+ const win$1 = typeof window !== 'undefined' ? window : undefined;
5841
+ const doc = typeof document !== 'undefined' ? document : undefined;
5842
+
5786
5843
  /**
5787
5844
  * Returns `true` if the direction resolves to `rtl` for the given element.
5788
5845
  *
@@ -5977,6 +6034,44 @@ const addEventListener$1 = (el, eventName, callback, opts) => {
5977
6034
  const removeEventListener = (el, eventName, callback, opts) => {
5978
6035
  return el.removeEventListener(eventName, callback, opts);
5979
6036
  };
6037
+ /**
6038
+ * Calls back when a CSS custom property that resolves to a length changes,
6039
+ * which no event covers. The probe inherits the property from `hostEl` and
6040
+ * uses it as its height, turning a property change into a size change that
6041
+ * `ResizeObserver` can detect.
6042
+ *
6043
+ * The callback receives the probe's height. For length values, this matches
6044
+ * the resolved property value. For other values, such as `fit-content`, the
6045
+ * probe remains at zero, so the value only signals that the property changed.
6046
+ * Percentages resolve against the probe's containing block, not the element
6047
+ * where the property is ultimately used.
6048
+ *
6049
+ * Pass `initialValue` when the caller has already read the property so that
6050
+ * changes occurring before the observer's first delivery are not missed.
6051
+ * Without it, the first delivery establishes the baseline.
6052
+ */
6053
+ const onCustomPropertyChange = (hostEl, property, callback, initialValue) => {
6054
+ const doc = win$1?.document;
6055
+ if (!doc || !hostEl || typeof ResizeObserver === 'undefined') {
6056
+ return () => undefined;
6057
+ }
6058
+ const probe = doc.createElement('div');
6059
+ probe.style.cssText = `position:fixed;visibility:hidden;pointer-events:none;top:0;left:0;width:0;height:var(${property},0px);`;
6060
+ hostEl.appendChild(probe);
6061
+ let lastHeight = initialValue;
6062
+ const observer = new ResizeObserver((entries) => {
6063
+ const { height } = entries[0].contentRect;
6064
+ if (lastHeight !== undefined && height !== lastHeight) {
6065
+ callback(height);
6066
+ }
6067
+ lastHeight = height;
6068
+ });
6069
+ observer.observe(probe);
6070
+ return () => {
6071
+ observer.disconnect();
6072
+ probe.remove();
6073
+ };
6074
+ };
5980
6075
  /**
5981
6076
  * Gets the root context of a shadow dom element
5982
6077
  * On newer browsers this will be the shadowRoot,
@@ -6857,9 +6952,6 @@ class AccordionGroup {
6857
6952
  }; }
6858
6953
  }
6859
6954
 
6860
- const win$1 = typeof window !== 'undefined' ? window : undefined;
6861
- const doc = typeof document !== 'undefined' ? document : undefined;
6862
-
6863
6955
  const getCapacitor = () => {
6864
6956
  if (win$1 !== undefined) {
6865
6957
  return win$1.Capacitor;
@@ -8719,6 +8811,40 @@ const safeCall = (handler, arg) => {
8719
8811
  }
8720
8812
  return undefined;
8721
8813
  };
8814
+ /**
8815
+ * `--width` and `--height` values that leave an overlay spanning the viewport
8816
+ * on that axis, so it reaches both edges. An empty value means the property
8817
+ * was never overridden.
8818
+ */
8819
+ const FULLSCREEN_SIZES = ['', '100%', '100vw', '100vh', '100dvw', '100dvh', '100svw', '100svh'];
8820
+ /**
8821
+ * `--width` and `--height` values that size an overlay to its content, leaving
8822
+ * the rendered size dependent on the content and on `--max-width` or
8823
+ * `--max-height`.
8824
+ */
8825
+ const CONTENT_SIZES = ['auto', 'fit-content', 'min-content', 'max-content'];
8826
+ /**
8827
+ * How an overlay's `--width` or `--height` determines its used size:
8828
+ *
8829
+ * `fullscreen` spans the viewport on that axis. `content` depends on the
8830
+ * overlay's content, so its used size is not known until layout. `definite`
8831
+ * resolves independently of the overlay's content size.
8832
+ *
8833
+ * Values are lowercased because CSS keywords are case-insensitive, while a
8834
+ * custom property preserves the case in which it was authored. Content values
8835
+ * are matched as a suffix so vendor-prefixed values such as `-moz-fit-content`
8836
+ * are recognized.
8837
+ */
8838
+ const getOverlaySizeType = (size) => {
8839
+ const value = size.trim().toLowerCase();
8840
+ if (FULLSCREEN_SIZES.includes(value)) {
8841
+ return 'fullscreen';
8842
+ }
8843
+ if (CONTENT_SIZES.some((keyword) => value.endsWith(keyword))) {
8844
+ return 'content';
8845
+ }
8846
+ return 'definite';
8847
+ };
8722
8848
  const BACKDROP = 'backdrop';
8723
8849
  const GESTURE = 'gesture';
8724
8850
  const OVERLAY_GESTURE_PRIORITY = 39;
@@ -13598,6 +13724,10 @@ class Content {
13598
13724
  data: undefined,
13599
13725
  isScrolling: true,
13600
13726
  };
13727
+ /**
13728
+ * Whether the host is sized to its content.
13729
+ */
13730
+ this.sizeToContent = false;
13601
13731
  /**
13602
13732
  * If `true`, the content will scroll behind the headers
13603
13733
  * and footers. This effect can easily be seen by setting the toolbar
@@ -13631,6 +13761,7 @@ class Content {
13631
13761
  }
13632
13762
  componentWillLoad() {
13633
13763
  this.inheritedAttributes = inheritAriaAttributes(this.el);
13764
+ this.sizeToContent = this.readSizeToContent();
13634
13765
  }
13635
13766
  connectedCallback() {
13636
13767
  this.isMainContent = this.el.closest('ion-menu, ion-popover, ion-modal') === null;
@@ -13670,6 +13801,7 @@ class Content {
13670
13801
  }
13671
13802
  // Re-observe on reattach, since componentDidLoad only fires once.
13672
13803
  this.setupFullscreenResizeObserver();
13804
+ this.updateSizeToContent();
13673
13805
  }
13674
13806
  componentDidLoad() {
13675
13807
  // The custom elements build assigns fullscreen after connectedCallback.
@@ -13709,6 +13841,16 @@ class Content {
13709
13841
  return;
13710
13842
  }
13711
13843
  }
13844
+ /**
13845
+ * Picks up an overlay that is no longer sized the way the last render
13846
+ * assumed, re-rendering only when the answer changes. Read in a `readTask`
13847
+ * because resolving the custom property forces a style recalculation.
13848
+ */
13849
+ updateSizeToContent() {
13850
+ readTask(() => {
13851
+ this.sizeToContent = this.readSizeToContent();
13852
+ });
13853
+ }
13712
13854
  destroyFullscreenResizeObserver() {
13713
13855
  if (this.fullscreenResizeObserver !== undefined) {
13714
13856
  this.fullscreenResizeObserver.disconnect();
@@ -13755,16 +13897,42 @@ class Content {
13755
13897
  const mode = getIonMode$1(this);
13756
13898
  return forceOverscroll === undefined ? mode === 'ios' && isPlatform('ios') : forceOverscroll;
13757
13899
  }
13900
+ /**
13901
+ * Reads whether to size the component to its content height. Forces a style
13902
+ * recalculation, so it belongs in a read task or before the first render.
13903
+ *
13904
+ * This applies inside popovers and modals with a content-based `--height`,
13905
+ * where the overlay does not provide the content with a definite height
13906
+ * to fill.
13907
+ *
13908
+ * Only `--height` is consulted. Styling the wrapper directly, such as
13909
+ * `ion-modal::part(content) { height: fit-content; }`, does not change
13910
+ * `--height` and therefore cannot be observed. `--height` is the only
13911
+ * supported way to opt into content-based sizing.
13912
+ */
13913
+ readSizeToContent() {
13914
+ if (hostContext('ion-popover', this.el)) {
13915
+ return true;
13916
+ }
13917
+ const modal = this.el.closest('ion-modal');
13918
+ if (modal === null) {
13919
+ return false;
13920
+ }
13921
+ const height = getComputedStyle(modal).getPropertyValue('--height');
13922
+ return getOverlaySizeType(height) === 'content';
13923
+ }
13758
13924
  resize() {
13759
13925
  }
13760
13926
  /**
13761
- * Recalculate content dimensions. Called by overlays (e.g., popover) when
13762
- * sibling elements like headers or footers have finished rendering and their
13763
- * heights are available, ensuring accurate offset-top calculations.
13927
+ * Recalculates the content dimensions and whether it should size itself to
13928
+ * its content. Called by overlays when something they own changes, such as
13929
+ * a header finishing its render or `--height` being updated.
13930
+ *
13764
13931
  * @internal
13765
13932
  */
13766
13933
  async recalculateDimensions() {
13767
13934
  readTask(() => this.readDimensions());
13935
+ this.updateSizeToContent();
13768
13936
  }
13769
13937
  readDimensions() {
13770
13938
  const page = getPageElement(this.el);
@@ -13934,21 +14102,21 @@ class Content {
13934
14102
  const forceOverscroll = this.shouldForceOverscroll();
13935
14103
  const transitionShadow = mode === 'ios';
13936
14104
  this.resize();
13937
- return (hAsync(Host, { key: '9551c759df407b10d809171641fc6e8f14d92219', role: isMainContent ? 'main' : undefined, class: createColorClasses$1(this.color, {
14105
+ return (hAsync(Host, { key: 'e1013621096729354ef92915af52dd823e69fdff', role: isMainContent ? 'main' : undefined, class: createColorClasses$1(this.color, {
13938
14106
  [mode]: true,
13939
14107
  'content-fullscreen': this.fullscreen,
13940
- 'content-sizing': hostContext('ion-popover', this.el),
14108
+ 'content-sizing': this.sizeToContent,
13941
14109
  overscroll: forceOverscroll,
13942
14110
  [`content-${rtl}`]: true,
13943
14111
  }), style: {
13944
14112
  '--offset-top': `${this.cTop}px`,
13945
14113
  '--offset-bottom': `${this.cBottom}px`,
13946
- }, ...inheritedAttributes }, hAsync("div", { key: 'c6de8fd226f0d10a534eb107fe032ac155fbe68e', ref: (el) => (this.backgroundContentEl = el), id: "background-content", part: "background" }), fixedSlotPlacement === 'before' ? hAsync("slot", { name: "fixed" }) : null, hAsync("div", { key: '082fc2936061360060b48221ecb1c864a3711fa0', class: {
14114
+ }, ...inheritedAttributes }, hAsync("div", { key: '3d8649b164d6324beaa1bc50e1d204ad06c2ec1a', ref: (el) => (this.backgroundContentEl = el), id: "background-content", part: "background" }), fixedSlotPlacement === 'before' ? hAsync("slot", { name: "fixed" }) : null, hAsync("div", { key: 'dd2d3bed8690b4f5027a43f5ec60e7e7df18106d', class: {
13947
14115
  'inner-scroll': true,
13948
14116
  'scroll-x': scrollX,
13949
14117
  'scroll-y': scrollY,
13950
14118
  overscroll: (scrollX || scrollY) && forceOverscroll,
13951
- }, ref: (scrollEl) => (this.scrollEl = scrollEl), onScroll: this.scrollEvents ? (ev) => this.onScroll(ev) : undefined, part: "scroll" }, hAsync("slot", { key: '0d2286206facb22696a9ca7e74a3f6b7d2397aab' })), transitionShadow ? (hAsync("div", { class: "transition-effect" }, hAsync("div", { class: "transition-cover" }), hAsync("div", { class: "transition-shadow" }))) : null, fixedSlotPlacement === 'after' ? hAsync("slot", { name: "fixed" }) : null));
14119
+ }, ref: (scrollEl) => (this.scrollEl = scrollEl), onScroll: this.scrollEvents ? (ev) => this.onScroll(ev) : undefined, part: "scroll" }, hAsync("slot", { key: 'dc3d4584d9e9afd43699525a619b8e873078fbbf' })), transitionShadow ? (hAsync("div", { class: "transition-effect" }, hAsync("div", { class: "transition-cover" }), hAsync("div", { class: "transition-shadow" }))) : null, fixedSlotPlacement === 'after' ? hAsync("slot", { name: "fixed" }) : null));
13952
14120
  }
13953
14121
  get el() { return getElement(this); }
13954
14122
  static get watchers() { return {
@@ -13968,6 +14136,7 @@ class Content {
13968
14136
  "scrollX": [4, "scroll-x"],
13969
14137
  "scrollY": [4, "scroll-y"],
13970
14138
  "scrollEvents": [4, "scroll-events"],
14139
+ "sizeToContent": [32],
13971
14140
  "recalculateDimensions": [64],
13972
14141
  "getScrollElement": [64],
13973
14142
  "getBackgroundElement": [64],
@@ -24976,6 +25145,12 @@ const setCardStatusBarDefault = (defaultStyle = Style.Default) => {
24976
25145
  }
24977
25146
  StatusBar.setStyle({ style: defaultStyle });
24978
25147
  };
25148
+ /**
25149
+ * Calls back when the modal's resolved `--height` changes.
25150
+ */
25151
+ const onModalHeightChange = (hostEl, callback) => {
25152
+ return onCustomPropertyChange(hostEl, '--height', () => callback());
25153
+ };
24979
25154
 
24980
25155
  /**
24981
25156
  * Swiping is only possible when the content is scrolled to the top, so that we
@@ -26503,40 +26678,12 @@ const createSheetGesture = (baseEl, backdropEl, wrapperEl, initialBreakpoint, ba
26503
26678
  };
26504
26679
  };
26505
26680
 
26506
- /**
26507
- * These thresholds match the SCSS media query breakpoints in modal.vars.scss
26508
- * that trigger the centered dialog layout (non-fullscreen modal).
26509
- *
26510
- * SCSS defines two height breakpoints: $modal-inset-min-height-small (600px)
26511
- * and $modal-inset-min-height-large (768px). We use the smaller one because
26512
- * that's the threshold where the modal transitions from fullscreen to centered
26513
- * dialog — the larger breakpoint only increases the dialog's height.
26514
- */
26515
- const MODAL_INSET_MIN_WIDTH = 768;
26516
- const MODAL_INSET_MIN_HEIGHT = 600;
26517
26681
  const EDGE_THRESHOLD = 5;
26518
- /**
26519
- * CSS values for `--width` / `--height` that are treated as fullscreen
26520
- * (modal touches the corresponding screen edges). Empty string means the
26521
- * property was not overridden. See `hasCustomModalDimensions()`.
26522
- */
26523
- const FULLSCREEN_SIZE_VALUES = new Set(['', '100%', '100vw', '100vh', '100dvw', '100dvh', '100svw', '100svh']);
26524
26682
  /**
26525
26683
  * Cache for resolved root safe-area-top value, invalidated once per frame.
26526
26684
  */
26527
26685
  let cachedRootSafeAreaTop = null;
26528
26686
  let cacheInvalidationScheduled$1 = false;
26529
- /**
26530
- * Determines if the current viewport meets the CSS media query conditions
26531
- * that cause regular modals to render as centered dialogs instead of fullscreen.
26532
- * Matches: @media (min-width: 768px) and (min-height: 600px)
26533
- */
26534
- const isCenteredDialogViewport = () => {
26535
- if (!win$1)
26536
- return false;
26537
- return win$1.matchMedia(`(min-width: ${MODAL_INSET_MIN_WIDTH}px) and (min-height: ${MODAL_INSET_MIN_HEIGHT}px)`)
26538
- .matches;
26539
- };
26540
26687
  /**
26541
26688
  * Resolves the current root --ion-safe-area-top value to pixels.
26542
26689
  * Uses a temporary element because getComputedStyle on :root returns
@@ -26570,55 +26717,64 @@ const getRootSafeAreaTop = () => {
26570
26717
  return value;
26571
26718
  };
26572
26719
  /**
26573
- * Calls back when the resolved root `--ion-safe-area-top` changes, which no
26574
- * event and no window resize covers. The probe's height tracks the variable, so
26575
- * a change to it becomes a size change the observer can see.
26720
+ * Calls back when the resolved root `--ion-safe-area-top` changes. The value
26721
+ * the caller already applied is passed as the baseline, so a change between
26722
+ * that read and the observer starting is still reported.
26576
26723
  */
26577
26724
  const onRootSafeAreaTopChange = (callback) => {
26578
- const doc = win$1?.document;
26579
- if (!doc?.body || typeof ResizeObserver === 'undefined') {
26580
- return () => undefined;
26581
- }
26582
- const probe = doc.createElement('div');
26583
- probe.style.cssText =
26584
- 'position:fixed;visibility:hidden;pointer-events:none;top:0;left:0;width:0;' +
26585
- 'height:var(--ion-safe-area-top,0px);';
26586
- doc.body.appendChild(probe);
26587
- /**
26588
- * Seeded with the value the caller has already applied, so a change that
26589
- * lands before the observer's first delivery still gets reported. Comparing
26590
- * against an unset value instead would consume that first delivery and treat
26591
- * the new inset as the baseline.
26592
- */
26593
- let lastHeight = getRootSafeAreaTop();
26594
- const observer = new ResizeObserver((entries) => {
26595
- const { height } = entries[0].contentRect;
26596
- if (height !== lastHeight) {
26597
- lastHeight = height;
26598
- callback(height);
26599
- }
26600
- });
26601
- observer.observe(probe);
26602
- return () => {
26603
- observer.disconnect();
26604
- probe.remove();
26605
- };
26725
+ return onCustomPropertyChange(win$1?.document?.body, '--ion-safe-area-top', callback, getRootSafeAreaTop());
26606
26726
  };
26607
26727
  /**
26608
- * True when the modal host declares BOTH a non-fullscreen `--width` AND a
26609
- * non-fullscreen `--height` (i.e. a centered-dialog-like modal that doesn't
26610
- * touch any screen edge).
26728
+ * Determines which viewport axes the modal spans so safe-area requirements
26729
+ * can be predicted independently for each axis.
26730
+ *
26731
+ * A modal that spans an axis reaches both edges on that axis and needs the
26732
+ * corresponding safe-area insets. A modal that does not span an axis reaches
26733
+ * neither edge on that axis.
26611
26734
  *
26612
- * The conservative "both axes" check avoids mis-zeroing safe-area for
26613
- * partial-custom modals where the modal still touches top/bottom edges
26614
- * (e.g. only `--width` overridden). Partial cases fall through to the
26615
- * existing position-based post-animation correction.
26735
+ * When both `--width` and `--height` are `fullscreen`, coverage can be
26736
+ * determined directly. Otherwise, coverage is based on the rendered wrapper,
26737
+ * including cases where content sizing or `--max-height` causes the modal
26738
+ * to reach the viewport.
26616
26739
  */
26617
- const hasCustomModalDimensions = (hostEl) => {
26740
+ const getModalCoveredAxes = (hostEl) => {
26618
26741
  const styles = getComputedStyle(hostEl);
26619
- const width = styles.getPropertyValue('--width').trim();
26620
- const height = styles.getPropertyValue('--height').trim();
26621
- return !FULLSCREEN_SIZE_VALUES.has(width) && !FULLSCREEN_SIZE_VALUES.has(height);
26742
+ const width = getOverlaySizeType(styles.getPropertyValue('--width'));
26743
+ const height = getOverlaySizeType(styles.getPropertyValue('--height'));
26744
+ if (width === 'fullscreen' && height === 'fullscreen') {
26745
+ return { vertical: true, horizontal: true };
26746
+ }
26747
+ return measureCoveredAxes(hostEl);
26748
+ };
26749
+ /**
26750
+ * Measures the modal wrapper to determine whether it spans the viewport
26751
+ * on each axis.
26752
+ *
26753
+ * The wrapper has no box while the modal is hidden, so `overlay-hidden`
26754
+ * is temporarily removed to allow the wrapper to be measured. The class
26755
+ * is restored in the same task before the browser can paint.
26756
+ *
26757
+ * Only the wrapper's size is measured. Its position is affected by the
26758
+ * enter animation, which initially translates it by its own height, while
26759
+ * the translation does not affect its measured size.
26760
+ */
26761
+ const measureCoveredAxes = (hostEl) => {
26762
+ const wrapperEl = hostEl.shadowRoot?.querySelector('.modal-wrapper');
26763
+ if (wrapperEl == null || win$1 === undefined) {
26764
+ return { vertical: false, horizontal: false };
26765
+ }
26766
+ const wasHidden = hostEl.classList.contains('overlay-hidden');
26767
+ if (wasHidden) {
26768
+ hostEl.classList.remove('overlay-hidden');
26769
+ }
26770
+ const { width, height } = wrapperEl.getBoundingClientRect();
26771
+ if (wasHidden) {
26772
+ hostEl.classList.add('overlay-hidden');
26773
+ }
26774
+ return {
26775
+ vertical: height >= win$1.innerHeight - EDGE_THRESHOLD,
26776
+ horizontal: width >= win$1.innerWidth - EDGE_THRESHOLD,
26777
+ };
26622
26778
  };
26623
26779
  /**
26624
26780
  * Returns the initial safe-area configuration based on modal type.
@@ -26652,26 +26808,23 @@ const getInitialSafeAreaConfig = (context) => {
26652
26808
  right: '0px',
26653
26809
  };
26654
26810
  }
26655
- // On viewports that meet the centered dialog media query breakpoints,
26656
- // regular modals render as centered dialogs (not fullscreen), so they
26657
- // don't touch any screen edges and don't need safe-area insets. Also
26658
- // applies to phone viewports when the modal declares custom --width and
26659
- // --height; these don't touch screen edges either, so the initial
26660
- // prediction must be zero to avoid a post-animation correction flash.
26661
- if (isCenteredDialogViewport() || context.hasCustomDimensions) {
26662
- return {
26663
- top: '0px',
26664
- bottom: '0px',
26665
- left: '0px',
26666
- right: '0px',
26667
- };
26668
- }
26669
- // Fullscreen modals on phone - inherit all safe areas
26811
+ /**
26812
+ * Each axis is evaluated independently because a modal can span one axis
26813
+ * without spanning the other. This allows the initial safe-area configuration
26814
+ * to match the modal's expected dimensions and avoids correcting an incorrect
26815
+ * pair of insets after presentation.
26816
+ *
26817
+ * A modal can span the horizontal axis while remaining inset vertically, or
26818
+ * span the vertical axis while remaining inset horizontally. Wide viewports
26819
+ * can also render regular modals as centered dialogs, while content-sized
26820
+ * modals may still be clamped to the viewport.
26821
+ */
26822
+ const { vertical, horizontal } = context.coveredAxes ?? { vertical: true, horizontal: true };
26670
26823
  return {
26671
- top: 'inherit',
26672
- bottom: 'inherit',
26673
- left: 'inherit',
26674
- right: 'inherit',
26824
+ top: vertical ? 'inherit' : '0px',
26825
+ bottom: vertical ? 'inherit' : '0px',
26826
+ left: horizontal ? 'inherit' : '0px',
26827
+ right: horizontal ? 'inherit' : '0px',
26675
26828
  };
26676
26829
  };
26677
26830
  /**
@@ -26723,9 +26876,9 @@ const clearSafeAreaOverrides = (hostEl) => {
26723
26876
  hostEl.style.removeProperty('--ion-safe-area-right');
26724
26877
  };
26725
26878
 
26726
- const modalIosCss = () => `:host{--width:100%;--min-width:auto;--max-width:auto;--height:100%;--min-height:auto;--max-height:auto;--overflow:hidden;--border-radius:0;--border-width:0;--border-style:none;--border-color:transparent;--background:var(--ion-background-color, #fff);--box-shadow:none;--backdrop-opacity:0;left:0;right:0;top:0;bottom:0;display:-ms-flexbox;display:flex;position:absolute;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center;outline:none;color:var(--ion-text-color, #000);contain:strict}.modal-wrapper,ion-backdrop{pointer-events:auto}:host(.overlay-hidden){display:none}.modal-wrapper,.modal-shadow{border-radius:var(--border-radius);width:var(--width);min-width:var(--min-width);max-width:var(--max-width);height:var(--height);min-height:var(--min-height);max-height:var(--max-height);border-width:var(--border-width);border-style:var(--border-style);border-color:var(--border-color);background:var(--background);-webkit-box-shadow:var(--box-shadow);box-shadow:var(--box-shadow);overflow:var(--overflow);z-index:10}.modal-wrapper{outline:none}.modal-shadow{position:absolute;background:transparent}@media only screen and (min-width: 768px) and (min-height: 600px){:host{--width:600px;--height:500px}}@media only screen and (min-width: 768px) and (min-height: 768px){:host{--width:600px;--height:600px}}.modal-handle{left:0px;right:0px;top:5px;border-radius:8px;-webkit-margin-start:auto;margin-inline-start:auto;-webkit-margin-end:auto;margin-inline-end:auto;position:absolute;width:36px;height:5px;-webkit-transform:translateZ(0);transform:translateZ(0);border:0;background:var(--ion-color-step-350, var(--ion-background-color-step-350, #c0c0be));cursor:pointer;z-index:11}.modal-handle::before{-webkit-padding-start:4px;padding-inline-start:4px;-webkit-padding-end:4px;padding-inline-end:4px;padding-top:4px;padding-bottom:4px;position:absolute;width:36px;height:5px;-webkit-transform:translate(-50%, -50%);transform:translate(-50%, -50%);content:""}:host(.modal-sheet){--height:calc(100% - (var(--ion-modal-offset-top, 0px) + 10px))}:host(.modal-sheet) .modal-wrapper,:host(.modal-sheet) .modal-shadow{position:absolute;bottom:0}:host(.modal-sheet.modal-no-expand-scroll) ion-footer{position:absolute;bottom:0;width:var(--width)}:host{--backdrop-opacity:var(--ion-backdrop-opacity, 0.4)}:host(.modal-card),:host(.modal-sheet){--border-radius:10px}@media only screen and (min-width: 768px) and (min-height: 600px){:host{--border-radius:10px}}.modal-wrapper{-webkit-transform:translate3d(0, 100%, 0);transform:translate3d(0, 100%, 0)}@media screen and (max-width: 767px){@supports (width: max(0px, 1px)){:host(.modal-card){--height:calc(100% - max(30px, var(--ion-safe-area-top)) - 10px)}}@supports not (width: max(0px, 1px)){:host(.modal-card){--height:calc(100% - 40px)}}:host(.modal-card) .modal-wrapper{border-start-start-radius:var(--border-radius);border-start-end-radius:var(--border-radius);border-end-end-radius:0;border-end-start-radius:0}:host(.modal-card){--backdrop-opacity:0;--width:100%;-ms-flex-align:end;align-items:flex-end}:host(.modal-card) .modal-shadow{display:none}:host(.modal-card) ion-backdrop{pointer-events:none}}@media screen and (min-width: 768px){:host(.modal-card){--width:calc(100% - 120px);--height:calc(100% - (120px + var(--ion-safe-area-top) + var(--ion-safe-area-bottom)));--max-width:720px;--max-height:1000px;--backdrop-opacity:0;--box-shadow:0px 0px 30px 10px rgba(0, 0, 0, 0.1);-webkit-transition:all 0.5s ease-in-out;transition:all 0.5s ease-in-out}:host(.modal-card) .modal-wrapper{-webkit-box-shadow:none;box-shadow:none}:host(.modal-card) .modal-shadow{-webkit-box-shadow:var(--box-shadow);box-shadow:var(--box-shadow)}}:host(.modal-sheet) .modal-wrapper{border-start-start-radius:var(--border-radius);border-start-end-radius:var(--border-radius);border-end-end-radius:0;border-end-start-radius:0}`;
26879
+ const modalIosCss = () => `:host{--width:100%;--min-width:auto;--max-width:auto;--height:100%;--min-height:auto;--max-height:100%;--overflow:hidden;--border-radius:0;--border-width:0;--border-style:none;--border-color:transparent;--background:var(--ion-background-color, #fff);--box-shadow:none;--backdrop-opacity:0;left:0;right:0;top:0;bottom:0;display:-ms-flexbox;display:flex;position:absolute;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center;outline:none;color:var(--ion-text-color, #000);contain:strict}.modal-wrapper,ion-backdrop{pointer-events:auto}:host(.overlay-hidden){display:none}.modal-wrapper,.modal-shadow{border-radius:var(--border-radius);width:var(--width);min-width:var(--min-width);max-width:var(--max-width);height:var(--height);min-height:var(--min-height);max-height:var(--max-height);border-width:var(--border-width);border-style:var(--border-style);border-color:var(--border-color);background:var(--background);-webkit-box-shadow:var(--box-shadow);box-shadow:var(--box-shadow);overflow:var(--overflow);z-index:10}.modal-wrapper{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;outline:none}.modal-shadow{position:absolute;background:transparent}@media only screen and (min-width: 768px) and (min-height: 600px){:host{--width:600px;--height:500px}}@media only screen and (min-width: 768px) and (min-height: 768px){:host{--width:600px;--height:600px}}.modal-handle{left:0px;right:0px;top:5px;border-radius:8px;-webkit-margin-start:auto;margin-inline-start:auto;-webkit-margin-end:auto;margin-inline-end:auto;position:absolute;width:36px;height:5px;-webkit-transform:translateZ(0);transform:translateZ(0);border:0;background:var(--ion-color-step-350, var(--ion-background-color-step-350, #c0c0be));cursor:pointer;z-index:11}.modal-handle::before{-webkit-padding-start:4px;padding-inline-start:4px;-webkit-padding-end:4px;padding-inline-end:4px;padding-top:4px;padding-bottom:4px;position:absolute;width:36px;height:5px;-webkit-transform:translate(-50%, -50%);transform:translate(-50%, -50%);content:""}:host(.modal-sheet){--height:calc(100% - (var(--ion-modal-offset-top, 0px) + 10px))}:host(.modal-sheet) .modal-wrapper,:host(.modal-sheet) .modal-shadow{position:absolute;bottom:0}:host(.modal-sheet.modal-no-expand-scroll) ion-footer{position:absolute;bottom:0;width:var(--width)}:host{--backdrop-opacity:var(--ion-backdrop-opacity, 0.4)}:host(.modal-card),:host(.modal-sheet){--border-radius:10px}@media only screen and (min-width: 768px) and (min-height: 600px){:host{--border-radius:10px}}.modal-wrapper{-webkit-transform:translate3d(0, 100%, 0);transform:translate3d(0, 100%, 0)}@media screen and (max-width: 767px){@supports (width: max(0px, 1px)){:host(.modal-card){--height:calc(100% - max(30px, var(--ion-safe-area-top)) - 10px)}}@supports not (width: max(0px, 1px)){:host(.modal-card){--height:calc(100% - 40px)}}:host(.modal-card) .modal-wrapper{border-start-start-radius:var(--border-radius);border-start-end-radius:var(--border-radius);border-end-end-radius:0;border-end-start-radius:0}:host(.modal-card){--backdrop-opacity:0;--width:100%;-ms-flex-align:end;align-items:flex-end}:host(.modal-card) .modal-shadow{display:none}:host(.modal-card) ion-backdrop{pointer-events:none}}@media screen and (min-width: 768px){:host(.modal-card){--width:calc(100% - 120px);--height:calc(100% - (120px + var(--ion-safe-area-top) + var(--ion-safe-area-bottom)));--max-width:720px;--max-height:1000px;--backdrop-opacity:0;--box-shadow:0px 0px 30px 10px rgba(0, 0, 0, 0.1);-webkit-transition:all 0.5s ease-in-out;transition:all 0.5s ease-in-out}:host(.modal-card) .modal-wrapper{-webkit-box-shadow:none;box-shadow:none}:host(.modal-card) .modal-shadow{-webkit-box-shadow:var(--box-shadow);box-shadow:var(--box-shadow)}}:host(.modal-sheet) .modal-wrapper{border-start-start-radius:var(--border-radius);border-start-end-radius:var(--border-radius);border-end-end-radius:0;border-end-start-radius:0}`;
26727
26880
 
26728
- const modalMdCss = () => `:host{--width:100%;--min-width:auto;--max-width:auto;--height:100%;--min-height:auto;--max-height:auto;--overflow:hidden;--border-radius:0;--border-width:0;--border-style:none;--border-color:transparent;--background:var(--ion-background-color, #fff);--box-shadow:none;--backdrop-opacity:0;left:0;right:0;top:0;bottom:0;display:-ms-flexbox;display:flex;position:absolute;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center;outline:none;color:var(--ion-text-color, #000);contain:strict}.modal-wrapper,ion-backdrop{pointer-events:auto}:host(.overlay-hidden){display:none}.modal-wrapper,.modal-shadow{border-radius:var(--border-radius);width:var(--width);min-width:var(--min-width);max-width:var(--max-width);height:var(--height);min-height:var(--min-height);max-height:var(--max-height);border-width:var(--border-width);border-style:var(--border-style);border-color:var(--border-color);background:var(--background);-webkit-box-shadow:var(--box-shadow);box-shadow:var(--box-shadow);overflow:var(--overflow);z-index:10}.modal-wrapper{outline:none}.modal-shadow{position:absolute;background:transparent}@media only screen and (min-width: 768px) and (min-height: 600px){:host{--width:600px;--height:500px}}@media only screen and (min-width: 768px) and (min-height: 768px){:host{--width:600px;--height:600px}}.modal-handle{left:0px;right:0px;top:5px;border-radius:8px;-webkit-margin-start:auto;margin-inline-start:auto;-webkit-margin-end:auto;margin-inline-end:auto;position:absolute;width:36px;height:5px;-webkit-transform:translateZ(0);transform:translateZ(0);border:0;background:var(--ion-color-step-350, var(--ion-background-color-step-350, #c0c0be));cursor:pointer;z-index:11}.modal-handle::before{-webkit-padding-start:4px;padding-inline-start:4px;-webkit-padding-end:4px;padding-inline-end:4px;padding-top:4px;padding-bottom:4px;position:absolute;width:36px;height:5px;-webkit-transform:translate(-50%, -50%);transform:translate(-50%, -50%);content:""}:host(.modal-sheet){--height:calc(100% - (var(--ion-modal-offset-top, 0px) + 10px))}:host(.modal-sheet) .modal-wrapper,:host(.modal-sheet) .modal-shadow{position:absolute;bottom:0}:host(.modal-sheet.modal-no-expand-scroll) ion-footer{position:absolute;bottom:0;width:var(--width)}:host{--backdrop-opacity:var(--ion-backdrop-opacity, 0.32)}@media only screen and (min-width: 768px) and (min-height: 600px){:host{--border-radius:2px;--box-shadow:0 28px 48px rgba(0, 0, 0, 0.4)}}.modal-wrapper{-webkit-transform:translate3d(0, 40px, 0);transform:translate3d(0, 40px, 0);opacity:0.01}`;
26881
+ const modalMdCss = () => `:host{--width:100%;--min-width:auto;--max-width:auto;--height:100%;--min-height:auto;--max-height:100%;--overflow:hidden;--border-radius:0;--border-width:0;--border-style:none;--border-color:transparent;--background:var(--ion-background-color, #fff);--box-shadow:none;--backdrop-opacity:0;left:0;right:0;top:0;bottom:0;display:-ms-flexbox;display:flex;position:absolute;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center;outline:none;color:var(--ion-text-color, #000);contain:strict}.modal-wrapper,ion-backdrop{pointer-events:auto}:host(.overlay-hidden){display:none}.modal-wrapper,.modal-shadow{border-radius:var(--border-radius);width:var(--width);min-width:var(--min-width);max-width:var(--max-width);height:var(--height);min-height:var(--min-height);max-height:var(--max-height);border-width:var(--border-width);border-style:var(--border-style);border-color:var(--border-color);background:var(--background);-webkit-box-shadow:var(--box-shadow);box-shadow:var(--box-shadow);overflow:var(--overflow);z-index:10}.modal-wrapper{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;outline:none}.modal-shadow{position:absolute;background:transparent}@media only screen and (min-width: 768px) and (min-height: 600px){:host{--width:600px;--height:500px}}@media only screen and (min-width: 768px) and (min-height: 768px){:host{--width:600px;--height:600px}}.modal-handle{left:0px;right:0px;top:5px;border-radius:8px;-webkit-margin-start:auto;margin-inline-start:auto;-webkit-margin-end:auto;margin-inline-end:auto;position:absolute;width:36px;height:5px;-webkit-transform:translateZ(0);transform:translateZ(0);border:0;background:var(--ion-color-step-350, var(--ion-background-color-step-350, #c0c0be));cursor:pointer;z-index:11}.modal-handle::before{-webkit-padding-start:4px;padding-inline-start:4px;-webkit-padding-end:4px;padding-inline-end:4px;padding-top:4px;padding-bottom:4px;position:absolute;width:36px;height:5px;-webkit-transform:translate(-50%, -50%);transform:translate(-50%, -50%);content:""}:host(.modal-sheet){--height:calc(100% - (var(--ion-modal-offset-top, 0px) + 10px))}:host(.modal-sheet) .modal-wrapper,:host(.modal-sheet) .modal-shadow{position:absolute;bottom:0}:host(.modal-sheet.modal-no-expand-scroll) ion-footer{position:absolute;bottom:0;width:var(--width)}:host{--backdrop-opacity:var(--ion-backdrop-opacity, 0.32)}@media only screen and (min-width: 768px) and (min-height: 600px){:host{--border-radius:2px;--box-shadow:0 28px 48px rgba(0, 0, 0, 0.4)}}.modal-wrapper{-webkit-transform:translate3d(0, 40px, 0);transform:translate3d(0, 40px, 0);opacity:0.01}`;
26729
26882
 
26730
26883
  // TODO(FW-2832): types
26731
26884
  /**
@@ -27763,7 +27916,7 @@ class Modal {
27763
27916
  /**
27764
27917
  * Creates the context object for safe-area utilities.
27765
27918
  *
27766
- * `hasCustomDimensions` is only set by `setInitialSafeAreaOverrides()`
27919
+ * `coveredAxes` is only set by `setInitialSafeAreaOverrides()`
27767
27920
  * because it is only read by `getInitialSafeAreaConfig()`. Other callers
27768
27921
  * (resize handler, post-animation update, fullscreen-padding apply) would
27769
27922
  * pay a `getComputedStyle()` cost for a value they never consult.
@@ -27777,6 +27930,26 @@ class Modal {
27777
27930
  currentBreakpoint: this.currentBreakpoint,
27778
27931
  };
27779
27932
  }
27933
+ /**
27934
+ * Keeps the content's sizing in sync with `--height`. The content reads the
27935
+ * property to determine whether it should size itself to its content, and
27936
+ * changes to `--height` on an ancestor or the root can change that behavior
27937
+ * without changing the modal itself.
27938
+ */
27939
+ watchHeightForContent() {
27940
+ /**
27941
+ * A sheet's height comes from its breakpoints, so its content never sizes
27942
+ * itself to `--height`. Watching it would cause the drag to recalculate on
27943
+ * every frame.
27944
+ */
27945
+ if (this.isSheetModal) {
27946
+ return;
27947
+ }
27948
+ this.unsubscribeHeightChange?.();
27949
+ this.unsubscribeHeightChange = onModalHeightChange(this.el, () => {
27950
+ this.el.querySelectorAll('ion-content').forEach((contentEl) => contentEl.recalculateDimensions());
27951
+ });
27952
+ }
27780
27953
  /**
27781
27954
  * Sets initial safe-area overrides before modal animation.
27782
27955
  * Called in present() before animation starts.
@@ -27790,10 +27963,11 @@ class Modal {
27790
27963
  setInitialSafeAreaOverrides() {
27791
27964
  const context = {
27792
27965
  ...this.getSafeAreaContext(),
27793
- hasCustomDimensions: hasCustomModalDimensions(this.el),
27966
+ coveredAxes: getModalCoveredAxes(this.el),
27794
27967
  };
27795
27968
  const safeAreaConfig = getInitialSafeAreaConfig(context);
27796
27969
  applySafeAreaOverrides(this.el, safeAreaConfig);
27970
+ this.watchHeightForContent();
27797
27971
  // Set the internal offset property with the resolved root safe-area-top value
27798
27972
  if (context.isSheetModal) {
27799
27973
  this.updateSheetOffsetTop();
@@ -27913,6 +28087,8 @@ class Modal {
27913
28087
  clearSafeAreaOverrides(this.el);
27914
28088
  this.unsubscribeRootSafeAreaTop?.();
27915
28089
  this.unsubscribeRootSafeAreaTop = undefined;
28090
+ this.unsubscribeHeightChange?.();
28091
+ this.unsubscribeHeightChange = undefined;
27916
28092
  // Remove internal sheet offset property
27917
28093
  this.el.style.removeProperty('--ion-modal-offset-top');
27918
28094
  const { contentEl } = this.findContentAndFooter();
@@ -27950,7 +28126,7 @@ class Modal {
27950
28126
  const isCardModal = presentingElement !== undefined && mode === 'ios';
27951
28127
  const isHandleCycle = handleBehavior === 'cycle';
27952
28128
  const isSheetModalWithHandle = isSheetModal && showHandle;
27953
- return (hAsync(Host, { key: '7c9c736052c5a788cf31040b6b2386dd9ea7454b', "no-router": true,
28129
+ return (hAsync(Host, { key: '17a95bd7722bac2344bea041aff97db17f55c0cf', "no-router": true,
27954
28130
  // Allow the modal to be navigable when the handle is focusable
27955
28131
  tabIndex: isHandleCycle && isSheetModalWithHandle ? 0 : -1, ...htmlAttributes, style: {
27956
28132
  zIndex: `${20000 + this.overlayIndex}`,
@@ -27963,7 +28139,7 @@ class Modal {
27963
28139
  'overlay-hidden': true,
27964
28140
  [FOCUS_TRAP_DISABLE_CLASS]: focusTrap === false,
27965
28141
  ...getClassMap(this.cssClass),
27966
- }, onIonBackdropTap: this.onBackdropTap, onIonModalDidPresent: this.onLifecycle, onIonModalWillPresent: this.onLifecycle, onIonModalWillDismiss: this.onLifecycle, onIonModalDidDismiss: this.onLifecycle, onFocus: this.onModalFocus }, hAsync("ion-backdrop", { key: '01b5b5765fb3a32393c736065c824bf760728823', ref: (el) => (this.backdropEl = el), visible: this.showBackdrop, tappable: this.backdropDismiss, part: "backdrop" }), mode === 'ios' && hAsync("div", { key: '40fa7727a0923f7d7461dd027f1511a6a148d84a', class: "modal-shadow" }), hAsync("div", { key: '9af934b607f60795bd5bff7bee6eacfc9b14fa35',
28142
+ }, onIonBackdropTap: this.onBackdropTap, onIonModalDidPresent: this.onLifecycle, onIonModalWillPresent: this.onLifecycle, onIonModalWillDismiss: this.onLifecycle, onIonModalDidDismiss: this.onLifecycle, onFocus: this.onModalFocus }, hAsync("ion-backdrop", { key: '9dab1ef4771c0d847ba2be8672afbaa2748517f3', ref: (el) => (this.backdropEl = el), visible: this.showBackdrop, tappable: this.backdropDismiss, part: "backdrop" }), mode === 'ios' && hAsync("div", { key: '64af7ed1c5f552b61fc4b9387b926acc76c8a99a', class: "modal-shadow" }), hAsync("div", { key: '7e76d77d5b2e8f0467bb793facf5aa86f8d01bbe',
27967
28143
  /*
27968
28144
  role and aria-modal must be used on the
27969
28145
  same element. They must also be set inside the
@@ -27976,9 +28152,9 @@ class Modal {
27976
28152
  without the tabindex focus() would be a no-op and screen readers
27977
28153
  may not properly announce the dialog and its content when it opens.
27978
28154
  */
27979
- role: "dialog", ...inheritedAttributes, "aria-modal": "true", tabIndex: -1, class: "modal-wrapper ion-overlay-wrapper", part: "content", ref: (el) => (this.wrapperEl = el) }, showHandle && (hAsync("button", { key: 'df84a6806413b13efc5b03c862edde83151579a7', class: "modal-handle",
28155
+ role: "dialog", ...inheritedAttributes, "aria-modal": "true", tabIndex: -1, class: "modal-wrapper ion-overlay-wrapper", part: "content", ref: (el) => (this.wrapperEl = el) }, showHandle && (hAsync("button", { key: '5efc0bb0a59adcc594ac48da9fd90e57908a7ffb', class: "modal-handle",
27980
28156
  // Prevents the handle from receiving keyboard focus when it does not cycle
27981
- tabIndex: !isHandleCycle ? -1 : 0, "aria-label": "Activate to adjust the size of the dialog overlaying the screen", onClick: isHandleCycle ? this.onHandleClick : undefined, part: "handle", ref: (el) => (this.dragHandleEl = el) })), hAsync("slot", { key: '072d3929ec6f25481946b184d8ac24219011e783', onSlotchange: this.onSlotChange }))));
28157
+ tabIndex: !isHandleCycle ? -1 : 0, "aria-label": "Activate to adjust the size of the dialog overlaying the screen", onClick: isHandleCycle ? this.onHandleClick : undefined, part: "handle", ref: (el) => (this.dragHandleEl = el) })), hAsync("slot", { key: '6175fcd0b39c086b4e9eb9e96c4d631c2a86774b', onSlotchange: this.onSlotChange }))));
27982
28158
  }
27983
28159
  get el() { return getElement(this); }
27984
28160
  static get watchers() { return {
@@ -43051,7 +43227,7 @@ exports.hydrateApp = hydrateApp;
43051
43227
 
43052
43228
 
43053
43229
  /*hydrateAppClosure end*/
43054
- hydrateApp(window, $stencilHydrateOpts, $stencilHydrateResults, $stencilAfterHydrate, $stencilHydrateResolve);
43230
+ hydrateApp(window, $stencilHydrateOpts, $stencilHydrateResults, $stencilAfterHydrate, $stencilHydrateResolve, $stencilAbortController);
43055
43231
  }
43056
43232
 
43057
43233
  hydrateAppClosure($stencilWindow);
@@ -43146,7 +43322,7 @@ var NAMESPACE = (
43146
43322
  );
43147
43323
 
43148
43324
  /*
43149
- Stencil Hydrate Runner v4.44.2 | MIT Licensed | https://stenciljs.com
43325
+ Stencil Hydrate Runner v4.45.0 | MIT Licensed | https://stenciljs.com
43150
43326
  */
43151
43327
  var __create = Object.create;
43152
43328
  var __defProp = Object.defineProperty;
@@ -57293,11 +57469,14 @@ function resetWindow(win2) {
57293
57469
  } catch (e) {
57294
57470
  }
57295
57471
  }
57296
- win2.fetch = null;
57297
- win2.Headers = null;
57298
- win2.Request = null;
57299
- win2.Response = null;
57300
- win2.FetchError = null;
57472
+ const windowDestroyed = () => {
57473
+ throw new Error("MockWindow was already destroyed");
57474
+ };
57475
+ win2.fetch = windowDestroyed;
57476
+ win2.Headers = windowDestroyed;
57477
+ win2.Request = windowDestroyed;
57478
+ win2.Response = windowDestroyed;
57479
+ win2.FetchError = windowDestroyed;
57301
57480
  }
57302
57481
  }
57303
57482
  function resetWindowDimensions(win2) {