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

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.js CHANGED
@@ -7,6 +7,10 @@ var stream = require('stream');
7
7
 
8
8
  const modeResolutionChain = [];
9
9
 
10
+ // captured here, at true module scope, before hydrateFactory shadows the
11
+ // AbortController identifier for component code below.
12
+ var $stencilNativeAbortController = AbortController;
13
+
10
14
  function hydrateFactory($stencilWindow, $stencilHydrateOpts, $stencilHydrateResults, $stencilAfterHydrate, $stencilHydrateResolve) {
11
15
  var globalThis = $stencilWindow;
12
16
  var self = $stencilWindow;
@@ -98,8 +102,46 @@ function hydrateFactory($stencilWindow, $stencilHydrateOpts, $stencilHydrateResu
98
102
 
99
103
  var fetch, FetchError, Headers, Request, Response;
100
104
 
105
+ // Aborted when the render times out or errors, so in-flight fetch() calls
106
+ // made by component code stop holding the render's window/results alive
107
+ // instead of running to completion against a torn-down window. See #6864.
108
+ var $stencilAbortController = new $stencilNativeAbortController();
109
+
110
+ // Any AbortController a component creates itself is transparently wired to
111
+ // cascade-abort when the render times out too, so component code using the
112
+ // standard AbortController convention for its own cancellable work (axios,
113
+ // aws-sdk v3, the mongodb driver, etc.) gets cancelled automatically.
114
+ var AbortController = function () {
115
+ var controller = new $stencilNativeAbortController();
116
+ $stencilAbortController.signal.addEventListener(
117
+ 'abort',
118
+ function () {
119
+ controller.abort();
120
+ },
121
+ { once: true },
122
+ );
123
+ return controller;
124
+ };
125
+
126
+ function $stencilFetchSignal(callerSignal) {
127
+ if (!callerSignal) {
128
+ return $stencilAbortController.signal;
129
+ }
130
+ if (callerSignal.aborted || $stencilAbortController.signal.aborted) {
131
+ return callerSignal.aborted ? callerSignal : $stencilAbortController.signal;
132
+ }
133
+ var merged = new $stencilNativeAbortController();
134
+ var onAbort = function () { merged.abort(); };
135
+ callerSignal.addEventListener('abort', onAbort, { once: true });
136
+ $stencilAbortController.signal.addEventListener('abort', onAbort, { once: true });
137
+ return merged.signal;
138
+ }
139
+
101
140
  if (typeof $stencilWindow.fetch === 'function') {
102
- fetch = $stencilWindow.fetch;
141
+ var $stencilRawFetch = $stencilWindow.fetch;
142
+ fetch = $stencilWindow.fetch = function(input, init) {
143
+ return $stencilRawFetch(input, Object.assign({}, init, { signal: $stencilFetchSignal(init && init.signal) }));
144
+ };
103
145
  } else {
104
146
  fetch = $stencilWindow.fetch = function() { throw new Error('fetch() is not implemented'); };
105
147
  }
@@ -422,7 +464,7 @@ const appGlobalScript = initialize || (() => {});
422
464
  const globalScripts = appGlobalScript;
423
465
 
424
466
  /*
425
- Stencil Hydrate Platform v4.44.2 | MIT Licensed | https://stenciljs.com
467
+ Stencil Hydrate Platform v4.45.0 | MIT Licensed | https://stenciljs.com
426
468
  */
427
469
  var __create = Object.create;
428
470
  var __defProp = Object.defineProperty;
@@ -1886,13 +1928,14 @@ var scopeSelector = (selector, scopeSelectorText, hostSelector, slotSelector) =>
1886
1928
  }
1887
1929
  }).join(", ");
1888
1930
  };
1931
+ var isScopableAtRule = (selector) => selector.startsWith("@media") || selector.startsWith("@supports") || selector.startsWith("@page") || selector.startsWith("@document") || selector.startsWith("@layer");
1889
1932
  var scopeSelectors = (cssText, scopeSelectorText, hostSelector, slotSelector, commentOriginalSelector) => {
1890
1933
  return processRules(cssText, (rule) => {
1891
1934
  let selector = rule.selector;
1892
1935
  let content = rule.content;
1893
1936
  if (rule.selector[0] !== "@") {
1894
1937
  selector = scopeSelector(rule.selector, scopeSelectorText, hostSelector, slotSelector);
1895
- } else if (rule.selector.startsWith("@media") || rule.selector.startsWith("@supports") || rule.selector.startsWith("@page") || rule.selector.startsWith("@document")) {
1938
+ } else if (isScopableAtRule(rule.selector)) {
1896
1939
  content = scopeSelectors(rule.content, scopeSelectorText, hostSelector, slotSelector);
1897
1940
  }
1898
1941
  const cssRule = {
@@ -1971,15 +2014,16 @@ var scopeCss = (cssText, scopeId2, commentOriginalSelector) => {
1971
2014
  rule.selector = placeholder + rule.selector;
1972
2015
  return rule;
1973
2016
  };
1974
- cssText = processRules(cssText, (rule) => {
2017
+ const commentSelectors = (input) => processRules(input, (rule) => {
1975
2018
  if (rule.selector[0] !== "@") {
1976
2019
  return processCommentedSelector(rule);
1977
- } else if (rule.selector.startsWith("@media") || rule.selector.startsWith("@supports") || rule.selector.startsWith("@page") || rule.selector.startsWith("@document")) {
1978
- rule.content = processRules(rule.content, processCommentedSelector);
1979
- return rule;
2020
+ }
2021
+ if (isScopableAtRule(rule.selector)) {
2022
+ rule.content = commentSelectors(rule.content);
1980
2023
  }
1981
2024
  return rule;
1982
2025
  });
2026
+ cssText = commentSelectors(cssText);
1983
2027
  }
1984
2028
  const scoped = scopeCssText(cssText, scopeId2, hostScopeId, slotScopeId);
1985
2029
  cssText = [scoped.cssText, ...commentsWithHash].join("\n");
@@ -2620,7 +2664,7 @@ var updateChildren = (parentElm, oldCh, newVNode2, newCh, isInitialRender = fals
2620
2664
  if (idxInOld >= 0) {
2621
2665
  elmToMove = oldCh[idxInOld];
2622
2666
  if (elmToMove.$tag$ !== newStartVnode.$tag$) {
2623
- node = createElm(oldCh && oldCh[newStartIdx], newVNode2, idxInOld);
2667
+ node = createElm(oldCh && oldCh[newStartIdx], newVNode2, newStartIdx);
2624
2668
  } else {
2625
2669
  patch(elmToMove, newStartVnode, isInitialRender);
2626
2670
  oldCh[idxInOld] = void 0;
@@ -5395,7 +5439,7 @@ function forceUpdate2() {
5395
5439
  }
5396
5440
 
5397
5441
  // src/hydrate/platform/hydrate-app.ts
5398
- function hydrateApp(win2, opts, results, afterHydrate, resolve) {
5442
+ function hydrateApp(win2, opts, results, afterHydrate, resolve, abortController) {
5399
5443
  const connectedElements = /* @__PURE__ */ new Set();
5400
5444
  const createdElements = /* @__PURE__ */ new Set();
5401
5445
  const waitingElements = /* @__PURE__ */ new Set();
@@ -5405,6 +5449,13 @@ function hydrateApp(win2, opts, results, afterHydrate, resolve) {
5405
5449
  setScopedSSR(opts);
5406
5450
  let tmrId;
5407
5451
  let ranCompleted = false;
5452
+ const abortedPromise = new Promise((res) => {
5453
+ if (abortController.signal.aborted) {
5454
+ res();
5455
+ } else {
5456
+ abortController.signal.addEventListener("abort", () => res(), { once: true });
5457
+ }
5458
+ });
5408
5459
  function hydratedComplete() {
5409
5460
  globalThis.clearTimeout(tmrId);
5410
5461
  createdElements.clear();
@@ -5426,6 +5477,7 @@ function hydrateApp(win2, opts, results, afterHydrate, resolve) {
5426
5477
  }
5427
5478
  function hydratedError(err2) {
5428
5479
  renderCatchError(opts, results, err2);
5480
+ abortController.abort();
5429
5481
  hydratedComplete();
5430
5482
  }
5431
5483
  function timeoutExceeded() {
@@ -5471,7 +5523,7 @@ function hydrateApp(win2, opts, results, afterHydrate, resolve) {
5471
5523
  if (isValidComponent(elm, opts) && results.hydratedCount < opts.maxHydrateCount) {
5472
5524
  if (!connectedElements.has(elm) && shouldHydrate(elm)) {
5473
5525
  connectedElements.add(elm);
5474
- return hydrateComponent.call(elm, win2, results, elm.nodeName, elm, waitingElements);
5526
+ return hydrateComponent.call(elm, win2, results, elm.nodeName, elm, waitingElements, abortedPromise);
5475
5527
  }
5476
5528
  }
5477
5529
  return resolved2;
@@ -5501,7 +5553,7 @@ function hydrateApp(win2, opts, results, afterHydrate, resolve) {
5501
5553
  hydratedError(e);
5502
5554
  }
5503
5555
  }
5504
- async function hydrateComponent(win2, results, tagName, elm, waitingElements) {
5556
+ async function hydrateComponent(win2, results, tagName, elm, waitingElements, aborted) {
5505
5557
  tagName = tagName.toLowerCase();
5506
5558
  const Cstr = loadModule(
5507
5559
  {
@@ -5517,17 +5569,19 @@ async function hydrateComponent(win2, results, tagName, elm, waitingElements) {
5517
5569
  addHostEventListeners(this, hostRef, cmpMeta.$listeners$);
5518
5570
  try {
5519
5571
  connectedCallback(elm);
5520
- await elm.componentOnReady();
5521
- results.hydratedCount++;
5522
- const ref = getHostRef(elm);
5523
- const modeName = !(ref == null ? void 0 : ref.$modeName$) ? "$" : ref == null ? void 0 : ref.$modeName$;
5524
- if (!results.components.some((c) => c.tag === tagName && c.mode === modeName)) {
5525
- results.components.push({
5526
- tag: tagName,
5527
- mode: modeName,
5528
- count: 0,
5529
- depth: -1
5530
- });
5572
+ const wasAborted = await Promise.race([elm.componentOnReady().then(() => false), aborted.then(() => true)]);
5573
+ if (!wasAborted) {
5574
+ results.hydratedCount++;
5575
+ const ref = getHostRef(elm);
5576
+ const modeName = !(ref == null ? void 0 : ref.$modeName$) ? "$" : ref == null ? void 0 : ref.$modeName$;
5577
+ if (!results.components.some((c) => c.tag === tagName && c.mode === modeName)) {
5578
+ results.components.push({
5579
+ tag: tagName,
5580
+ mode: modeName,
5581
+ count: 0,
5582
+ depth: -1
5583
+ });
5584
+ }
5531
5585
  }
5532
5586
  } catch (e) {
5533
5587
  win2.console.error(e);
@@ -5785,6 +5839,9 @@ var setScopedSSR = (opts) => {
5785
5839
  var needsScopedSSR = () => scopedSSR;
5786
5840
  var scopedSSR = false;
5787
5841
 
5842
+ const win$1 = typeof window !== 'undefined' ? window : undefined;
5843
+ const doc = typeof document !== 'undefined' ? document : undefined;
5844
+
5788
5845
  /**
5789
5846
  * Returns `true` if the direction resolves to `rtl` for the given element.
5790
5847
  *
@@ -5979,6 +6036,44 @@ const addEventListener$1 = (el, eventName, callback, opts) => {
5979
6036
  const removeEventListener = (el, eventName, callback, opts) => {
5980
6037
  return el.removeEventListener(eventName, callback, opts);
5981
6038
  };
6039
+ /**
6040
+ * Calls back when a CSS custom property that resolves to a length changes,
6041
+ * which no event covers. The probe inherits the property from `hostEl` and
6042
+ * uses it as its height, turning a property change into a size change that
6043
+ * `ResizeObserver` can detect.
6044
+ *
6045
+ * The callback receives the probe's height. For length values, this matches
6046
+ * the resolved property value. For other values, such as `fit-content`, the
6047
+ * probe remains at zero, so the value only signals that the property changed.
6048
+ * Percentages resolve against the probe's containing block, not the element
6049
+ * where the property is ultimately used.
6050
+ *
6051
+ * Pass `initialValue` when the caller has already read the property so that
6052
+ * changes occurring before the observer's first delivery are not missed.
6053
+ * Without it, the first delivery establishes the baseline.
6054
+ */
6055
+ const onCustomPropertyChange = (hostEl, property, callback, initialValue) => {
6056
+ const doc = win$1?.document;
6057
+ if (!doc || !hostEl || typeof ResizeObserver === 'undefined') {
6058
+ return () => undefined;
6059
+ }
6060
+ const probe = doc.createElement('div');
6061
+ probe.style.cssText = `position:fixed;visibility:hidden;pointer-events:none;top:0;left:0;width:0;height:var(${property},0px);`;
6062
+ hostEl.appendChild(probe);
6063
+ let lastHeight = initialValue;
6064
+ const observer = new ResizeObserver((entries) => {
6065
+ const { height } = entries[0].contentRect;
6066
+ if (lastHeight !== undefined && height !== lastHeight) {
6067
+ callback(height);
6068
+ }
6069
+ lastHeight = height;
6070
+ });
6071
+ observer.observe(probe);
6072
+ return () => {
6073
+ observer.disconnect();
6074
+ probe.remove();
6075
+ };
6076
+ };
5982
6077
  /**
5983
6078
  * Gets the root context of a shadow dom element
5984
6079
  * On newer browsers this will be the shadowRoot,
@@ -6859,9 +6954,6 @@ class AccordionGroup {
6859
6954
  }; }
6860
6955
  }
6861
6956
 
6862
- const win$1 = typeof window !== 'undefined' ? window : undefined;
6863
- const doc = typeof document !== 'undefined' ? document : undefined;
6864
-
6865
6957
  const getCapacitor = () => {
6866
6958
  if (win$1 !== undefined) {
6867
6959
  return win$1.Capacitor;
@@ -8721,6 +8813,40 @@ const safeCall = (handler, arg) => {
8721
8813
  }
8722
8814
  return undefined;
8723
8815
  };
8816
+ /**
8817
+ * `--width` and `--height` values that leave an overlay spanning the viewport
8818
+ * on that axis, so it reaches both edges. An empty value means the property
8819
+ * was never overridden.
8820
+ */
8821
+ const FULLSCREEN_SIZES = ['', '100%', '100vw', '100vh', '100dvw', '100dvh', '100svw', '100svh'];
8822
+ /**
8823
+ * `--width` and `--height` values that size an overlay to its content, leaving
8824
+ * the rendered size dependent on the content and on `--max-width` or
8825
+ * `--max-height`.
8826
+ */
8827
+ const CONTENT_SIZES = ['auto', 'fit-content', 'min-content', 'max-content'];
8828
+ /**
8829
+ * How an overlay's `--width` or `--height` determines its used size:
8830
+ *
8831
+ * `fullscreen` spans the viewport on that axis. `content` depends on the
8832
+ * overlay's content, so its used size is not known until layout. `definite`
8833
+ * resolves independently of the overlay's content size.
8834
+ *
8835
+ * Values are lowercased because CSS keywords are case-insensitive, while a
8836
+ * custom property preserves the case in which it was authored. Content values
8837
+ * are matched as a suffix so vendor-prefixed values such as `-moz-fit-content`
8838
+ * are recognized.
8839
+ */
8840
+ const getOverlaySizeType = (size) => {
8841
+ const value = size.trim().toLowerCase();
8842
+ if (FULLSCREEN_SIZES.includes(value)) {
8843
+ return 'fullscreen';
8844
+ }
8845
+ if (CONTENT_SIZES.some((keyword) => value.endsWith(keyword))) {
8846
+ return 'content';
8847
+ }
8848
+ return 'definite';
8849
+ };
8724
8850
  const BACKDROP = 'backdrop';
8725
8851
  const GESTURE = 'gesture';
8726
8852
  const OVERLAY_GESTURE_PRIORITY = 39;
@@ -13600,6 +13726,10 @@ class Content {
13600
13726
  data: undefined,
13601
13727
  isScrolling: true,
13602
13728
  };
13729
+ /**
13730
+ * Whether the host is sized to its content.
13731
+ */
13732
+ this.sizeToContent = false;
13603
13733
  /**
13604
13734
  * If `true`, the content will scroll behind the headers
13605
13735
  * and footers. This effect can easily be seen by setting the toolbar
@@ -13633,6 +13763,7 @@ class Content {
13633
13763
  }
13634
13764
  componentWillLoad() {
13635
13765
  this.inheritedAttributes = inheritAriaAttributes(this.el);
13766
+ this.sizeToContent = this.readSizeToContent();
13636
13767
  }
13637
13768
  connectedCallback() {
13638
13769
  this.isMainContent = this.el.closest('ion-menu, ion-popover, ion-modal') === null;
@@ -13672,6 +13803,7 @@ class Content {
13672
13803
  }
13673
13804
  // Re-observe on reattach, since componentDidLoad only fires once.
13674
13805
  this.setupFullscreenResizeObserver();
13806
+ this.updateSizeToContent();
13675
13807
  }
13676
13808
  componentDidLoad() {
13677
13809
  // The custom elements build assigns fullscreen after connectedCallback.
@@ -13711,6 +13843,16 @@ class Content {
13711
13843
  return;
13712
13844
  }
13713
13845
  }
13846
+ /**
13847
+ * Picks up an overlay that is no longer sized the way the last render
13848
+ * assumed, re-rendering only when the answer changes. Read in a `readTask`
13849
+ * because resolving the custom property forces a style recalculation.
13850
+ */
13851
+ updateSizeToContent() {
13852
+ readTask(() => {
13853
+ this.sizeToContent = this.readSizeToContent();
13854
+ });
13855
+ }
13714
13856
  destroyFullscreenResizeObserver() {
13715
13857
  if (this.fullscreenResizeObserver !== undefined) {
13716
13858
  this.fullscreenResizeObserver.disconnect();
@@ -13757,16 +13899,42 @@ class Content {
13757
13899
  const mode = getIonMode$1(this);
13758
13900
  return forceOverscroll === undefined ? mode === 'ios' && isPlatform('ios') : forceOverscroll;
13759
13901
  }
13902
+ /**
13903
+ * Reads whether to size the component to its content height. Forces a style
13904
+ * recalculation, so it belongs in a read task or before the first render.
13905
+ *
13906
+ * This applies inside popovers and modals with a content-based `--height`,
13907
+ * where the overlay does not provide the content with a definite height
13908
+ * to fill.
13909
+ *
13910
+ * Only `--height` is consulted. Styling the wrapper directly, such as
13911
+ * `ion-modal::part(content) { height: fit-content; }`, does not change
13912
+ * `--height` and therefore cannot be observed. `--height` is the only
13913
+ * supported way to opt into content-based sizing.
13914
+ */
13915
+ readSizeToContent() {
13916
+ if (hostContext('ion-popover', this.el)) {
13917
+ return true;
13918
+ }
13919
+ const modal = this.el.closest('ion-modal');
13920
+ if (modal === null) {
13921
+ return false;
13922
+ }
13923
+ const height = getComputedStyle(modal).getPropertyValue('--height');
13924
+ return getOverlaySizeType(height) === 'content';
13925
+ }
13760
13926
  resize() {
13761
13927
  }
13762
13928
  /**
13763
- * Recalculate content dimensions. Called by overlays (e.g., popover) when
13764
- * sibling elements like headers or footers have finished rendering and their
13765
- * heights are available, ensuring accurate offset-top calculations.
13929
+ * Recalculates the content dimensions and whether it should size itself to
13930
+ * its content. Called by overlays when something they own changes, such as
13931
+ * a header finishing its render or `--height` being updated.
13932
+ *
13766
13933
  * @internal
13767
13934
  */
13768
13935
  async recalculateDimensions() {
13769
13936
  readTask(() => this.readDimensions());
13937
+ this.updateSizeToContent();
13770
13938
  }
13771
13939
  readDimensions() {
13772
13940
  const page = getPageElement(this.el);
@@ -13936,21 +14104,21 @@ class Content {
13936
14104
  const forceOverscroll = this.shouldForceOverscroll();
13937
14105
  const transitionShadow = mode === 'ios';
13938
14106
  this.resize();
13939
- return (hAsync(Host, { key: '9551c759df407b10d809171641fc6e8f14d92219', role: isMainContent ? 'main' : undefined, class: createColorClasses$1(this.color, {
14107
+ return (hAsync(Host, { key: 'e1013621096729354ef92915af52dd823e69fdff', role: isMainContent ? 'main' : undefined, class: createColorClasses$1(this.color, {
13940
14108
  [mode]: true,
13941
14109
  'content-fullscreen': this.fullscreen,
13942
- 'content-sizing': hostContext('ion-popover', this.el),
14110
+ 'content-sizing': this.sizeToContent,
13943
14111
  overscroll: forceOverscroll,
13944
14112
  [`content-${rtl}`]: true,
13945
14113
  }), style: {
13946
14114
  '--offset-top': `${this.cTop}px`,
13947
14115
  '--offset-bottom': `${this.cBottom}px`,
13948
- }, ...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: {
14116
+ }, ...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: {
13949
14117
  'inner-scroll': true,
13950
14118
  'scroll-x': scrollX,
13951
14119
  'scroll-y': scrollY,
13952
14120
  overscroll: (scrollX || scrollY) && forceOverscroll,
13953
- }, 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));
14121
+ }, 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));
13954
14122
  }
13955
14123
  get el() { return getElement(this); }
13956
14124
  static get watchers() { return {
@@ -13970,6 +14138,7 @@ class Content {
13970
14138
  "scrollX": [4, "scroll-x"],
13971
14139
  "scrollY": [4, "scroll-y"],
13972
14140
  "scrollEvents": [4, "scroll-events"],
14141
+ "sizeToContent": [32],
13973
14142
  "recalculateDimensions": [64],
13974
14143
  "getScrollElement": [64],
13975
14144
  "getBackgroundElement": [64],
@@ -24978,6 +25147,12 @@ const setCardStatusBarDefault = (defaultStyle = Style.Default) => {
24978
25147
  }
24979
25148
  StatusBar.setStyle({ style: defaultStyle });
24980
25149
  };
25150
+ /**
25151
+ * Calls back when the modal's resolved `--height` changes.
25152
+ */
25153
+ const onModalHeightChange = (hostEl, callback) => {
25154
+ return onCustomPropertyChange(hostEl, '--height', () => callback());
25155
+ };
24981
25156
 
24982
25157
  /**
24983
25158
  * Swiping is only possible when the content is scrolled to the top, so that we
@@ -26505,40 +26680,12 @@ const createSheetGesture = (baseEl, backdropEl, wrapperEl, initialBreakpoint, ba
26505
26680
  };
26506
26681
  };
26507
26682
 
26508
- /**
26509
- * These thresholds match the SCSS media query breakpoints in modal.vars.scss
26510
- * that trigger the centered dialog layout (non-fullscreen modal).
26511
- *
26512
- * SCSS defines two height breakpoints: $modal-inset-min-height-small (600px)
26513
- * and $modal-inset-min-height-large (768px). We use the smaller one because
26514
- * that's the threshold where the modal transitions from fullscreen to centered
26515
- * dialog — the larger breakpoint only increases the dialog's height.
26516
- */
26517
- const MODAL_INSET_MIN_WIDTH = 768;
26518
- const MODAL_INSET_MIN_HEIGHT = 600;
26519
26683
  const EDGE_THRESHOLD = 5;
26520
- /**
26521
- * CSS values for `--width` / `--height` that are treated as fullscreen
26522
- * (modal touches the corresponding screen edges). Empty string means the
26523
- * property was not overridden. See `hasCustomModalDimensions()`.
26524
- */
26525
- const FULLSCREEN_SIZE_VALUES = new Set(['', '100%', '100vw', '100vh', '100dvw', '100dvh', '100svw', '100svh']);
26526
26684
  /**
26527
26685
  * Cache for resolved root safe-area-top value, invalidated once per frame.
26528
26686
  */
26529
26687
  let cachedRootSafeAreaTop = null;
26530
26688
  let cacheInvalidationScheduled$1 = false;
26531
- /**
26532
- * Determines if the current viewport meets the CSS media query conditions
26533
- * that cause regular modals to render as centered dialogs instead of fullscreen.
26534
- * Matches: @media (min-width: 768px) and (min-height: 600px)
26535
- */
26536
- const isCenteredDialogViewport = () => {
26537
- if (!win$1)
26538
- return false;
26539
- return win$1.matchMedia(`(min-width: ${MODAL_INSET_MIN_WIDTH}px) and (min-height: ${MODAL_INSET_MIN_HEIGHT}px)`)
26540
- .matches;
26541
- };
26542
26689
  /**
26543
26690
  * Resolves the current root --ion-safe-area-top value to pixels.
26544
26691
  * Uses a temporary element because getComputedStyle on :root returns
@@ -26572,55 +26719,64 @@ const getRootSafeAreaTop = () => {
26572
26719
  return value;
26573
26720
  };
26574
26721
  /**
26575
- * Calls back when the resolved root `--ion-safe-area-top` changes, which no
26576
- * event and no window resize covers. The probe's height tracks the variable, so
26577
- * a change to it becomes a size change the observer can see.
26722
+ * Calls back when the resolved root `--ion-safe-area-top` changes. The value
26723
+ * the caller already applied is passed as the baseline, so a change between
26724
+ * that read and the observer starting is still reported.
26578
26725
  */
26579
26726
  const onRootSafeAreaTopChange = (callback) => {
26580
- const doc = win$1?.document;
26581
- if (!doc?.body || typeof ResizeObserver === 'undefined') {
26582
- return () => undefined;
26583
- }
26584
- const probe = doc.createElement('div');
26585
- probe.style.cssText =
26586
- 'position:fixed;visibility:hidden;pointer-events:none;top:0;left:0;width:0;' +
26587
- 'height:var(--ion-safe-area-top,0px);';
26588
- doc.body.appendChild(probe);
26589
- /**
26590
- * Seeded with the value the caller has already applied, so a change that
26591
- * lands before the observer's first delivery still gets reported. Comparing
26592
- * against an unset value instead would consume that first delivery and treat
26593
- * the new inset as the baseline.
26594
- */
26595
- let lastHeight = getRootSafeAreaTop();
26596
- const observer = new ResizeObserver((entries) => {
26597
- const { height } = entries[0].contentRect;
26598
- if (height !== lastHeight) {
26599
- lastHeight = height;
26600
- callback(height);
26601
- }
26602
- });
26603
- observer.observe(probe);
26604
- return () => {
26605
- observer.disconnect();
26606
- probe.remove();
26607
- };
26727
+ return onCustomPropertyChange(win$1?.document?.body, '--ion-safe-area-top', callback, getRootSafeAreaTop());
26608
26728
  };
26609
26729
  /**
26610
- * True when the modal host declares BOTH a non-fullscreen `--width` AND a
26611
- * non-fullscreen `--height` (i.e. a centered-dialog-like modal that doesn't
26612
- * touch any screen edge).
26730
+ * Determines which viewport axes the modal spans so safe-area requirements
26731
+ * can be predicted independently for each axis.
26732
+ *
26733
+ * A modal that spans an axis reaches both edges on that axis and needs the
26734
+ * corresponding safe-area insets. A modal that does not span an axis reaches
26735
+ * neither edge on that axis.
26613
26736
  *
26614
- * The conservative "both axes" check avoids mis-zeroing safe-area for
26615
- * partial-custom modals where the modal still touches top/bottom edges
26616
- * (e.g. only `--width` overridden). Partial cases fall through to the
26617
- * existing position-based post-animation correction.
26737
+ * When both `--width` and `--height` are `fullscreen`, coverage can be
26738
+ * determined directly. Otherwise, coverage is based on the rendered wrapper,
26739
+ * including cases where content sizing or `--max-height` causes the modal
26740
+ * to reach the viewport.
26618
26741
  */
26619
- const hasCustomModalDimensions = (hostEl) => {
26742
+ const getModalCoveredAxes = (hostEl) => {
26620
26743
  const styles = getComputedStyle(hostEl);
26621
- const width = styles.getPropertyValue('--width').trim();
26622
- const height = styles.getPropertyValue('--height').trim();
26623
- return !FULLSCREEN_SIZE_VALUES.has(width) && !FULLSCREEN_SIZE_VALUES.has(height);
26744
+ const width = getOverlaySizeType(styles.getPropertyValue('--width'));
26745
+ const height = getOverlaySizeType(styles.getPropertyValue('--height'));
26746
+ if (width === 'fullscreen' && height === 'fullscreen') {
26747
+ return { vertical: true, horizontal: true };
26748
+ }
26749
+ return measureCoveredAxes(hostEl);
26750
+ };
26751
+ /**
26752
+ * Measures the modal wrapper to determine whether it spans the viewport
26753
+ * on each axis.
26754
+ *
26755
+ * The wrapper has no box while the modal is hidden, so `overlay-hidden`
26756
+ * is temporarily removed to allow the wrapper to be measured. The class
26757
+ * is restored in the same task before the browser can paint.
26758
+ *
26759
+ * Only the wrapper's size is measured. Its position is affected by the
26760
+ * enter animation, which initially translates it by its own height, while
26761
+ * the translation does not affect its measured size.
26762
+ */
26763
+ const measureCoveredAxes = (hostEl) => {
26764
+ const wrapperEl = hostEl.shadowRoot?.querySelector('.modal-wrapper');
26765
+ if (wrapperEl == null || win$1 === undefined) {
26766
+ return { vertical: false, horizontal: false };
26767
+ }
26768
+ const wasHidden = hostEl.classList.contains('overlay-hidden');
26769
+ if (wasHidden) {
26770
+ hostEl.classList.remove('overlay-hidden');
26771
+ }
26772
+ const { width, height } = wrapperEl.getBoundingClientRect();
26773
+ if (wasHidden) {
26774
+ hostEl.classList.add('overlay-hidden');
26775
+ }
26776
+ return {
26777
+ vertical: height >= win$1.innerHeight - EDGE_THRESHOLD,
26778
+ horizontal: width >= win$1.innerWidth - EDGE_THRESHOLD,
26779
+ };
26624
26780
  };
26625
26781
  /**
26626
26782
  * Returns the initial safe-area configuration based on modal type.
@@ -26654,26 +26810,23 @@ const getInitialSafeAreaConfig = (context) => {
26654
26810
  right: '0px',
26655
26811
  };
26656
26812
  }
26657
- // On viewports that meet the centered dialog media query breakpoints,
26658
- // regular modals render as centered dialogs (not fullscreen), so they
26659
- // don't touch any screen edges and don't need safe-area insets. Also
26660
- // applies to phone viewports when the modal declares custom --width and
26661
- // --height; these don't touch screen edges either, so the initial
26662
- // prediction must be zero to avoid a post-animation correction flash.
26663
- if (isCenteredDialogViewport() || context.hasCustomDimensions) {
26664
- return {
26665
- top: '0px',
26666
- bottom: '0px',
26667
- left: '0px',
26668
- right: '0px',
26669
- };
26670
- }
26671
- // Fullscreen modals on phone - inherit all safe areas
26813
+ /**
26814
+ * Each axis is evaluated independently because a modal can span one axis
26815
+ * without spanning the other. This allows the initial safe-area configuration
26816
+ * to match the modal's expected dimensions and avoids correcting an incorrect
26817
+ * pair of insets after presentation.
26818
+ *
26819
+ * A modal can span the horizontal axis while remaining inset vertically, or
26820
+ * span the vertical axis while remaining inset horizontally. Wide viewports
26821
+ * can also render regular modals as centered dialogs, while content-sized
26822
+ * modals may still be clamped to the viewport.
26823
+ */
26824
+ const { vertical, horizontal } = context.coveredAxes ?? { vertical: true, horizontal: true };
26672
26825
  return {
26673
- top: 'inherit',
26674
- bottom: 'inherit',
26675
- left: 'inherit',
26676
- right: 'inherit',
26826
+ top: vertical ? 'inherit' : '0px',
26827
+ bottom: vertical ? 'inherit' : '0px',
26828
+ left: horizontal ? 'inherit' : '0px',
26829
+ right: horizontal ? 'inherit' : '0px',
26677
26830
  };
26678
26831
  };
26679
26832
  /**
@@ -26725,9 +26878,9 @@ const clearSafeAreaOverrides = (hostEl) => {
26725
26878
  hostEl.style.removeProperty('--ion-safe-area-right');
26726
26879
  };
26727
26880
 
26728
- 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}`;
26881
+ 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}`;
26729
26882
 
26730
- 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}`;
26883
+ 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}`;
26731
26884
 
26732
26885
  // TODO(FW-2832): types
26733
26886
  /**
@@ -27765,7 +27918,7 @@ class Modal {
27765
27918
  /**
27766
27919
  * Creates the context object for safe-area utilities.
27767
27920
  *
27768
- * `hasCustomDimensions` is only set by `setInitialSafeAreaOverrides()`
27921
+ * `coveredAxes` is only set by `setInitialSafeAreaOverrides()`
27769
27922
  * because it is only read by `getInitialSafeAreaConfig()`. Other callers
27770
27923
  * (resize handler, post-animation update, fullscreen-padding apply) would
27771
27924
  * pay a `getComputedStyle()` cost for a value they never consult.
@@ -27779,6 +27932,26 @@ class Modal {
27779
27932
  currentBreakpoint: this.currentBreakpoint,
27780
27933
  };
27781
27934
  }
27935
+ /**
27936
+ * Keeps the content's sizing in sync with `--height`. The content reads the
27937
+ * property to determine whether it should size itself to its content, and
27938
+ * changes to `--height` on an ancestor or the root can change that behavior
27939
+ * without changing the modal itself.
27940
+ */
27941
+ watchHeightForContent() {
27942
+ /**
27943
+ * A sheet's height comes from its breakpoints, so its content never sizes
27944
+ * itself to `--height`. Watching it would cause the drag to recalculate on
27945
+ * every frame.
27946
+ */
27947
+ if (this.isSheetModal) {
27948
+ return;
27949
+ }
27950
+ this.unsubscribeHeightChange?.();
27951
+ this.unsubscribeHeightChange = onModalHeightChange(this.el, () => {
27952
+ this.el.querySelectorAll('ion-content').forEach((contentEl) => contentEl.recalculateDimensions());
27953
+ });
27954
+ }
27782
27955
  /**
27783
27956
  * Sets initial safe-area overrides before modal animation.
27784
27957
  * Called in present() before animation starts.
@@ -27792,10 +27965,11 @@ class Modal {
27792
27965
  setInitialSafeAreaOverrides() {
27793
27966
  const context = {
27794
27967
  ...this.getSafeAreaContext(),
27795
- hasCustomDimensions: hasCustomModalDimensions(this.el),
27968
+ coveredAxes: getModalCoveredAxes(this.el),
27796
27969
  };
27797
27970
  const safeAreaConfig = getInitialSafeAreaConfig(context);
27798
27971
  applySafeAreaOverrides(this.el, safeAreaConfig);
27972
+ this.watchHeightForContent();
27799
27973
  // Set the internal offset property with the resolved root safe-area-top value
27800
27974
  if (context.isSheetModal) {
27801
27975
  this.updateSheetOffsetTop();
@@ -27915,6 +28089,8 @@ class Modal {
27915
28089
  clearSafeAreaOverrides(this.el);
27916
28090
  this.unsubscribeRootSafeAreaTop?.();
27917
28091
  this.unsubscribeRootSafeAreaTop = undefined;
28092
+ this.unsubscribeHeightChange?.();
28093
+ this.unsubscribeHeightChange = undefined;
27918
28094
  // Remove internal sheet offset property
27919
28095
  this.el.style.removeProperty('--ion-modal-offset-top');
27920
28096
  const { contentEl } = this.findContentAndFooter();
@@ -27952,7 +28128,7 @@ class Modal {
27952
28128
  const isCardModal = presentingElement !== undefined && mode === 'ios';
27953
28129
  const isHandleCycle = handleBehavior === 'cycle';
27954
28130
  const isSheetModalWithHandle = isSheetModal && showHandle;
27955
- return (hAsync(Host, { key: '7c9c736052c5a788cf31040b6b2386dd9ea7454b', "no-router": true,
28131
+ return (hAsync(Host, { key: '17a95bd7722bac2344bea041aff97db17f55c0cf', "no-router": true,
27956
28132
  // Allow the modal to be navigable when the handle is focusable
27957
28133
  tabIndex: isHandleCycle && isSheetModalWithHandle ? 0 : -1, ...htmlAttributes, style: {
27958
28134
  zIndex: `${20000 + this.overlayIndex}`,
@@ -27965,7 +28141,7 @@ class Modal {
27965
28141
  'overlay-hidden': true,
27966
28142
  [FOCUS_TRAP_DISABLE_CLASS]: focusTrap === false,
27967
28143
  ...getClassMap(this.cssClass),
27968
- }, 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',
28144
+ }, 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',
27969
28145
  /*
27970
28146
  role and aria-modal must be used on the
27971
28147
  same element. They must also be set inside the
@@ -27978,9 +28154,9 @@ class Modal {
27978
28154
  without the tabindex focus() would be a no-op and screen readers
27979
28155
  may not properly announce the dialog and its content when it opens.
27980
28156
  */
27981
- 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",
28157
+ 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",
27982
28158
  // Prevents the handle from receiving keyboard focus when it does not cycle
27983
- 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 }))));
28159
+ 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 }))));
27984
28160
  }
27985
28161
  get el() { return getElement(this); }
27986
28162
  static get watchers() { return {
@@ -43053,7 +43229,7 @@ exports.hydrateApp = hydrateApp;
43053
43229
 
43054
43230
 
43055
43231
  /*hydrateAppClosure end*/
43056
- hydrateApp(window, $stencilHydrateOpts, $stencilHydrateResults, $stencilAfterHydrate, $stencilHydrateResolve);
43232
+ hydrateApp(window, $stencilHydrateOpts, $stencilHydrateResults, $stencilAfterHydrate, $stencilHydrateResolve, $stencilAbortController);
43057
43233
  }
43058
43234
 
43059
43235
  hydrateAppClosure($stencilWindow);
@@ -43148,7 +43324,7 @@ var NAMESPACE = (
43148
43324
  );
43149
43325
 
43150
43326
  /*
43151
- Stencil Hydrate Runner v4.44.2 | MIT Licensed | https://stenciljs.com
43327
+ Stencil Hydrate Runner v4.45.0 | MIT Licensed | https://stenciljs.com
43152
43328
  */
43153
43329
  var __create = Object.create;
43154
43330
  var __defProp = Object.defineProperty;
@@ -57295,11 +57471,14 @@ function resetWindow(win2) {
57295
57471
  } catch (e) {
57296
57472
  }
57297
57473
  }
57298
- win2.fetch = null;
57299
- win2.Headers = null;
57300
- win2.Request = null;
57301
- win2.Response = null;
57302
- win2.FetchError = null;
57474
+ const windowDestroyed = () => {
57475
+ throw new Error("MockWindow was already destroyed");
57476
+ };
57477
+ win2.fetch = windowDestroyed;
57478
+ win2.Headers = windowDestroyed;
57479
+ win2.Request = windowDestroyed;
57480
+ win2.Response = windowDestroyed;
57481
+ win2.FetchError = windowDestroyed;
57303
57482
  }
57304
57483
  }
57305
57484
  function resetWindowDimensions(win2) {