@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
@@ -3,25 +3,23 @@
3
3
  */
4
4
  'use strict';
5
5
 
6
- var index$3 = require('./index-DXoo08JC.js');
7
- var index$1 = require('./index-DtvKGwdh.js');
8
- var frameworkDelegate = require('./framework-delegate-d-fWfeI6.js');
9
- var helpers = require('./helpers-7wzdhdeg.js');
6
+ var index$2 = require('./index-T36W_eKv.js');
7
+ var index = require('./index-BLq7TkUV.js');
8
+ var frameworkDelegate = require('./framework-delegate-DYIuFqQx.js');
9
+ var helpers = require('./helpers-DHjAEaU9.js');
10
10
  var lockController = require('./lock-controller-aDB9wrEf.js');
11
- var capacitor = require('./capacitor-DmA66EwP.js');
12
- var overlays = require('./overlays-BR21NUIG.js');
11
+ var capacitor = require('./capacitor-cADDPMtd.js');
12
+ var hardwareBackButton = require('./overlays-DwMDYc_O.js');
13
13
  var theme = require('./theme-Bw0rpaNN.js');
14
- var index$4 = require('./index-CQfEIyLK.js');
15
- var ionicGlobal = require('./ionic-global-CYJNT-2P.js');
16
- var keyboard = require('./keyboard-Cix5TVkD.js');
17
- var animation = require('./animation-Kd1N7WTN.js');
14
+ var index$3 = require('./index-D_D542p0.js');
15
+ var ionicGlobal = require('./ionic-global-BWd7usAF.js');
16
+ var keyboard = require('./keyboard-BJEm-3HF.js');
17
+ var animation = require('./animation-2DHlng-f.js');
18
18
  var cubicBezier = require('./cubic-bezier-DAjy1V-e.js');
19
- var index$2 = require('./index-DRPqwSvU.js');
20
- var index = require('./index-DkNv4J_i.js');
19
+ var index$1 = require('./index-DRPqwSvU.js');
21
20
  require('./dir-zwDPRE5K.js');
22
- require('./hardware-back-button-Bu4Dzw8l.js');
23
21
  require('./gesture-controller-CeJslptU.js');
24
- require('./keyboard-cHxZlTyz.js');
22
+ require('./keyboard-DstMw6u1.js');
25
23
 
26
24
  var Style;
27
25
  (function (Style) {
@@ -118,17 +116,23 @@ const getBackdropValueForSheet = (x, backdropBreakpoint) => {
118
116
  *
119
117
  */
120
118
  const setCardStatusBarDark = () => {
121
- if (!index.win || index.win.innerWidth >= 768) {
119
+ if (!helpers.win || helpers.win.innerWidth >= 768) {
122
120
  return;
123
121
  }
124
122
  StatusBar.setStyle({ style: Style.Dark });
125
123
  };
126
124
  const setCardStatusBarDefault = (defaultStyle = Style.Default) => {
127
- if (!index.win || index.win.innerWidth >= 768) {
125
+ if (!helpers.win || helpers.win.innerWidth >= 768) {
128
126
  return;
129
127
  }
130
128
  StatusBar.setStyle({ style: defaultStyle });
131
129
  };
130
+ /**
131
+ * Calls back when the modal's resolved `--height` changes.
132
+ */
133
+ const onModalHeightChange = (hostEl, callback) => {
134
+ return helpers.onCustomPropertyChange(hostEl, '--height', () => callback());
135
+ };
132
136
 
133
137
  /**
134
138
  * Swiping is only possible when the content is scrolled to the top, so that we
@@ -141,8 +145,8 @@ const setCardStatusBarDefault = (defaultStyle = Style.Default) => {
141
145
  * synchronous operation, and `getScrollElement` is asynchronous.
142
146
  */
143
147
  const canSwipeOnContent = (contentEl) => {
144
- const scrollEl = index$1.isIonContent(contentEl) ? helpers.getElementRoot(contentEl).querySelector('.inner-scroll') : contentEl;
145
- const hasRefresherInContent = !!index$1.findRefresherInContent(contentEl);
148
+ const scrollEl = index.isIonContent(contentEl) ? helpers.getElementRoot(contentEl).querySelector('.inner-scroll') : contentEl;
149
+ const hasRefresherInContent = !!index.findRefresherInContent(contentEl);
146
150
  return !hasRefresherInContent && scrollEl.scrollTop === 0;
147
151
  };
148
152
  const handleCanDismiss = async (el, animation) => {
@@ -162,7 +166,7 @@ const handleCanDismiss = async (el, animation) => {
162
166
  * If the function returns `true`,
163
167
  * then we can proceed with dismiss.
164
168
  */
165
- const shouldDismiss = await el.canDismiss(undefined, overlays.GESTURE);
169
+ const shouldDismiss = await el.canDismiss(undefined, hardwareBackButton.GESTURE);
166
170
  if (!shouldDismiss) {
167
171
  return;
168
172
  }
@@ -279,7 +283,7 @@ const createSwipeToCloseGesture = (el, animation, statusBarStyle, onDismiss, onD
279
283
  let initialScrollY = true;
280
284
  let lastStep = 0;
281
285
  const getScrollY = () => {
282
- if (contentEl && index$1.isIonContent(contentEl)) {
286
+ if (contentEl && index.isIonContent(contentEl)) {
283
287
  return contentEl.scrollY;
284
288
  /**
285
289
  * Custom scroll containers are intended to be
@@ -305,7 +309,7 @@ const createSwipeToCloseGesture = (el, animation, statusBarStyle, onDismiss, onD
305
309
  * swipe again. The target content will not
306
310
  * be the same between swipes.
307
311
  */
308
- contentEl = index$1.findClosestIonContent(target);
312
+ contentEl = index.findClosestIonContent(target);
309
313
  if (contentEl) {
310
314
  return canSwipeOnContent(contentEl);
311
315
  }
@@ -349,7 +353,7 @@ const createSwipeToCloseGesture = (el, animation, statusBarStyle, onDismiss, onD
349
353
  * happen at the same time as the gesture.
350
354
  */
351
355
  if (deltaY > 0 && contentEl) {
352
- index$1.disableContentScrollY(contentEl);
356
+ index.disableContentScrollY(contentEl);
353
357
  }
354
358
  animation.progressStart(true, isOpen ? 1 : 0);
355
359
  onDragStart();
@@ -363,7 +367,7 @@ const createSwipeToCloseGesture = (el, animation, statusBarStyle, onDismiss, onD
363
367
  * happen at the same time as the gesture.
364
368
  */
365
369
  if (deltaY > 0 && contentEl) {
366
- index$1.disableContentScrollY(contentEl);
370
+ index.disableContentScrollY(contentEl);
367
371
  }
368
372
  /**
369
373
  * If we are swiping on the content
@@ -458,7 +462,7 @@ const createSwipeToCloseGesture = (el, animation, statusBarStyle, onDismiss, onD
458
462
  isOpen = shouldComplete;
459
463
  gesture.enable(false);
460
464
  if (contentEl) {
461
- index$1.resetContentScrollY(contentEl, initialScrollY);
465
+ index.resetContentScrollY(contentEl, initialScrollY);
462
466
  }
463
467
  animation
464
468
  .onFinish(() => {
@@ -506,10 +510,10 @@ const createSwipeToCloseGesture = (el, animation, statusBarStyle, onDismiss, onD
506
510
  };
507
511
  onDragEnd(eventDetail);
508
512
  };
509
- const gesture = index$2.createGesture({
513
+ const gesture = index$1.createGesture({
510
514
  el,
511
515
  gestureName: 'modalSwipeToClose',
512
- gesturePriority: overlays.OVERLAY_GESTURE_PRIORITY,
516
+ gesturePriority: hardwareBackButton.OVERLAY_GESTURE_PRIORITY,
513
517
  direction: 'y',
514
518
  threshold: 10,
515
519
  canStart,
@@ -1061,7 +1065,7 @@ const createSheetGesture = (baseEl, backdropEl, wrapperEl, initialBreakpoint, ba
1061
1065
  * as inputs should not be focusable outside
1062
1066
  * the sheet.
1063
1067
  */
1064
- baseEl.classList.remove(overlays.FOCUS_TRAP_DISABLE_CLASS);
1068
+ baseEl.classList.remove(hardwareBackButton.FOCUS_TRAP_DISABLE_CLASS);
1065
1069
  };
1066
1070
  const disableBackdrop = () => {
1067
1071
  baseEl.style.setProperty('pointer-events', 'none');
@@ -1073,7 +1077,7 @@ const createSheetGesture = (baseEl, backdropEl, wrapperEl, initialBreakpoint, ba
1073
1077
  * Adding this class disables focus trapping
1074
1078
  * for the sheet temporarily.
1075
1079
  */
1076
- baseEl.classList.add(overlays.FOCUS_TRAP_DISABLE_CLASS);
1080
+ baseEl.classList.add(hardwareBackButton.FOCUS_TRAP_DISABLE_CLASS);
1077
1081
  };
1078
1082
  /**
1079
1083
  * Toggles the footer to an absolute position while moving to prevent
@@ -1197,7 +1201,7 @@ const createSheetGesture = (baseEl, backdropEl, wrapperEl, initialBreakpoint, ba
1197
1201
  * For example, when using ion-nav within a modal it is possible to swipe, push a view,
1198
1202
  * and then swipe again. The target content will not be the same between swipes.
1199
1203
  */
1200
- const contentEl = index$1.findClosestIonContent(detail.event.target);
1204
+ const contentEl = index.findClosestIonContent(detail.event.target);
1201
1205
  currentBreakpoint = getCurrentBreakpoint();
1202
1206
  /**
1203
1207
  * Upwards swipes on the content cannot move the sheet anyway, so this only
@@ -1234,9 +1238,9 @@ const createSheetGesture = (baseEl, backdropEl, wrapperEl, initialBreakpoint, ba
1234
1238
  * which would impact performance significantly.
1235
1239
  */
1236
1240
  if (!expandToScroll) {
1237
- const targetEl = index$1.findClosestIonContent(detail.event.target);
1241
+ const targetEl = index.findClosestIonContent(detail.event.target);
1238
1242
  cachedScrollEl =
1239
- targetEl && index$1.isIonContent(targetEl) ? helpers.getElementRoot(targetEl).querySelector('.inner-scroll') : targetEl;
1243
+ targetEl && index.isIonContent(targetEl) ? helpers.getElementRoot(targetEl).querySelector('.inner-scroll') : targetEl;
1240
1244
  }
1241
1245
  /**
1242
1246
  * If expandToScroll is disabled, we need to swap
@@ -1628,7 +1632,7 @@ const createSheetGesture = (baseEl, backdropEl, wrapperEl, initialBreakpoint, ba
1628
1632
  */
1629
1633
  return viewportBottom - activeHeight;
1630
1634
  };
1631
- const gesture = index$2.createGesture({
1635
+ const gesture = index$1.createGesture({
1632
1636
  el: wrapperEl,
1633
1637
  gestureName: 'modalSheet',
1634
1638
  gesturePriority: 40,
@@ -1656,40 +1660,12 @@ const createSheetGesture = (baseEl, backdropEl, wrapperEl, initialBreakpoint, ba
1656
1660
  };
1657
1661
  };
1658
1662
 
1659
- /**
1660
- * These thresholds match the SCSS media query breakpoints in modal.vars.scss
1661
- * that trigger the centered dialog layout (non-fullscreen modal).
1662
- *
1663
- * SCSS defines two height breakpoints: $modal-inset-min-height-small (600px)
1664
- * and $modal-inset-min-height-large (768px). We use the smaller one because
1665
- * that's the threshold where the modal transitions from fullscreen to centered
1666
- * dialog — the larger breakpoint only increases the dialog's height.
1667
- */
1668
- const MODAL_INSET_MIN_WIDTH = 768;
1669
- const MODAL_INSET_MIN_HEIGHT = 600;
1670
1663
  const EDGE_THRESHOLD = 5;
1671
- /**
1672
- * CSS values for `--width` / `--height` that are treated as fullscreen
1673
- * (modal touches the corresponding screen edges). Empty string means the
1674
- * property was not overridden. See `hasCustomModalDimensions()`.
1675
- */
1676
- const FULLSCREEN_SIZE_VALUES = new Set(['', '100%', '100vw', '100vh', '100dvw', '100dvh', '100svw', '100svh']);
1677
1664
  /**
1678
1665
  * Cache for resolved root safe-area-top value, invalidated once per frame.
1679
1666
  */
1680
1667
  let cachedRootSafeAreaTop = null;
1681
1668
  let cacheInvalidationScheduled = false;
1682
- /**
1683
- * Determines if the current viewport meets the CSS media query conditions
1684
- * that cause regular modals to render as centered dialogs instead of fullscreen.
1685
- * Matches: @media (min-width: 768px) and (min-height: 600px)
1686
- */
1687
- const isCenteredDialogViewport = () => {
1688
- if (!index.win)
1689
- return false;
1690
- return index.win.matchMedia(`(min-width: ${MODAL_INSET_MIN_WIDTH}px) and (min-height: ${MODAL_INSET_MIN_HEIGHT}px)`)
1691
- .matches;
1692
- };
1693
1669
  /**
1694
1670
  * Resolves the current root --ion-safe-area-top value to pixels.
1695
1671
  * Uses a temporary element because getComputedStyle on :root returns
@@ -1702,7 +1678,7 @@ const getRootSafeAreaTop = () => {
1702
1678
  if (cachedRootSafeAreaTop !== null) {
1703
1679
  return cachedRootSafeAreaTop;
1704
1680
  }
1705
- const doc = index.win?.document;
1681
+ const doc = helpers.win?.document;
1706
1682
  if (!doc?.body) {
1707
1683
  return 0;
1708
1684
  }
@@ -1723,55 +1699,64 @@ const getRootSafeAreaTop = () => {
1723
1699
  return value;
1724
1700
  };
1725
1701
  /**
1726
- * Calls back when the resolved root `--ion-safe-area-top` changes, which no
1727
- * event and no window resize covers. The probe's height tracks the variable, so
1728
- * a change to it becomes a size change the observer can see.
1702
+ * Calls back when the resolved root `--ion-safe-area-top` changes. The value
1703
+ * the caller already applied is passed as the baseline, so a change between
1704
+ * that read and the observer starting is still reported.
1729
1705
  */
1730
1706
  const onRootSafeAreaTopChange = (callback) => {
1731
- const doc = index.win?.document;
1732
- if (!doc?.body || typeof ResizeObserver === 'undefined') {
1733
- return () => undefined;
1734
- }
1735
- const probe = doc.createElement('div');
1736
- probe.style.cssText =
1737
- 'position:fixed;visibility:hidden;pointer-events:none;top:0;left:0;width:0;' +
1738
- 'height:var(--ion-safe-area-top,0px);';
1739
- doc.body.appendChild(probe);
1740
- /**
1741
- * Seeded with the value the caller has already applied, so a change that
1742
- * lands before the observer's first delivery still gets reported. Comparing
1743
- * against an unset value instead would consume that first delivery and treat
1744
- * the new inset as the baseline.
1745
- */
1746
- let lastHeight = getRootSafeAreaTop();
1747
- const observer = new ResizeObserver((entries) => {
1748
- const { height } = entries[0].contentRect;
1749
- if (height !== lastHeight) {
1750
- lastHeight = height;
1751
- callback(height);
1752
- }
1753
- });
1754
- observer.observe(probe);
1755
- return () => {
1756
- observer.disconnect();
1757
- probe.remove();
1758
- };
1707
+ return helpers.onCustomPropertyChange(helpers.win?.document?.body, '--ion-safe-area-top', callback, getRootSafeAreaTop());
1759
1708
  };
1760
1709
  /**
1761
- * True when the modal host declares BOTH a non-fullscreen `--width` AND a
1762
- * non-fullscreen `--height` (i.e. a centered-dialog-like modal that doesn't
1763
- * touch any screen edge).
1710
+ * Determines which viewport axes the modal spans so safe-area requirements
1711
+ * can be predicted independently for each axis.
1712
+ *
1713
+ * A modal that spans an axis reaches both edges on that axis and needs the
1714
+ * corresponding safe-area insets. A modal that does not span an axis reaches
1715
+ * neither edge on that axis.
1764
1716
  *
1765
- * The conservative "both axes" check avoids mis-zeroing safe-area for
1766
- * partial-custom modals where the modal still touches top/bottom edges
1767
- * (e.g. only `--width` overridden). Partial cases fall through to the
1768
- * existing position-based post-animation correction.
1717
+ * When both `--width` and `--height` are `fullscreen`, coverage can be
1718
+ * determined directly. Otherwise, coverage is based on the rendered wrapper,
1719
+ * including cases where content sizing or `--max-height` causes the modal
1720
+ * to reach the viewport.
1769
1721
  */
1770
- const hasCustomModalDimensions = (hostEl) => {
1722
+ const getModalCoveredAxes = (hostEl) => {
1771
1723
  const styles = getComputedStyle(hostEl);
1772
- const width = styles.getPropertyValue('--width').trim();
1773
- const height = styles.getPropertyValue('--height').trim();
1774
- return !FULLSCREEN_SIZE_VALUES.has(width) && !FULLSCREEN_SIZE_VALUES.has(height);
1724
+ const width = hardwareBackButton.getOverlaySizeType(styles.getPropertyValue('--width'));
1725
+ const height = hardwareBackButton.getOverlaySizeType(styles.getPropertyValue('--height'));
1726
+ if (width === 'fullscreen' && height === 'fullscreen') {
1727
+ return { vertical: true, horizontal: true };
1728
+ }
1729
+ return measureCoveredAxes(hostEl);
1730
+ };
1731
+ /**
1732
+ * Measures the modal wrapper to determine whether it spans the viewport
1733
+ * on each axis.
1734
+ *
1735
+ * The wrapper has no box while the modal is hidden, so `overlay-hidden`
1736
+ * is temporarily removed to allow the wrapper to be measured. The class
1737
+ * is restored in the same task before the browser can paint.
1738
+ *
1739
+ * Only the wrapper's size is measured. Its position is affected by the
1740
+ * enter animation, which initially translates it by its own height, while
1741
+ * the translation does not affect its measured size.
1742
+ */
1743
+ const measureCoveredAxes = (hostEl) => {
1744
+ const wrapperEl = hostEl.shadowRoot?.querySelector('.modal-wrapper');
1745
+ if (wrapperEl == null || helpers.win === undefined) {
1746
+ return { vertical: false, horizontal: false };
1747
+ }
1748
+ const wasHidden = hostEl.classList.contains('overlay-hidden');
1749
+ if (wasHidden) {
1750
+ hostEl.classList.remove('overlay-hidden');
1751
+ }
1752
+ const { width, height } = wrapperEl.getBoundingClientRect();
1753
+ if (wasHidden) {
1754
+ hostEl.classList.add('overlay-hidden');
1755
+ }
1756
+ return {
1757
+ vertical: height >= helpers.win.innerHeight - EDGE_THRESHOLD,
1758
+ horizontal: width >= helpers.win.innerWidth - EDGE_THRESHOLD,
1759
+ };
1775
1760
  };
1776
1761
  /**
1777
1762
  * Returns the initial safe-area configuration based on modal type.
@@ -1805,26 +1790,23 @@ const getInitialSafeAreaConfig = (context) => {
1805
1790
  right: '0px',
1806
1791
  };
1807
1792
  }
1808
- // On viewports that meet the centered dialog media query breakpoints,
1809
- // regular modals render as centered dialogs (not fullscreen), so they
1810
- // don't touch any screen edges and don't need safe-area insets. Also
1811
- // applies to phone viewports when the modal declares custom --width and
1812
- // --height; these don't touch screen edges either, so the initial
1813
- // prediction must be zero to avoid a post-animation correction flash.
1814
- if (isCenteredDialogViewport() || context.hasCustomDimensions) {
1815
- return {
1816
- top: '0px',
1817
- bottom: '0px',
1818
- left: '0px',
1819
- right: '0px',
1820
- };
1821
- }
1822
- // Fullscreen modals on phone - inherit all safe areas
1793
+ /**
1794
+ * Each axis is evaluated independently because a modal can span one axis
1795
+ * without spanning the other. This allows the initial safe-area configuration
1796
+ * to match the modal's expected dimensions and avoids correcting an incorrect
1797
+ * pair of insets after presentation.
1798
+ *
1799
+ * A modal can span the horizontal axis while remaining inset vertically, or
1800
+ * span the vertical axis while remaining inset horizontally. Wide viewports
1801
+ * can also render regular modals as centered dialogs, while content-sized
1802
+ * modals may still be clamped to the viewport.
1803
+ */
1804
+ const { vertical, horizontal } = context.coveredAxes ?? { vertical: true, horizontal: true };
1823
1805
  return {
1824
- top: 'inherit',
1825
- bottom: 'inherit',
1826
- left: 'inherit',
1827
- right: 'inherit',
1806
+ top: vertical ? 'inherit' : '0px',
1807
+ bottom: vertical ? 'inherit' : '0px',
1808
+ left: horizontal ? 'inherit' : '0px',
1809
+ right: horizontal ? 'inherit' : '0px',
1828
1810
  };
1829
1811
  };
1830
1812
  /**
@@ -1842,8 +1824,8 @@ const getInitialSafeAreaConfig = (context) => {
1842
1824
  */
1843
1825
  const getPositionBasedSafeAreaConfig = (wrapperEl) => {
1844
1826
  const rect = wrapperEl.getBoundingClientRect();
1845
- const vh = index.win?.innerHeight ?? 0;
1846
- const vw = index.win?.innerWidth ?? 0;
1827
+ const vh = helpers.win?.innerHeight ?? 0;
1828
+ const vw = helpers.win?.innerWidth ?? 0;
1847
1829
  // Only apply safe-area to sides where modal overlaps with screen edge
1848
1830
  return {
1849
1831
  top: rect.top <= EDGE_THRESHOLD ? 'inherit' : '0px',
@@ -1876,28 +1858,28 @@ const clearSafeAreaOverrides = (hostEl) => {
1876
1858
  hostEl.style.removeProperty('--ion-safe-area-right');
1877
1859
  };
1878
1860
 
1879
- 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}`;
1861
+ 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}`;
1880
1862
 
1881
- 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}`;
1863
+ 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}`;
1882
1864
 
1883
1865
  const Modal = class {
1884
1866
  constructor(hostRef) {
1885
- index$3.registerInstance(this, hostRef);
1886
- this.didPresent = index$3.createEvent(this, "ionModalDidPresent", 7);
1887
- this.willPresent = index$3.createEvent(this, "ionModalWillPresent", 7);
1888
- this.willDismiss = index$3.createEvent(this, "ionModalWillDismiss", 7);
1889
- this.didDismiss = index$3.createEvent(this, "ionModalDidDismiss", 7);
1890
- this.ionBreakpointDidChange = index$3.createEvent(this, "ionBreakpointDidChange", 7);
1891
- this.didPresentShorthand = index$3.createEvent(this, "didPresent", 7);
1892
- this.willPresentShorthand = index$3.createEvent(this, "willPresent", 7);
1893
- this.willDismissShorthand = index$3.createEvent(this, "willDismiss", 7);
1894
- this.didDismissShorthand = index$3.createEvent(this, "didDismiss", 7);
1895
- this.ionMount = index$3.createEvent(this, "ionMount", 7);
1896
- this.ionDragStart = index$3.createEvent(this, "ionDragStart", 7);
1897
- this.ionDragMove = index$3.createEvent(this, "ionDragMove", 7);
1898
- this.ionDragEnd = index$3.createEvent(this, "ionDragEnd", 7);
1867
+ index$2.registerInstance(this, hostRef);
1868
+ this.didPresent = index$2.createEvent(this, "ionModalDidPresent", 7);
1869
+ this.willPresent = index$2.createEvent(this, "ionModalWillPresent", 7);
1870
+ this.willDismiss = index$2.createEvent(this, "ionModalWillDismiss", 7);
1871
+ this.didDismiss = index$2.createEvent(this, "ionModalDidDismiss", 7);
1872
+ this.ionBreakpointDidChange = index$2.createEvent(this, "ionBreakpointDidChange", 7);
1873
+ this.didPresentShorthand = index$2.createEvent(this, "didPresent", 7);
1874
+ this.willPresentShorthand = index$2.createEvent(this, "willPresent", 7);
1875
+ this.willDismissShorthand = index$2.createEvent(this, "willDismiss", 7);
1876
+ this.didDismissShorthand = index$2.createEvent(this, "didDismiss", 7);
1877
+ this.ionMount = index$2.createEvent(this, "ionMount", 7);
1878
+ this.ionDragStart = index$2.createEvent(this, "ionDragStart", 7);
1879
+ this.ionDragMove = index$2.createEvent(this, "ionDragMove", 7);
1880
+ this.ionDragEnd = index$2.createEvent(this, "ionDragEnd", 7);
1899
1881
  this.lockController = lockController.createLockController();
1900
- this.triggerController = overlays.createTriggerController();
1882
+ this.triggerController = hardwareBackButton.createTriggerController();
1901
1883
  this.coreDelegate = frameworkDelegate.CoreDelegate();
1902
1884
  this.isSheetModal = false;
1903
1885
  this.inheritedAttributes = {};
@@ -2043,7 +2025,7 @@ const Modal = class {
2043
2025
  */
2044
2026
  return;
2045
2027
  }
2046
- this.dismiss(undefined, overlays.BACKDROP);
2028
+ this.dismiss(undefined, hardwareBackButton.BACKDROP);
2047
2029
  };
2048
2030
  this.onLifecycle = (modalEvent) => {
2049
2031
  const el = this.usersElement;
@@ -2141,7 +2123,7 @@ const Modal = class {
2141
2123
  }
2142
2124
  connectedCallback() {
2143
2125
  const { el } = this;
2144
- overlays.prepareOverlay(el);
2126
+ hardwareBackButton.prepareOverlay(el);
2145
2127
  this.triggerChanged();
2146
2128
  // A disconnect tears down state this presentation still needs and cannot
2147
2129
  // tell a re-insert from a removal, so put it back.
@@ -2151,7 +2133,7 @@ const Modal = class {
2151
2133
  // A relocation from `willPresent` reaches these before `present()` has
2152
2134
  // applied the lock, so they apply it instead. Both are idempotent.
2153
2135
  if (this.presented) {
2154
- overlays.restoreRootFocusTrapAccessibility(el);
2136
+ hardwareBackButton.restoreRootFocusTrapAccessibility(el);
2155
2137
  this.initParentRemovalObserver();
2156
2138
  }
2157
2139
  }
@@ -2164,7 +2146,7 @@ const Modal = class {
2164
2146
  this.cleanupSafeAreaOverrides();
2165
2147
  // Clean up aria-hidden if removed without dismiss() being called
2166
2148
  if (this.presented) {
2167
- overlays.cleanupRootFocusTrapAccessibility();
2149
+ hardwareBackButton.cleanupRootFocusTrapAccessibility();
2168
2150
  }
2169
2151
  }
2170
2152
  componentWillLoad() {
@@ -2214,10 +2196,10 @@ const Modal = class {
2214
2196
  this.currentBreakpoint = this.initialBreakpoint;
2215
2197
  }
2216
2198
  if (breakpoints !== undefined && initialBreakpoint !== undefined && !breakpoints.includes(initialBreakpoint)) {
2217
- index$3.printIonWarning('[ion-modal] - Your breakpoints array must include the initialBreakpoint value.');
2199
+ index$2.printIonWarning('[ion-modal] - Your breakpoints array must include the initialBreakpoint value.');
2218
2200
  }
2219
2201
  if (!this.htmlAttributes?.id) {
2220
- overlays.setOverlayId(this.el);
2202
+ hardwareBackButton.setOverlayId(this.el);
2221
2203
  }
2222
2204
  }
2223
2205
  componentDidLoad() {
@@ -2314,7 +2296,7 @@ const Modal = class {
2314
2296
  * get the transition incorrect.
2315
2297
  */
2316
2298
  if (helpers.hasLazyBuild(el)) {
2317
- await index$4.deepReady(this.usersElement);
2299
+ await index$3.deepReady(this.usersElement);
2318
2300
  /**
2319
2301
  * If keepContentsMounted="true" then the
2320
2302
  * JS Framework has already mounted the inner
@@ -2325,9 +2307,9 @@ const Modal = class {
2325
2307
  */
2326
2308
  }
2327
2309
  else if (!this.keepContentsMounted) {
2328
- await index$4.waitForMount();
2310
+ await index$3.waitForMount();
2329
2311
  }
2330
- index$3.writeTask(() => this.el.classList.add('show-modal'));
2312
+ index$2.writeTask(() => this.el.classList.add('show-modal'));
2331
2313
  // Recalculate isSheetModal before safe-area setup because framework
2332
2314
  // bindings (e.g., Angular) may not have been applied when componentWillLoad ran.
2333
2315
  this.isSheetModal = this.breakpoints !== undefined && this.initialBreakpoint !== undefined;
@@ -2348,7 +2330,7 @@ const Modal = class {
2348
2330
  this.statusBarStyle = await StatusBar.getStyle();
2349
2331
  setCardStatusBarDark();
2350
2332
  }
2351
- await overlays.present(this, 'modalEnter', iosEnterAnimation, mdEnterAnimation, {
2333
+ await hardwareBackButton.present(this, 'modalEnter', iosEnterAnimation, mdEnterAnimation, {
2352
2334
  presentingEl: presentingElement,
2353
2335
  currentBreakpoint: this.initialBreakpoint,
2354
2336
  backdropBreakpoint: this.backdropBreakpoint,
@@ -2413,14 +2395,14 @@ const Modal = class {
2413
2395
  // All of the elements needed for the swipe gesture
2414
2396
  // should be in the DOM and referenced by now, except
2415
2397
  // for the presenting el
2416
- const animationBuilder = this.leaveAnimation || index$3.config.get('modalLeave', iosLeaveAnimation);
2398
+ const animationBuilder = this.leaveAnimation || index$2.config.get('modalLeave', iosLeaveAnimation);
2417
2399
  const ani = (this.animation = animationBuilder(el, {
2418
2400
  presentingEl: this.presentingElement,
2419
2401
  expandToScroll: this.expandToScroll,
2420
2402
  }));
2421
- const contentEl = index$1.findIonContent(el);
2403
+ const contentEl = index.findIonContent(el);
2422
2404
  if (!contentEl) {
2423
- index$1.printIonContentErrorMsg(el);
2405
+ index.printIonContentErrorMsg(el);
2424
2406
  return;
2425
2407
  }
2426
2408
  const statusBarStyle = this.statusBarStyle ?? Style.Default;
@@ -2432,7 +2414,7 @@ const Modal = class {
2432
2414
  if (!wrapperEl || initialBreakpoint === undefined) {
2433
2415
  return;
2434
2416
  }
2435
- const animationBuilder = this.enterAnimation || index$3.config.get('modalEnter', iosEnterAnimation);
2417
+ const animationBuilder = this.enterAnimation || index$2.config.get('modalEnter', iosEnterAnimation);
2436
2418
  const ani = (this.animation = animationBuilder(this.el, {
2437
2419
  presentingEl: this.presentingElement,
2438
2420
  currentBreakpoint: initialBreakpoint,
@@ -2535,7 +2517,7 @@ const Modal = class {
2535
2517
  this.animation.onFinish(async () => {
2536
2518
  this.currentBreakpoint = 0;
2537
2519
  this.ionBreakpointDidChange.emit({ breakpoint: this.currentBreakpoint });
2538
- await this.dismiss(undefined, overlays.GESTURE);
2520
+ await this.dismiss(undefined, hardwareBackButton.GESTURE);
2539
2521
  this.gestureAnimationDismissing = false;
2540
2522
  });
2541
2523
  }
@@ -2561,7 +2543,7 @@ const Modal = class {
2561
2543
  */
2562
2544
  setCardStatusBarDefault(this.statusBarStyle);
2563
2545
  this.animation.onFinish(async () => {
2564
- await this.dismiss(undefined, overlays.GESTURE);
2546
+ await this.dismiss(undefined, hardwareBackButton.GESTURE);
2565
2547
  this.gestureAnimationDismissing = false;
2566
2548
  });
2567
2549
  }
@@ -2576,7 +2558,7 @@ const Modal = class {
2576
2558
  * For example, `cancel` or `backdrop`.
2577
2559
  */
2578
2560
  async dismiss(data, role) {
2579
- if (this.gestureAnimationDismissing && role !== overlays.GESTURE) {
2561
+ if (this.gestureAnimationDismissing && role !== hardwareBackButton.GESTURE) {
2580
2562
  return false;
2581
2563
  }
2582
2564
  // Cancel any pending resize timeout to prevent stale updates during dismiss
@@ -2618,7 +2600,7 @@ const Modal = class {
2618
2600
  window.removeEventListener(keyboard.KEYBOARD_DID_OPEN, this.keyboardOpenCallback);
2619
2601
  this.keyboardOpenCallback = undefined;
2620
2602
  }
2621
- const dismissed = await overlays.dismiss(this, data, role, 'modalLeave', iosLeaveAnimation, mdLeaveAnimation, {
2603
+ const dismissed = await hardwareBackButton.dismiss(this, data, role, 'modalLeave', iosLeaveAnimation, mdLeaveAnimation, {
2622
2604
  presentingEl: presentingElement,
2623
2605
  currentBreakpoint: this.currentBreakpoint ?? this.initialBreakpoint,
2624
2606
  backdropBreakpoint: this.backdropBreakpoint,
@@ -2627,7 +2609,7 @@ const Modal = class {
2627
2609
  if (dismissed) {
2628
2610
  const { delegate } = this.getDelegate();
2629
2611
  await frameworkDelegate.detachComponent(delegate, this.usersElement);
2630
- index$3.writeTask(() => this.el.classList.remove('show-modal'));
2612
+ index$2.writeTask(() => this.el.classList.remove('show-modal'));
2631
2613
  if (this.animation) {
2632
2614
  this.animation.destroy();
2633
2615
  }
@@ -2655,13 +2637,13 @@ const Modal = class {
2655
2637
  * Returns a promise that resolves when the modal did dismiss.
2656
2638
  */
2657
2639
  onDidDismiss() {
2658
- return overlays.eventMethod(this.el, 'ionModalDidDismiss');
2640
+ return hardwareBackButton.eventMethod(this.el, 'ionModalDidDismiss');
2659
2641
  }
2660
2642
  /**
2661
2643
  * Returns a promise that resolves when the modal will dismiss.
2662
2644
  */
2663
2645
  onWillDismiss() {
2664
- return overlays.eventMethod(this.el, 'ionModalWillDismiss');
2646
+ return hardwareBackButton.eventMethod(this.el, 'ionModalWillDismiss');
2665
2647
  }
2666
2648
  /**
2667
2649
  * Move a sheet style modal to a specific breakpoint.
@@ -2671,11 +2653,11 @@ const Modal = class {
2671
2653
  */
2672
2654
  async setCurrentBreakpoint(breakpoint) {
2673
2655
  if (!this.isSheetModal) {
2674
- index$3.printIonWarning('[ion-modal] - setCurrentBreakpoint is only supported on sheet modals.');
2656
+ index$2.printIonWarning('[ion-modal] - setCurrentBreakpoint is only supported on sheet modals.');
2675
2657
  return;
2676
2658
  }
2677
2659
  if (!this.breakpoints.includes(breakpoint)) {
2678
- index$3.printIonWarning(`[ion-modal] - Attempted to set invalid breakpoint value ${breakpoint}. Please double check that the breakpoint value is part of your defined breakpoints.`);
2660
+ index$2.printIonWarning(`[ion-modal] - Attempted to set invalid breakpoint value ${breakpoint}. Please double check that the breakpoint value is part of your defined breakpoints.`);
2679
2661
  return;
2680
2662
  }
2681
2663
  const { currentBreakpoint, moveSheetToBreakpoint, canDismiss, breakpoints, animated } = this;
@@ -2906,7 +2888,7 @@ const Modal = class {
2906
2888
  /**
2907
2889
  * Creates the context object for safe-area utilities.
2908
2890
  *
2909
- * `hasCustomDimensions` is only set by `setInitialSafeAreaOverrides()`
2891
+ * `coveredAxes` is only set by `setInitialSafeAreaOverrides()`
2910
2892
  * because it is only read by `getInitialSafeAreaConfig()`. Other callers
2911
2893
  * (resize handler, post-animation update, fullscreen-padding apply) would
2912
2894
  * pay a `getComputedStyle()` cost for a value they never consult.
@@ -2920,6 +2902,26 @@ const Modal = class {
2920
2902
  currentBreakpoint: this.currentBreakpoint,
2921
2903
  };
2922
2904
  }
2905
+ /**
2906
+ * Keeps the content's sizing in sync with `--height`. The content reads the
2907
+ * property to determine whether it should size itself to its content, and
2908
+ * changes to `--height` on an ancestor or the root can change that behavior
2909
+ * without changing the modal itself.
2910
+ */
2911
+ watchHeightForContent() {
2912
+ /**
2913
+ * A sheet's height comes from its breakpoints, so its content never sizes
2914
+ * itself to `--height`. Watching it would cause the drag to recalculate on
2915
+ * every frame.
2916
+ */
2917
+ if (this.isSheetModal) {
2918
+ return;
2919
+ }
2920
+ this.unsubscribeHeightChange?.();
2921
+ this.unsubscribeHeightChange = onModalHeightChange(this.el, () => {
2922
+ this.el.querySelectorAll('ion-content').forEach((contentEl) => contentEl.recalculateDimensions());
2923
+ });
2924
+ }
2923
2925
  /**
2924
2926
  * Sets initial safe-area overrides before modal animation.
2925
2927
  * Called in present() before animation starts.
@@ -2933,10 +2935,11 @@ const Modal = class {
2933
2935
  setInitialSafeAreaOverrides() {
2934
2936
  const context = {
2935
2937
  ...this.getSafeAreaContext(),
2936
- hasCustomDimensions: hasCustomModalDimensions(this.el),
2938
+ coveredAxes: getModalCoveredAxes(this.el),
2937
2939
  };
2938
2940
  const safeAreaConfig = getInitialSafeAreaConfig(context);
2939
2941
  applySafeAreaOverrides(this.el, safeAreaConfig);
2942
+ this.watchHeightForContent();
2940
2943
  // Set the internal offset property with the resolved root safe-area-top value
2941
2944
  if (context.isSheetModal) {
2942
2945
  this.updateSheetOffsetTop();
@@ -3056,6 +3059,8 @@ const Modal = class {
3056
3059
  clearSafeAreaOverrides(this.el);
3057
3060
  this.unsubscribeRootSafeAreaTop?.();
3058
3061
  this.unsubscribeRootSafeAreaTop = undefined;
3062
+ this.unsubscribeHeightChange?.();
3063
+ this.unsubscribeHeightChange = undefined;
3059
3064
  // Remove internal sheet offset property
3060
3065
  this.el.style.removeProperty('--ion-modal-offset-top');
3061
3066
  const { contentEl } = this.findContentAndFooter();
@@ -3093,7 +3098,7 @@ const Modal = class {
3093
3098
  const isCardModal = presentingElement !== undefined && mode === 'ios';
3094
3099
  const isHandleCycle = handleBehavior === 'cycle';
3095
3100
  const isSheetModalWithHandle = isSheetModal && showHandle;
3096
- return (index$3.h(index$3.Host, { key: '7c9c736052c5a788cf31040b6b2386dd9ea7454b', "no-router": true,
3101
+ return (index$2.h(index$2.Host, { key: '17a95bd7722bac2344bea041aff97db17f55c0cf', "no-router": true,
3097
3102
  // Allow the modal to be navigable when the handle is focusable
3098
3103
  tabIndex: isHandleCycle && isSheetModalWithHandle ? 0 : -1, ...htmlAttributes, style: {
3099
3104
  zIndex: `${20000 + this.overlayIndex}`,
@@ -3104,9 +3109,9 @@ const Modal = class {
3104
3109
  [`modal-sheet`]: isSheetModal,
3105
3110
  [`modal-no-expand-scroll`]: isSheetModal && !expandToScroll,
3106
3111
  'overlay-hidden': true,
3107
- [overlays.FOCUS_TRAP_DISABLE_CLASS]: focusTrap === false,
3112
+ [hardwareBackButton.FOCUS_TRAP_DISABLE_CLASS]: focusTrap === false,
3108
3113
  ...theme.getClassMap(this.cssClass),
3109
- }, onIonBackdropTap: this.onBackdropTap, onIonModalDidPresent: this.onLifecycle, onIonModalWillPresent: this.onLifecycle, onIonModalWillDismiss: this.onLifecycle, onIonModalDidDismiss: this.onLifecycle, onFocus: this.onModalFocus }, index$3.h("ion-backdrop", { key: '01b5b5765fb3a32393c736065c824bf760728823', ref: (el) => (this.backdropEl = el), visible: this.showBackdrop, tappable: this.backdropDismiss, part: "backdrop" }), mode === 'ios' && index$3.h("div", { key: '40fa7727a0923f7d7461dd027f1511a6a148d84a', class: "modal-shadow" }), index$3.h("div", { key: '9af934b607f60795bd5bff7bee6eacfc9b14fa35',
3114
+ }, onIonBackdropTap: this.onBackdropTap, onIonModalDidPresent: this.onLifecycle, onIonModalWillPresent: this.onLifecycle, onIonModalWillDismiss: this.onLifecycle, onIonModalDidDismiss: this.onLifecycle, onFocus: this.onModalFocus }, index$2.h("ion-backdrop", { key: '9dab1ef4771c0d847ba2be8672afbaa2748517f3', ref: (el) => (this.backdropEl = el), visible: this.showBackdrop, tappable: this.backdropDismiss, part: "backdrop" }), mode === 'ios' && index$2.h("div", { key: '64af7ed1c5f552b61fc4b9387b926acc76c8a99a', class: "modal-shadow" }), index$2.h("div", { key: '7e76d77d5b2e8f0467bb793facf5aa86f8d01bbe',
3110
3115
  /*
3111
3116
  role and aria-modal must be used on the
3112
3117
  same element. They must also be set inside the
@@ -3119,11 +3124,11 @@ const Modal = class {
3119
3124
  without the tabindex focus() would be a no-op and screen readers
3120
3125
  may not properly announce the dialog and its content when it opens.
3121
3126
  */
3122
- role: "dialog", ...inheritedAttributes, "aria-modal": "true", tabIndex: -1, class: "modal-wrapper ion-overlay-wrapper", part: "content", ref: (el) => (this.wrapperEl = el) }, showHandle && (index$3.h("button", { key: 'df84a6806413b13efc5b03c862edde83151579a7', class: "modal-handle",
3127
+ role: "dialog", ...inheritedAttributes, "aria-modal": "true", tabIndex: -1, class: "modal-wrapper ion-overlay-wrapper", part: "content", ref: (el) => (this.wrapperEl = el) }, showHandle && (index$2.h("button", { key: '5efc0bb0a59adcc594ac48da9fd90e57908a7ffb', class: "modal-handle",
3123
3128
  // Prevents the handle from receiving keyboard focus when it does not cycle
3124
- 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) })), index$3.h("slot", { key: '072d3929ec6f25481946b184d8ac24219011e783', onSlotchange: this.onSlotChange }))));
3129
+ 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) })), index$2.h("slot", { key: '6175fcd0b39c086b4e9eb9e96c4d631c2a86774b', onSlotchange: this.onSlotChange }))));
3125
3130
  }
3126
- get el() { return index$3.getElement(this); }
3131
+ get el() { return index$2.getElement(this); }
3127
3132
  static get watchers() { return {
3128
3133
  "isOpen": [{
3129
3134
  "onIsOpenChange": 0