@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,14 +3,129 @@
3
3
  */
4
4
  'use strict';
5
5
 
6
- var index$1 = require('./index-DkNv4J_i.js');
7
- var helpers = require('./helpers-7wzdhdeg.js');
8
- var hardwareBackButton = require('./hardware-back-button-Bu4Dzw8l.js');
9
- var index = require('./index-DXoo08JC.js');
10
- var ionicGlobal = require('./ionic-global-CYJNT-2P.js');
11
- var frameworkDelegate = require('./framework-delegate-d-fWfeI6.js');
6
+ var helpers = require('./helpers-DHjAEaU9.js');
7
+ var index = require('./index-T36W_eKv.js');
8
+ var ionicGlobal = require('./ionic-global-BWd7usAF.js');
9
+ var frameworkDelegate = require('./framework-delegate-DYIuFqQx.js');
12
10
  var gestureController = require('./gesture-controller-CeJslptU.js');
13
11
 
12
+ /**
13
+ * CloseWatcher is a newer API that lets
14
+ * use detect the hardware back button event
15
+ * in a web browser: https://caniuse.com/?search=closewatcher
16
+ * However, not every browser supports it yet.
17
+ *
18
+ * This needs to be a function so that we can
19
+ * check the config once it has been set.
20
+ * Otherwise, this code would be evaluated the
21
+ * moment this file is evaluated which could be
22
+ * before the config is set.
23
+ */
24
+ const shouldUseCloseWatcher = () => index.config.get('experimentalCloseWatcher', false) && helpers.win !== undefined && 'CloseWatcher' in helpers.win;
25
+ /**
26
+ * When hardwareBackButton: false in config,
27
+ * we need to make sure we also block the default
28
+ * webview behavior. If we don't then it will be
29
+ * possible for users to navigate backward while
30
+ * an overlay is still open. Additionally, it will
31
+ * give the appearance that the hardwareBackButton
32
+ * config is not working as the page transition
33
+ * will still happen.
34
+ */
35
+ const blockHardwareBackButton = () => {
36
+ document.addEventListener('backbutton', () => { });
37
+ };
38
+ const startHardwareBackButton = () => {
39
+ const doc = document;
40
+ let busy = false;
41
+ const backButtonCallback = () => {
42
+ if (busy) {
43
+ return;
44
+ }
45
+ let index$1 = 0;
46
+ let handlers = [];
47
+ const ev = new CustomEvent('ionBackButton', {
48
+ bubbles: false,
49
+ detail: {
50
+ register(priority, handler) {
51
+ handlers.push({ priority, handler, id: index$1++ });
52
+ },
53
+ },
54
+ });
55
+ doc.dispatchEvent(ev);
56
+ const executeAction = async (handlerRegister) => {
57
+ try {
58
+ if (handlerRegister?.handler) {
59
+ const result = handlerRegister.handler(processHandlers);
60
+ if (result != null) {
61
+ await result;
62
+ }
63
+ }
64
+ }
65
+ catch (e) {
66
+ index.printIonError('[ion-app] - Exception in startHardwareBackButton:', e);
67
+ }
68
+ };
69
+ const processHandlers = () => {
70
+ if (handlers.length > 0) {
71
+ let selectedHandler = {
72
+ priority: Number.MIN_SAFE_INTEGER,
73
+ handler: () => undefined,
74
+ id: -1,
75
+ };
76
+ handlers.forEach((handler) => {
77
+ if (handler.priority >= selectedHandler.priority) {
78
+ selectedHandler = handler;
79
+ }
80
+ });
81
+ busy = true;
82
+ handlers = handlers.filter((handler) => handler.id !== selectedHandler.id);
83
+ executeAction(selectedHandler).then(() => (busy = false));
84
+ }
85
+ };
86
+ processHandlers();
87
+ };
88
+ /**
89
+ * If the CloseWatcher is defined then
90
+ * we don't want to also listen for the native
91
+ * backbutton event otherwise we may get duplicate
92
+ * events firing.
93
+ */
94
+ if (shouldUseCloseWatcher()) {
95
+ let watcher;
96
+ const configureWatcher = () => {
97
+ watcher?.destroy();
98
+ watcher = new helpers.win.CloseWatcher();
99
+ /**
100
+ * Once a close request happens
101
+ * the watcher gets destroyed.
102
+ * As a result, we need to re-configure
103
+ * the watcher so we can respond to other
104
+ * close requests.
105
+ */
106
+ watcher.onclose = () => {
107
+ backButtonCallback();
108
+ configureWatcher();
109
+ };
110
+ };
111
+ configureWatcher();
112
+ }
113
+ else {
114
+ doc.addEventListener('backbutton', backButtonCallback);
115
+ }
116
+ };
117
+ const OVERLAY_BACK_BUTTON_PRIORITY = 100;
118
+ const MENU_BACK_BUTTON_PRIORITY = 99; // 1 less than overlay priority since menu is displayed behind overlays
119
+
120
+ var hardwareBackButton = /*#__PURE__*/Object.freeze({
121
+ __proto__: null,
122
+ MENU_BACK_BUTTON_PRIORITY: MENU_BACK_BUTTON_PRIORITY,
123
+ OVERLAY_BACK_BUTTON_PRIORITY: OVERLAY_BACK_BUTTON_PRIORITY,
124
+ blockHardwareBackButton: blockHardwareBackButton,
125
+ shouldUseCloseWatcher: shouldUseCloseWatcher,
126
+ startHardwareBackButton: startHardwareBackButton
127
+ });
128
+
14
129
  /**
15
130
  * This query string selects elements that
16
131
  * are eligible to receive focus. We select
@@ -407,7 +522,7 @@ const connectListeners = (doc) => {
407
522
  doc.addEventListener('ionBackButton', (ev) => {
408
523
  const lastOverlay = getPresentedOverlay(doc);
409
524
  if (lastOverlay?.backdropDismiss) {
410
- ev.detail.register(hardwareBackButton.OVERLAY_BACK_BUTTON_PRIORITY, () => {
525
+ ev.detail.register(OVERLAY_BACK_BUTTON_PRIORITY, () => {
411
526
  /**
412
527
  * Do not return this promise otherwise
413
528
  * the hardware back button utility will
@@ -430,7 +545,7 @@ const connectListeners = (doc) => {
430
545
  * this behavior will be handled via the ionBackButton
431
546
  * event.
432
547
  */
433
- if (!hardwareBackButton.shouldUseCloseWatcher()) {
548
+ if (!shouldUseCloseWatcher()) {
434
549
  doc.addEventListener('keydown', (ev) => {
435
550
  if (ev.key === 'Escape') {
436
551
  const lastOverlay = getPresentedOverlay(doc);
@@ -716,7 +831,7 @@ const dismiss = async (overlay, data, role, name, iosLeaveAnimation, mdLeaveAnim
716
831
  if (!overlay.presented) {
717
832
  return false;
718
833
  }
719
- const presentedOverlays = index$1.doc !== undefined ? getPresentedOverlays(index$1.doc) : [];
834
+ const presentedOverlays = helpers.doc !== undefined ? getPresentedOverlays(helpers.doc) : [];
720
835
  /**
721
836
  * For accessibility, toasts lack focus traps and don't receive
722
837
  * `aria-hidden` on the root element when presented.
@@ -845,6 +960,40 @@ const safeCall = (handler, arg) => {
845
960
  }
846
961
  return undefined;
847
962
  };
963
+ /**
964
+ * `--width` and `--height` values that leave an overlay spanning the viewport
965
+ * on that axis, so it reaches both edges. An empty value means the property
966
+ * was never overridden.
967
+ */
968
+ const FULLSCREEN_SIZES = ['', '100%', '100vw', '100vh', '100dvw', '100dvh', '100svw', '100svh'];
969
+ /**
970
+ * `--width` and `--height` values that size an overlay to its content, leaving
971
+ * the rendered size dependent on the content and on `--max-width` or
972
+ * `--max-height`.
973
+ */
974
+ const CONTENT_SIZES = ['auto', 'fit-content', 'min-content', 'max-content'];
975
+ /**
976
+ * How an overlay's `--width` or `--height` determines its used size:
977
+ *
978
+ * `fullscreen` spans the viewport on that axis. `content` depends on the
979
+ * overlay's content, so its used size is not known until layout. `definite`
980
+ * resolves independently of the overlay's content size.
981
+ *
982
+ * Values are lowercased because CSS keywords are case-insensitive, while a
983
+ * custom property preserves the case in which it was authored. Content values
984
+ * are matched as a suffix so vendor-prefixed values such as `-moz-fit-content`
985
+ * are recognized.
986
+ */
987
+ const getOverlaySizeType = (size) => {
988
+ const value = size.trim().toLowerCase();
989
+ if (FULLSCREEN_SIZES.includes(value)) {
990
+ return 'fullscreen';
991
+ }
992
+ if (CONTENT_SIZES.some((keyword) => value.endsWith(keyword))) {
993
+ return 'content';
994
+ }
995
+ return 'definite';
996
+ };
848
997
  const BACKDROP = 'backdrop';
849
998
  const GESTURE = 'gesture';
850
999
  const OVERLAY_GESTURE_PRIORITY = 39;
@@ -979,6 +1128,7 @@ const FOCUS_TRAP_DISABLE_CLASS = 'ion-disable-focus-trap';
979
1128
  exports.BACKDROP = BACKDROP;
980
1129
  exports.FOCUS_TRAP_DISABLE_CLASS = FOCUS_TRAP_DISABLE_CLASS;
981
1130
  exports.GESTURE = GESTURE;
1131
+ exports.MENU_BACK_BUTTON_PRIORITY = MENU_BACK_BUTTON_PRIORITY;
982
1132
  exports.OVERLAY_GESTURE_PRIORITY = OVERLAY_GESTURE_PRIORITY;
983
1133
  exports.actionSheetController = actionSheetController;
984
1134
  exports.alertController = alertController;
@@ -989,7 +1139,9 @@ exports.dismiss = dismiss;
989
1139
  exports.eventMethod = eventMethod;
990
1140
  exports.focusFirstDescendant = focusFirstDescendant;
991
1141
  exports.focusLastDescendant = focusLastDescendant;
1142
+ exports.getOverlaySizeType = getOverlaySizeType;
992
1143
  exports.getPresentedOverlay = getPresentedOverlay;
1144
+ exports.hardwareBackButton = hardwareBackButton;
993
1145
  exports.isCancel = isCancel;
994
1146
  exports.loadingController = loadingController;
995
1147
  exports.modalController = modalController;
@@ -999,4 +1151,5 @@ exports.present = present;
999
1151
  exports.restoreRootFocusTrapAccessibility = restoreRootFocusTrapAccessibility;
1000
1152
  exports.safeCall = safeCall;
1001
1153
  exports.setOverlayId = setOverlayId;
1154
+ exports.shouldUseCloseWatcher = shouldUseCloseWatcher;
1002
1155
  exports.toastController = toastController;
@@ -3,8 +3,8 @@
3
3
  */
4
4
  'use strict';
5
5
 
6
- var index = require('./index-DXoo08JC.js');
7
- var index$1 = require('./index-KiSZqhYS.js');
6
+ var index = require('./index-T36W_eKv.js');
7
+ var index$1 = require('./index-MdIUU940.js');
8
8
 
9
9
  /**
10
10
  * Converts a DOM node into a Stencil VNode (or text string) so the
@@ -3,8 +3,7 @@
3
3
  */
4
4
  'use strict';
5
5
 
6
- var index = require('./index-DkNv4J_i.js');
7
- var helpers = require('./helpers-7wzdhdeg.js');
6
+ var helpers = require('./helpers-DHjAEaU9.js');
8
7
  var dir = require('./dir-zwDPRE5K.js');
9
8
 
10
9
  /**
@@ -96,8 +95,8 @@ const createNotchController = (el, getNotchSpacerEl, getLabelSlot) => {
96
95
  */
97
96
  width === 0 &&
98
97
  notchSpacerEl.offsetParent === null &&
99
- index.win !== undefined &&
100
- 'IntersectionObserver' in index.win) {
98
+ helpers.win !== undefined &&
99
+ 'IntersectionObserver' in helpers.win) {
101
100
  /**
102
101
  * If there is an IO already attached
103
102
  * then that will update the notch
@@ -360,7 +359,7 @@ const createClickController = (el, getNativeInput) => {
360
359
  const createSlotMutationController = (el, slotName, mutationCallback) => {
361
360
  let hostMutationObserver;
362
361
  let slottedContentMutationObserver;
363
- if (index.win !== undefined && 'MutationObserver' in index.win) {
362
+ if (helpers.win !== undefined && 'MutationObserver' in helpers.win) {
364
363
  const slots = Array.isArray(slotName) ? slotName : [slotName];
365
364
  hostMutationObserver = new MutationObserver((entries) => {
366
365
  for (const entry of entries) {
@@ -3,9 +3,9 @@
3
3
  */
4
4
  'use strict';
5
5
 
6
- var index = require('./index-DXoo08JC.js');
7
- var index$1 = require('./index-DtvKGwdh.js');
8
- var helpers = require('./helpers-7wzdhdeg.js');
6
+ var index = require('./index-T36W_eKv.js');
7
+ var index$1 = require('./index-BLq7TkUV.js');
8
+ var helpers = require('./helpers-DHjAEaU9.js');
9
9
  require('./dir-zwDPRE5K.js');
10
10
 
11
11
  const startStatusTap = () => {
@@ -3,10 +3,10 @@
3
3
  */
4
4
  'use strict';
5
5
 
6
- var helpers = require('./helpers-7wzdhdeg.js');
6
+ var helpers = require('./helpers-DHjAEaU9.js');
7
7
  var dir = require('./dir-zwDPRE5K.js');
8
8
  var index = require('./index-DRPqwSvU.js');
9
- require('./index-DXoo08JC.js');
9
+ require('./index-T36W_eKv.js');
10
10
  require('./gesture-controller-CeJslptU.js');
11
11
 
12
12
  const createSwipeBackGesture = (el, canStartHandler, onStartHandler, onMoveHandler, onEndHandler) => {
@@ -99,7 +99,7 @@
99
99
  "mixins": [],
100
100
  "compiler": {
101
101
  "name": "@stencil/core",
102
- "version": "4.44.2",
102
+ "version": "4.45.0",
103
103
  "typescriptVersion": "5.8.3"
104
104
  },
105
105
  "collections": [
@@ -3,6 +3,7 @@
3
3
  */
4
4
  import { Build, Host, forceUpdate, h, readTask, } from "@stencil/core";
5
5
  import { componentOnReady, hasLazyBuild, inheritAriaAttributes } from "../../utils/helpers";
6
+ import { getOverlaySizeType } from "../../utils/overlays";
6
7
  import { isPlatform } from "../../utils/platform";
7
8
  import { isRTL } from "../../utils/rtl/index";
8
9
  import { createColorClasses, hostContext } from "../../utils/theme";
@@ -47,6 +48,10 @@ export class Content {
47
48
  data: undefined,
48
49
  isScrolling: true,
49
50
  };
51
+ /**
52
+ * Whether the host is sized to its content.
53
+ */
54
+ this.sizeToContent = false;
50
55
  /**
51
56
  * If `true`, the content will scroll behind the headers
52
57
  * and footers. This effect can easily be seen by setting the toolbar
@@ -80,6 +85,7 @@ export class Content {
80
85
  }
81
86
  componentWillLoad() {
82
87
  this.inheritedAttributes = inheritAriaAttributes(this.el);
88
+ this.sizeToContent = this.readSizeToContent();
83
89
  }
84
90
  connectedCallback() {
85
91
  this.isMainContent = this.el.closest('ion-menu, ion-popover, ion-modal') === null;
@@ -119,6 +125,7 @@ export class Content {
119
125
  }
120
126
  // Re-observe on reattach, since componentDidLoad only fires once.
121
127
  this.setupFullscreenResizeObserver();
128
+ this.updateSizeToContent();
122
129
  }
123
130
  componentDidLoad() {
124
131
  // The custom elements build assigns fullscreen after connectedCallback.
@@ -175,6 +182,16 @@ export class Content {
175
182
  });
176
183
  this.fullscreenResizeObserver.observe(this.el);
177
184
  }
185
+ /**
186
+ * Picks up an overlay that is no longer sized the way the last render
187
+ * assumed, re-rendering only when the answer changes. Read in a `readTask`
188
+ * because resolving the custom property forces a style recalculation.
189
+ */
190
+ updateSizeToContent() {
191
+ readTask(() => {
192
+ this.sizeToContent = this.readSizeToContent();
193
+ });
194
+ }
178
195
  destroyFullscreenResizeObserver() {
179
196
  if (this.fullscreenResizeObserver !== undefined) {
180
197
  this.fullscreenResizeObserver.disconnect();
@@ -221,6 +238,30 @@ export class Content {
221
238
  const mode = getIonMode(this);
222
239
  return forceOverscroll === undefined ? mode === 'ios' && isPlatform('ios') : forceOverscroll;
223
240
  }
241
+ /**
242
+ * Reads whether to size the component to its content height. Forces a style
243
+ * recalculation, so it belongs in a read task or before the first render.
244
+ *
245
+ * This applies inside popovers and modals with a content-based `--height`,
246
+ * where the overlay does not provide the content with a definite height
247
+ * to fill.
248
+ *
249
+ * Only `--height` is consulted. Styling the wrapper directly, such as
250
+ * `ion-modal::part(content) { height: fit-content; }`, does not change
251
+ * `--height` and therefore cannot be observed. `--height` is the only
252
+ * supported way to opt into content-based sizing.
253
+ */
254
+ readSizeToContent() {
255
+ if (hostContext('ion-popover', this.el)) {
256
+ return true;
257
+ }
258
+ const modal = this.el.closest('ion-modal');
259
+ if (modal === null) {
260
+ return false;
261
+ }
262
+ const height = getComputedStyle(modal).getPropertyValue('--height');
263
+ return getOverlaySizeType(height) === 'content';
264
+ }
224
265
  resize() {
225
266
  /**
226
267
  * Only force update if the component is rendered in a browser context.
@@ -231,6 +272,12 @@ export class Content {
231
272
  * TODO: Remove if STENCIL-834 determines Stencil will account for this.
232
273
  */
233
274
  if (Build.isBrowser) {
275
+ /**
276
+ * A window resize can cross a media query that changes the modal's
277
+ * `--height`. The content's own offsets are unchanged, so neither branch
278
+ * below re-renders and the class from the last render would go stale.
279
+ */
280
+ this.updateSizeToContent();
234
281
  if (this.fullscreen) {
235
282
  readTask(() => this.readDimensions());
236
283
  }
@@ -241,13 +288,15 @@ export class Content {
241
288
  }
242
289
  }
243
290
  /**
244
- * Recalculate content dimensions. Called by overlays (e.g., popover) when
245
- * sibling elements like headers or footers have finished rendering and their
246
- * heights are available, ensuring accurate offset-top calculations.
291
+ * Recalculates the content dimensions and whether it should size itself to
292
+ * its content. Called by overlays when something they own changes, such as
293
+ * a header finishing its render or `--height` being updated.
294
+ *
247
295
  * @internal
248
296
  */
249
297
  async recalculateDimensions() {
250
298
  readTask(() => this.readDimensions());
299
+ this.updateSizeToContent();
251
300
  }
252
301
  readDimensions() {
253
302
  const page = getPageElement(this.el);
@@ -418,21 +467,21 @@ export class Content {
418
467
  const forceOverscroll = this.shouldForceOverscroll();
419
468
  const transitionShadow = mode === 'ios';
420
469
  this.resize();
421
- return (h(Host, { key: '9551c759df407b10d809171641fc6e8f14d92219', role: isMainContent ? 'main' : undefined, class: createColorClasses(this.color, {
470
+ return (h(Host, { key: 'e1013621096729354ef92915af52dd823e69fdff', role: isMainContent ? 'main' : undefined, class: createColorClasses(this.color, {
422
471
  [mode]: true,
423
472
  'content-fullscreen': this.fullscreen,
424
- 'content-sizing': hostContext('ion-popover', this.el),
473
+ 'content-sizing': this.sizeToContent,
425
474
  overscroll: forceOverscroll,
426
475
  [`content-${rtl}`]: true,
427
476
  }), style: {
428
477
  '--offset-top': `${this.cTop}px`,
429
478
  '--offset-bottom': `${this.cBottom}px`,
430
- }, ...inheritedAttributes }, h("div", { key: 'c6de8fd226f0d10a534eb107fe032ac155fbe68e', ref: (el) => (this.backgroundContentEl = el), id: "background-content", part: "background" }), fixedSlotPlacement === 'before' ? h("slot", { name: "fixed" }) : null, h("div", { key: '082fc2936061360060b48221ecb1c864a3711fa0', class: {
479
+ }, ...inheritedAttributes }, h("div", { key: '3d8649b164d6324beaa1bc50e1d204ad06c2ec1a', ref: (el) => (this.backgroundContentEl = el), id: "background-content", part: "background" }), fixedSlotPlacement === 'before' ? h("slot", { name: "fixed" }) : null, h("div", { key: 'dd2d3bed8690b4f5027a43f5ec60e7e7df18106d', class: {
431
480
  'inner-scroll': true,
432
481
  'scroll-x': scrollX,
433
482
  'scroll-y': scrollY,
434
483
  overscroll: (scrollX || scrollY) && forceOverscroll,
435
- }, ref: (scrollEl) => (this.scrollEl = scrollEl), onScroll: this.scrollEvents ? (ev) => this.onScroll(ev) : undefined, part: "scroll" }, h("slot", { key: '0d2286206facb22696a9ca7e74a3f6b7d2397aab' })), transitionShadow ? (h("div", { class: "transition-effect" }, h("div", { class: "transition-cover" }), h("div", { class: "transition-shadow" }))) : null, fixedSlotPlacement === 'after' ? h("slot", { name: "fixed" }) : null));
484
+ }, ref: (scrollEl) => (this.scrollEl = scrollEl), onScroll: this.scrollEvents ? (ev) => this.onScroll(ev) : undefined, part: "scroll" }, h("slot", { key: 'dc3d4584d9e9afd43699525a619b8e873078fbbf' })), transitionShadow ? (h("div", { class: "transition-effect" }, h("div", { class: "transition-cover" }), h("div", { class: "transition-shadow" }))) : null, fixedSlotPlacement === 'after' ? h("slot", { name: "fixed" }) : null));
436
485
  }
437
486
  static get is() { return "ion-content"; }
438
487
  static get encapsulation() { return "shadow"; }
@@ -595,6 +644,11 @@ export class Content {
595
644
  }
596
645
  };
597
646
  }
647
+ static get states() {
648
+ return {
649
+ "sizeToContent": {}
650
+ };
651
+ }
598
652
  static get events() {
599
653
  return [{
600
654
  "method": "ionScrollStart",
@@ -679,7 +733,7 @@ export class Content {
679
733
  "return": "Promise<void>"
680
734
  },
681
735
  "docs": {
682
- "text": "Recalculate content dimensions. Called by overlays (e.g., popover) when\nsibling elements like headers or footers have finished rendering and their\nheights are available, ensuring accurate offset-top calculations.",
736
+ "text": "Recalculates the content dimensions and whether it should size itself to\nits content. Called by overlays when something they own changes, such as\na header finishing its render or `--height` being updated.",
683
737
  "tags": [{
684
738
  "name": "internal",
685
739
  "text": undefined
@@ -77,7 +77,12 @@
77
77
  --max-width: auto;
78
78
  --height: 100%;
79
79
  --min-height: auto;
80
- --max-height: auto;
80
+ /**
81
+ * Clamps a content-sized `--height` (auto, fit-content, ...) to the
82
+ * overlay, giving the wrapper's flex children something to shrink
83
+ * toward so `ion-content` scrolls instead of overflowing.
84
+ */
85
+ --max-height: 100%;
81
86
  --overflow: hidden;
82
87
  --border-radius: 0;
83
88
  --border-width: 0;
@@ -129,8 +134,14 @@ ion-backdrop {
129
134
  /**
130
135
  * The wrapper receives programmatic focus for screen readers but should not
131
136
  * show a visible focus ring, which is meant only for keyboard navigation.
137
+ *
138
+ * A flex layout is required for the wrapper to size itself to its content
139
+ * when the modal is content-sized (`--height` is auto, fit-content, ...).
140
+ * This makes it so that the content can scroll when it overflows the wrapper.
132
141
  */
133
142
  .modal-wrapper {
143
+ display: flex;
144
+ flex-direction: column;
134
145
  outline: none;
135
146
  }
136
147
 
@@ -21,8 +21,8 @@ import { mdEnterAnimation } from "./animations/md.enter";
21
21
  import { mdLeaveAnimation } from "./animations/md.leave";
22
22
  import { createSheetGesture } from "./gestures/sheet";
23
23
  import { createSwipeToCloseGesture, SwipeToCloseDefaults } from "./gestures/swipe-to-close";
24
- import { getInitialSafeAreaConfig, getPositionBasedSafeAreaConfig, applySafeAreaOverrides, clearSafeAreaOverrides, getRootSafeAreaTop, onRootSafeAreaTopChange, hasCustomModalDimensions, } from "./safe-area-utils";
25
- import { setCardStatusBarDark, setCardStatusBarDefault } from "./utils";
24
+ import { getInitialSafeAreaConfig, getPositionBasedSafeAreaConfig, applySafeAreaOverrides, clearSafeAreaOverrides, getRootSafeAreaTop, onRootSafeAreaTopChange, getModalCoveredAxes, } from "./safe-area-utils";
25
+ import { onModalHeightChange, setCardStatusBarDark, setCardStatusBarDefault } from "./utils";
26
26
  // TODO(FW-2832): types
27
27
  /**
28
28
  * @virtualProp {"ios" | "md"} mode - The mode determines which platform styles to use.
@@ -1053,7 +1053,7 @@ export class Modal {
1053
1053
  /**
1054
1054
  * Creates the context object for safe-area utilities.
1055
1055
  *
1056
- * `hasCustomDimensions` is only set by `setInitialSafeAreaOverrides()`
1056
+ * `coveredAxes` is only set by `setInitialSafeAreaOverrides()`
1057
1057
  * because it is only read by `getInitialSafeAreaConfig()`. Other callers
1058
1058
  * (resize handler, post-animation update, fullscreen-padding apply) would
1059
1059
  * pay a `getComputedStyle()` cost for a value they never consult.
@@ -1067,6 +1067,26 @@ export class Modal {
1067
1067
  currentBreakpoint: this.currentBreakpoint,
1068
1068
  };
1069
1069
  }
1070
+ /**
1071
+ * Keeps the content's sizing in sync with `--height`. The content reads the
1072
+ * property to determine whether it should size itself to its content, and
1073
+ * changes to `--height` on an ancestor or the root can change that behavior
1074
+ * without changing the modal itself.
1075
+ */
1076
+ watchHeightForContent() {
1077
+ /**
1078
+ * A sheet's height comes from its breakpoints, so its content never sizes
1079
+ * itself to `--height`. Watching it would cause the drag to recalculate on
1080
+ * every frame.
1081
+ */
1082
+ if (this.isSheetModal) {
1083
+ return;
1084
+ }
1085
+ this.unsubscribeHeightChange?.();
1086
+ this.unsubscribeHeightChange = onModalHeightChange(this.el, () => {
1087
+ this.el.querySelectorAll('ion-content').forEach((contentEl) => contentEl.recalculateDimensions());
1088
+ });
1089
+ }
1070
1090
  /**
1071
1091
  * Sets initial safe-area overrides before modal animation.
1072
1092
  * Called in present() before animation starts.
@@ -1080,10 +1100,11 @@ export class Modal {
1080
1100
  setInitialSafeAreaOverrides() {
1081
1101
  const context = {
1082
1102
  ...this.getSafeAreaContext(),
1083
- hasCustomDimensions: hasCustomModalDimensions(this.el),
1103
+ coveredAxes: getModalCoveredAxes(this.el),
1084
1104
  };
1085
1105
  const safeAreaConfig = getInitialSafeAreaConfig(context);
1086
1106
  applySafeAreaOverrides(this.el, safeAreaConfig);
1107
+ this.watchHeightForContent();
1087
1108
  // Set the internal offset property with the resolved root safe-area-top value
1088
1109
  if (context.isSheetModal) {
1089
1110
  this.updateSheetOffsetTop();
@@ -1203,6 +1224,8 @@ export class Modal {
1203
1224
  clearSafeAreaOverrides(this.el);
1204
1225
  this.unsubscribeRootSafeAreaTop?.();
1205
1226
  this.unsubscribeRootSafeAreaTop = undefined;
1227
+ this.unsubscribeHeightChange?.();
1228
+ this.unsubscribeHeightChange = undefined;
1206
1229
  // Remove internal sheet offset property
1207
1230
  this.el.style.removeProperty('--ion-modal-offset-top');
1208
1231
  const { contentEl } = this.findContentAndFooter();
@@ -1240,7 +1263,7 @@ export class Modal {
1240
1263
  const isCardModal = presentingElement !== undefined && mode === 'ios';
1241
1264
  const isHandleCycle = handleBehavior === 'cycle';
1242
1265
  const isSheetModalWithHandle = isSheetModal && showHandle;
1243
- return (h(Host, { key: '7c9c736052c5a788cf31040b6b2386dd9ea7454b', "no-router": true,
1266
+ return (h(Host, { key: '17a95bd7722bac2344bea041aff97db17f55c0cf', "no-router": true,
1244
1267
  // Allow the modal to be navigable when the handle is focusable
1245
1268
  tabIndex: isHandleCycle && isSheetModalWithHandle ? 0 : -1, ...htmlAttributes, style: {
1246
1269
  zIndex: `${20000 + this.overlayIndex}`,
@@ -1253,7 +1276,7 @@ export class Modal {
1253
1276
  'overlay-hidden': true,
1254
1277
  [FOCUS_TRAP_DISABLE_CLASS]: focusTrap === false,
1255
1278
  ...getClassMap(this.cssClass),
1256
- }, onIonBackdropTap: this.onBackdropTap, onIonModalDidPresent: this.onLifecycle, onIonModalWillPresent: this.onLifecycle, onIonModalWillDismiss: this.onLifecycle, onIonModalDidDismiss: this.onLifecycle, onFocus: this.onModalFocus }, h("ion-backdrop", { key: '01b5b5765fb3a32393c736065c824bf760728823', ref: (el) => (this.backdropEl = el), visible: this.showBackdrop, tappable: this.backdropDismiss, part: "backdrop" }), mode === 'ios' && h("div", { key: '40fa7727a0923f7d7461dd027f1511a6a148d84a', class: "modal-shadow" }), h("div", { key: '9af934b607f60795bd5bff7bee6eacfc9b14fa35',
1279
+ }, onIonBackdropTap: this.onBackdropTap, onIonModalDidPresent: this.onLifecycle, onIonModalWillPresent: this.onLifecycle, onIonModalWillDismiss: this.onLifecycle, onIonModalDidDismiss: this.onLifecycle, onFocus: this.onModalFocus }, h("ion-backdrop", { key: '9dab1ef4771c0d847ba2be8672afbaa2748517f3', ref: (el) => (this.backdropEl = el), visible: this.showBackdrop, tappable: this.backdropDismiss, part: "backdrop" }), mode === 'ios' && h("div", { key: '64af7ed1c5f552b61fc4b9387b926acc76c8a99a', class: "modal-shadow" }), h("div", { key: '7e76d77d5b2e8f0467bb793facf5aa86f8d01bbe',
1257
1280
  /*
1258
1281
  role and aria-modal must be used on the
1259
1282
  same element. They must also be set inside the
@@ -1266,9 +1289,9 @@ export class Modal {
1266
1289
  without the tabindex focus() would be a no-op and screen readers
1267
1290
  may not properly announce the dialog and its content when it opens.
1268
1291
  */
1269
- role: "dialog", ...inheritedAttributes, "aria-modal": "true", tabIndex: -1, class: "modal-wrapper ion-overlay-wrapper", part: "content", ref: (el) => (this.wrapperEl = el) }, showHandle && (h("button", { key: 'df84a6806413b13efc5b03c862edde83151579a7', class: "modal-handle",
1292
+ role: "dialog", ...inheritedAttributes, "aria-modal": "true", tabIndex: -1, class: "modal-wrapper ion-overlay-wrapper", part: "content", ref: (el) => (this.wrapperEl = el) }, showHandle && (h("button", { key: '5efc0bb0a59adcc594ac48da9fd90e57908a7ffb', class: "modal-handle",
1270
1293
  // Prevents the handle from receiving keyboard focus when it does not cycle
1271
- 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) })), h("slot", { key: '072d3929ec6f25481946b184d8ac24219011e783', onSlotchange: this.onSlotChange }))));
1294
+ 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) })), h("slot", { key: '6175fcd0b39c086b4e9eb9e96c4d631c2a86774b', onSlotchange: this.onSlotChange }))));
1272
1295
  }
1273
1296
  static get is() { return "ion-modal"; }
1274
1297
  static get encapsulation() { return "shadow"; }
@@ -77,7 +77,12 @@
77
77
  --max-width: auto;
78
78
  --height: 100%;
79
79
  --min-height: auto;
80
- --max-height: auto;
80
+ /**
81
+ * Clamps a content-sized `--height` (auto, fit-content, ...) to the
82
+ * overlay, giving the wrapper's flex children something to shrink
83
+ * toward so `ion-content` scrolls instead of overflowing.
84
+ */
85
+ --max-height: 100%;
81
86
  --overflow: hidden;
82
87
  --border-radius: 0;
83
88
  --border-width: 0;
@@ -129,8 +134,14 @@ ion-backdrop {
129
134
  /**
130
135
  * The wrapper receives programmatic focus for screen readers but should not
131
136
  * show a visible focus ring, which is meant only for keyboard navigation.
137
+ *
138
+ * A flex layout is required for the wrapper to size itself to its content
139
+ * when the modal is content-sized (`--height` is auto, fit-content, ...).
140
+ * This makes it so that the content can scroll when it overflows the wrapper.
132
141
  */
133
142
  .modal-wrapper {
143
+ display: flex;
144
+ flex-direction: column;
134
145
  outline: none;
135
146
  }
136
147