@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
@@ -2,41 +2,14 @@
2
2
  * (C) Ionic http://ionicframework.com - MIT License
3
3
  */
4
4
  import { win } from "../../utils/browser/index";
5
- import { raf } from "../../utils/helpers";
6
- /**
7
- * These thresholds match the SCSS media query breakpoints in modal.vars.scss
8
- * that trigger the centered dialog layout (non-fullscreen modal).
9
- *
10
- * SCSS defines two height breakpoints: $modal-inset-min-height-small (600px)
11
- * and $modal-inset-min-height-large (768px). We use the smaller one because
12
- * that's the threshold where the modal transitions from fullscreen to centered
13
- * dialog — the larger breakpoint only increases the dialog's height.
14
- */
15
- const MODAL_INSET_MIN_WIDTH = 768;
16
- const MODAL_INSET_MIN_HEIGHT = 600;
5
+ import { onCustomPropertyChange, raf } from "../../utils/helpers";
6
+ import { getOverlaySizeType } from "../../utils/overlays";
17
7
  const EDGE_THRESHOLD = 5;
18
- /**
19
- * CSS values for `--width` / `--height` that are treated as fullscreen
20
- * (modal touches the corresponding screen edges). Empty string means the
21
- * property was not overridden. See `hasCustomModalDimensions()`.
22
- */
23
- const FULLSCREEN_SIZE_VALUES = new Set(['', '100%', '100vw', '100vh', '100dvw', '100dvh', '100svw', '100svh']);
24
8
  /**
25
9
  * Cache for resolved root safe-area-top value, invalidated once per frame.
26
10
  */
27
11
  let cachedRootSafeAreaTop = null;
28
12
  let cacheInvalidationScheduled = false;
29
- /**
30
- * Determines if the current viewport meets the CSS media query conditions
31
- * that cause regular modals to render as centered dialogs instead of fullscreen.
32
- * Matches: @media (min-width: 768px) and (min-height: 600px)
33
- */
34
- const isCenteredDialogViewport = () => {
35
- if (!win)
36
- return false;
37
- return win.matchMedia(`(min-width: ${MODAL_INSET_MIN_WIDTH}px) and (min-height: ${MODAL_INSET_MIN_HEIGHT}px)`)
38
- .matches;
39
- };
40
13
  /**
41
14
  * Resolves the current root --ion-safe-area-top value to pixels.
42
15
  * Uses a temporary element because getComputedStyle on :root returns
@@ -70,55 +43,64 @@ export const getRootSafeAreaTop = () => {
70
43
  return value;
71
44
  };
72
45
  /**
73
- * Calls back when the resolved root `--ion-safe-area-top` changes, which no
74
- * event and no window resize covers. The probe's height tracks the variable, so
75
- * a change to it becomes a size change the observer can see.
46
+ * Calls back when the resolved root `--ion-safe-area-top` changes. The value
47
+ * the caller already applied is passed as the baseline, so a change between
48
+ * that read and the observer starting is still reported.
76
49
  */
77
50
  export const onRootSafeAreaTopChange = (callback) => {
78
- const doc = win?.document;
79
- if (!doc?.body || typeof ResizeObserver === 'undefined') {
80
- return () => undefined;
81
- }
82
- const probe = doc.createElement('div');
83
- probe.style.cssText =
84
- 'position:fixed;visibility:hidden;pointer-events:none;top:0;left:0;width:0;' +
85
- 'height:var(--ion-safe-area-top,0px);';
86
- doc.body.appendChild(probe);
87
- /**
88
- * Seeded with the value the caller has already applied, so a change that
89
- * lands before the observer's first delivery still gets reported. Comparing
90
- * against an unset value instead would consume that first delivery and treat
91
- * the new inset as the baseline.
92
- */
93
- let lastHeight = getRootSafeAreaTop();
94
- const observer = new ResizeObserver((entries) => {
95
- const { height } = entries[0].contentRect;
96
- if (height !== lastHeight) {
97
- lastHeight = height;
98
- callback(height);
99
- }
100
- });
101
- observer.observe(probe);
102
- return () => {
103
- observer.disconnect();
104
- probe.remove();
105
- };
51
+ return onCustomPropertyChange(win?.document?.body, '--ion-safe-area-top', callback, getRootSafeAreaTop());
106
52
  };
107
53
  /**
108
- * True when the modal host declares BOTH a non-fullscreen `--width` AND a
109
- * non-fullscreen `--height` (i.e. a centered-dialog-like modal that doesn't
110
- * touch any screen edge).
54
+ * Determines which viewport axes the modal spans so safe-area requirements
55
+ * can be predicted independently for each axis.
111
56
  *
112
- * The conservative "both axes" check avoids mis-zeroing safe-area for
113
- * partial-custom modals where the modal still touches top/bottom edges
114
- * (e.g. only `--width` overridden). Partial cases fall through to the
115
- * existing position-based post-animation correction.
57
+ * A modal that spans an axis reaches both edges on that axis and needs the
58
+ * corresponding safe-area insets. A modal that does not span an axis reaches
59
+ * neither edge on that axis.
60
+ *
61
+ * When both `--width` and `--height` are `fullscreen`, coverage can be
62
+ * determined directly. Otherwise, coverage is based on the rendered wrapper,
63
+ * including cases where content sizing or `--max-height` causes the modal
64
+ * to reach the viewport.
116
65
  */
117
- export const hasCustomModalDimensions = (hostEl) => {
66
+ export const getModalCoveredAxes = (hostEl) => {
118
67
  const styles = getComputedStyle(hostEl);
119
- const width = styles.getPropertyValue('--width').trim();
120
- const height = styles.getPropertyValue('--height').trim();
121
- return !FULLSCREEN_SIZE_VALUES.has(width) && !FULLSCREEN_SIZE_VALUES.has(height);
68
+ const width = getOverlaySizeType(styles.getPropertyValue('--width'));
69
+ const height = getOverlaySizeType(styles.getPropertyValue('--height'));
70
+ if (width === 'fullscreen' && height === 'fullscreen') {
71
+ return { vertical: true, horizontal: true };
72
+ }
73
+ return measureCoveredAxes(hostEl);
74
+ };
75
+ /**
76
+ * Measures the modal wrapper to determine whether it spans the viewport
77
+ * on each axis.
78
+ *
79
+ * The wrapper has no box while the modal is hidden, so `overlay-hidden`
80
+ * is temporarily removed to allow the wrapper to be measured. The class
81
+ * is restored in the same task before the browser can paint.
82
+ *
83
+ * Only the wrapper's size is measured. Its position is affected by the
84
+ * enter animation, which initially translates it by its own height, while
85
+ * the translation does not affect its measured size.
86
+ */
87
+ const measureCoveredAxes = (hostEl) => {
88
+ const wrapperEl = hostEl.shadowRoot?.querySelector('.modal-wrapper');
89
+ if (wrapperEl == null || win === undefined) {
90
+ return { vertical: false, horizontal: false };
91
+ }
92
+ const wasHidden = hostEl.classList.contains('overlay-hidden');
93
+ if (wasHidden) {
94
+ hostEl.classList.remove('overlay-hidden');
95
+ }
96
+ const { width, height } = wrapperEl.getBoundingClientRect();
97
+ if (wasHidden) {
98
+ hostEl.classList.add('overlay-hidden');
99
+ }
100
+ return {
101
+ vertical: height >= win.innerHeight - EDGE_THRESHOLD,
102
+ horizontal: width >= win.innerWidth - EDGE_THRESHOLD,
103
+ };
122
104
  };
123
105
  /**
124
106
  * Returns the initial safe-area configuration based on modal type.
@@ -152,26 +134,23 @@ export const getInitialSafeAreaConfig = (context) => {
152
134
  right: '0px',
153
135
  };
154
136
  }
155
- // On viewports that meet the centered dialog media query breakpoints,
156
- // regular modals render as centered dialogs (not fullscreen), so they
157
- // don't touch any screen edges and don't need safe-area insets. Also
158
- // applies to phone viewports when the modal declares custom --width and
159
- // --height; these don't touch screen edges either, so the initial
160
- // prediction must be zero to avoid a post-animation correction flash.
161
- if (isCenteredDialogViewport() || context.hasCustomDimensions) {
162
- return {
163
- top: '0px',
164
- bottom: '0px',
165
- left: '0px',
166
- right: '0px',
167
- };
168
- }
169
- // Fullscreen modals on phone - inherit all safe areas
137
+ /**
138
+ * Each axis is evaluated independently because a modal can span one axis
139
+ * without spanning the other. This allows the initial safe-area configuration
140
+ * to match the modal's expected dimensions and avoids correcting an incorrect
141
+ * pair of insets after presentation.
142
+ *
143
+ * A modal can span the horizontal axis while remaining inset vertically, or
144
+ * span the vertical axis while remaining inset horizontally. Wide viewports
145
+ * can also render regular modals as centered dialogs, while content-sized
146
+ * modals may still be clamped to the viewport.
147
+ */
148
+ const { vertical, horizontal } = context.coveredAxes ?? { vertical: true, horizontal: true };
170
149
  return {
171
- top: 'inherit',
172
- bottom: 'inherit',
173
- left: 'inherit',
174
- right: 'inherit',
150
+ top: vertical ? 'inherit' : '0px',
151
+ bottom: vertical ? 'inherit' : '0px',
152
+ left: horizontal ? 'inherit' : '0px',
153
+ right: horizontal ? 'inherit' : '0px',
175
154
  };
176
155
  };
177
156
  /**
@@ -2,6 +2,7 @@
2
2
  * (C) Ionic http://ionicframework.com - MIT License
3
3
  */
4
4
  import { win } from "../../utils/browser/index";
5
+ import { onCustomPropertyChange } from "../../utils/helpers";
5
6
  import { StatusBar, Style } from "../../utils/native/status-bar";
6
7
  /**
7
8
  * Use y = mx + b to
@@ -78,3 +79,9 @@ export const setCardStatusBarDefault = (defaultStyle = Style.Default) => {
78
79
  }
79
80
  StatusBar.setStyle({ style: defaultStyle });
80
81
  };
82
+ /**
83
+ * Calls back when the modal's resolved `--height` changes.
84
+ */
85
+ export const onModalHeightChange = (hostEl, callback) => {
86
+ return onCustomPropertyChange(hostEl, '--height', () => callback());
87
+ };
@@ -1,6 +1,7 @@
1
1
  /*!
2
2
  * (C) Ionic http://ionicframework.com - MIT License
3
3
  */
4
+ import { win } from "./browser/index";
4
5
  import { printIonError } from "./logging/index";
5
6
  import { isRTL } from "./rtl/index";
6
7
  export const transitionEndAsync = (el, expectedDuration = 0) => {
@@ -176,6 +177,44 @@ export const addEventListener = (el, eventName, callback, opts) => {
176
177
  export const removeEventListener = (el, eventName, callback, opts) => {
177
178
  return el.removeEventListener(eventName, callback, opts);
178
179
  };
180
+ /**
181
+ * Calls back when a CSS custom property that resolves to a length changes,
182
+ * which no event covers. The probe inherits the property from `hostEl` and
183
+ * uses it as its height, turning a property change into a size change that
184
+ * `ResizeObserver` can detect.
185
+ *
186
+ * The callback receives the probe's height. For length values, this matches
187
+ * the resolved property value. For other values, such as `fit-content`, the
188
+ * probe remains at zero, so the value only signals that the property changed.
189
+ * Percentages resolve against the probe's containing block, not the element
190
+ * where the property is ultimately used.
191
+ *
192
+ * Pass `initialValue` when the caller has already read the property so that
193
+ * changes occurring before the observer's first delivery are not missed.
194
+ * Without it, the first delivery establishes the baseline.
195
+ */
196
+ export const onCustomPropertyChange = (hostEl, property, callback, initialValue) => {
197
+ const doc = win?.document;
198
+ if (!doc || !hostEl || typeof ResizeObserver === 'undefined') {
199
+ return () => undefined;
200
+ }
201
+ const probe = doc.createElement('div');
202
+ probe.style.cssText = `position:fixed;visibility:hidden;pointer-events:none;top:0;left:0;width:0;height:var(${property},0px);`;
203
+ hostEl.appendChild(probe);
204
+ let lastHeight = initialValue;
205
+ const observer = new ResizeObserver((entries) => {
206
+ const { height } = entries[0].contentRect;
207
+ if (lastHeight !== undefined && height !== lastHeight) {
208
+ callback(height);
209
+ }
210
+ lastHeight = height;
211
+ });
212
+ observer.observe(probe);
213
+ return () => {
214
+ observer.disconnect();
215
+ probe.remove();
216
+ };
217
+ };
179
218
  /**
180
219
  * Gets the root context of a shadow dom element
181
220
  * On newer browsers this will be the shadowRoot,
@@ -764,6 +764,40 @@ export const safeCall = (handler, arg) => {
764
764
  }
765
765
  return undefined;
766
766
  };
767
+ /**
768
+ * `--width` and `--height` values that leave an overlay spanning the viewport
769
+ * on that axis, so it reaches both edges. An empty value means the property
770
+ * was never overridden.
771
+ */
772
+ const FULLSCREEN_SIZES = ['', '100%', '100vw', '100vh', '100dvw', '100dvh', '100svw', '100svh'];
773
+ /**
774
+ * `--width` and `--height` values that size an overlay to its content, leaving
775
+ * the rendered size dependent on the content and on `--max-width` or
776
+ * `--max-height`.
777
+ */
778
+ const CONTENT_SIZES = ['auto', 'fit-content', 'min-content', 'max-content'];
779
+ /**
780
+ * How an overlay's `--width` or `--height` determines its used size:
781
+ *
782
+ * `fullscreen` spans the viewport on that axis. `content` depends on the
783
+ * overlay's content, so its used size is not known until layout. `definite`
784
+ * resolves independently of the overlay's content size.
785
+ *
786
+ * Values are lowercased because CSS keywords are case-insensitive, while a
787
+ * custom property preserves the case in which it was authored. Content values
788
+ * are matched as a suffix so vendor-prefixed values such as `-moz-fit-content`
789
+ * are recognized.
790
+ */
791
+ export const getOverlaySizeType = (size) => {
792
+ const value = size.trim().toLowerCase();
793
+ if (FULLSCREEN_SIZES.includes(value)) {
794
+ return 'fullscreen';
795
+ }
796
+ if (CONTENT_SIZES.some((keyword) => value.endsWith(keyword))) {
797
+ return 'content';
798
+ }
799
+ return 'definite';
800
+ };
767
801
  export const BACKDROP = 'backdrop';
768
802
  export const GESTURE = 'gesture';
769
803
  export const OVERLAY_GESTURE_PRIORITY = 39;
package/dist/docs.json CHANGED
@@ -1,8 +1,8 @@
1
1
  {
2
- "timestamp": "2026-09-14T06:23:22",
2
+ "timestamp": "2026-09-16T06:18:51",
3
3
  "compiler": {
4
4
  "name": "@stencil/core",
5
- "version": "4.44.2",
5
+ "version": "4.45.0",
6
6
  "typescriptVersion": "5.8.3"
7
7
  },
8
8
  "components": [
@@ -1,8 +1,8 @@
1
1
  /*!
2
2
  * (C) Ionic http://ionicframework.com - MIT License
3
3
  */
4
- import { j as printIonError } from './index-C23AVPx9.js';
5
- import { w as win } from './index-ZjP4CjeZ.js';
4
+ import { j as printIonError } from './index-Dvqtt_WK.js';
5
+ import { w as win } from './helpers-BJFnZngp.js';
6
6
 
7
7
  let animationPrefix;
8
8
  const getAnimationPrefix = (el) => {
@@ -1,7 +1,7 @@
1
1
  /*!
2
2
  * (C) Ionic http://ionicframework.com - MIT License
3
3
  */
4
- import { i as initialize } from './ionic-global-ZXjCXKH0.js';
4
+ import { i as initialize } from './ionic-global-BSaFA7np.js';
5
5
 
6
6
  const appGlobalScript = initialize || (() => {});
7
7
  const globalScripts = appGlobalScript;
@@ -1,8 +1,8 @@
1
1
  /*!
2
2
  * (C) Ionic http://ionicframework.com - MIT License
3
3
  */
4
- import { w as writeTask } from './index-C23AVPx9.js';
5
- import { h as hapticSelectionEnd, a as hapticSelectionChanged, b as hapticSelectionStart } from './haptic-Cq4UAeka.js';
4
+ import { w as writeTask } from './index-Dvqtt_WK.js';
5
+ import { h as hapticSelectionEnd, a as hapticSelectionChanged, b as hapticSelectionStart } from './haptic-D3njgGLB.js';
6
6
  import { createGesture } from './index-BmLuEdV7.js';
7
7
 
8
8
  const createButtonActiveGesture = (el, isButton) => {
@@ -1,7 +1,7 @@
1
1
  /*!
2
2
  * (C) Ionic http://ionicframework.com - MIT License
3
3
  */
4
- import { w as win } from './index-ZjP4CjeZ.js';
4
+ import { w as win } from './helpers-BJFnZngp.js';
5
5
 
6
6
  const getCapacitor = () => {
7
7
  if (win !== undefined) {
@@ -1,7 +1,7 @@
1
1
  /*!
2
2
  * (C) Ionic http://ionicframework.com - MIT License
3
3
  */
4
- import { f as printIonWarning } from './index-C23AVPx9.js';
4
+ import { f as printIonWarning } from './index-Dvqtt_WK.js';
5
5
 
6
6
  /**
7
7
  * Returns true if the selected day is equal to the reference day
@@ -1,7 +1,7 @@
1
1
  /*!
2
2
  * (C) Ionic http://ionicframework.com - MIT License
3
3
  */
4
- import { c as componentOnReady } from './helpers-BSmc0nst.js';
4
+ import { c as componentOnReady } from './helpers-BJFnZngp.js';
5
5
 
6
6
  // TODO(FW-2832): types
7
7
  const attachComponent = async (delegate, container, component, cssClasses, componentProps, inline) => {
@@ -1,7 +1,7 @@
1
1
  /*!
2
2
  * (C) Ionic http://ionicframework.com - MIT License
3
3
  */
4
- import { g as getCapacitor } from './capacitor-CFERIeaU.js';
4
+ import { g as getCapacitor } from './capacitor-C041I3qZ.js';
5
5
 
6
6
  var ImpactStyle;
7
7
  (function (ImpactStyle) {
@@ -1,9 +1,12 @@
1
1
  /*!
2
2
  * (C) Ionic http://ionicframework.com - MIT License
3
3
  */
4
- import { j as printIonError } from './index-C23AVPx9.js';
4
+ import { j as printIonError } from './index-Dvqtt_WK.js';
5
5
  import { i as isRTL } from './dir-Dojwmvde.js';
6
6
 
7
+ const win = typeof window !== 'undefined' ? window : undefined;
8
+ const doc = typeof document !== 'undefined' ? document : undefined;
9
+
7
10
  const transitionEndAsync = (el, expectedDuration = 0) => {
8
11
  return new Promise((resolve) => {
9
12
  transitionEnd(el, expectedDuration, resolve);
@@ -174,6 +177,44 @@ const addEventListener = (el, eventName, callback, opts) => {
174
177
  const removeEventListener = (el, eventName, callback, opts) => {
175
178
  return el.removeEventListener(eventName, callback, opts);
176
179
  };
180
+ /**
181
+ * Calls back when a CSS custom property that resolves to a length changes,
182
+ * which no event covers. The probe inherits the property from `hostEl` and
183
+ * uses it as its height, turning a property change into a size change that
184
+ * `ResizeObserver` can detect.
185
+ *
186
+ * The callback receives the probe's height. For length values, this matches
187
+ * the resolved property value. For other values, such as `fit-content`, the
188
+ * probe remains at zero, so the value only signals that the property changed.
189
+ * Percentages resolve against the probe's containing block, not the element
190
+ * where the property is ultimately used.
191
+ *
192
+ * Pass `initialValue` when the caller has already read the property so that
193
+ * changes occurring before the observer's first delivery are not missed.
194
+ * Without it, the first delivery establishes the baseline.
195
+ */
196
+ const onCustomPropertyChange = (hostEl, property, callback, initialValue) => {
197
+ const doc = win?.document;
198
+ if (!doc || !hostEl || typeof ResizeObserver === 'undefined') {
199
+ return () => undefined;
200
+ }
201
+ const probe = doc.createElement('div');
202
+ probe.style.cssText = `position:fixed;visibility:hidden;pointer-events:none;top:0;left:0;width:0;height:var(${property},0px);`;
203
+ hostEl.appendChild(probe);
204
+ let lastHeight = initialValue;
205
+ const observer = new ResizeObserver((entries) => {
206
+ const { height } = entries[0].contentRect;
207
+ if (lastHeight !== undefined && height !== lastHeight) {
208
+ callback(height);
209
+ }
210
+ lastHeight = height;
211
+ });
212
+ observer.observe(probe);
213
+ return () => {
214
+ observer.disconnect();
215
+ probe.remove();
216
+ };
217
+ };
177
218
  /**
178
219
  * Gets the root context of a shadow dom element
179
220
  * On newer browsers this will be the shadowRoot,
@@ -340,4 +381,4 @@ const isSafeNumber = (input) => {
340
381
  return typeof input === 'number' && !isNaN(input) && isFinite(input);
341
382
  };
342
383
 
343
- export { renderHiddenInput as a, inheritAttributes as b, componentOnReady as c, debounceEvent as d, clamp as e, addEventListener as f, getElementRoot as g, hasLazyBuild as h, inheritAriaAttributes as i, isSafeNumber as j, hasShadowDom as k, assert as l, removeEventListener as m, focusVisibleElement as n, isEndSide as o, debounce as p, pointerCoord as q, raf as r, shallowEqualStringMap as s, transitionEndAsync as t };
384
+ export { renderHiddenInput as a, inheritAttributes as b, componentOnReady as c, debounceEvent as d, clamp as e, addEventListener as f, getElementRoot as g, hasLazyBuild as h, inheritAriaAttributes as i, isSafeNumber as j, hasShadowDom as k, assert as l, removeEventListener as m, doc as n, onCustomPropertyChange as o, focusVisibleElement as p, isEndSide as q, raf as r, debounce as s, transitionEndAsync as t, shallowEqualStringMap as u, pointerCoord as v, win as w };
@@ -1,8 +1,8 @@
1
1
  /*!
2
2
  * (C) Ionic http://ionicframework.com - MIT License
3
3
  */
4
- import { e as config, f as printIonWarning, w as writeTask, B as Build } from './index-C23AVPx9.js';
5
- import { r as raf } from './helpers-BSmc0nst.js';
4
+ import { e as config, f as printIonWarning, w as writeTask, B as Build } from './index-Dvqtt_WK.js';
5
+ import { r as raf } from './helpers-BJFnZngp.js';
6
6
 
7
7
  const LIFECYCLE_WILL_ENTER = 'ionViewWillEnter';
8
8
  const LIFECYCLE_DID_ENTER = 'ionViewDidEnter';
@@ -118,8 +118,8 @@ const createFocusController = () => {
118
118
  };
119
119
  const LAST_FOCUS = 'ion-last-focus';
120
120
 
121
- const iosTransitionAnimation = () => import('./ios.transition-CWAgfQ1r.js');
122
- const mdTransitionAnimation = () => import('./md.transition-ZuqDDdDW.js');
121
+ const iosTransitionAnimation = () => import('./ios.transition-ofa92pAl.js');
122
+ const mdTransitionAnimation = () => import('./md.transition-DnFfqsAv.js');
123
123
  const focusController = createFocusController();
124
124
  // TODO(FW-2832): types
125
125
  /**
@@ -1,7 +1,7 @@
1
1
  /*!
2
2
  * (C) Ionic http://ionicframework.com - MIT License
3
3
  */
4
- import { f as printIonWarning, j as printIonError } from './index-C23AVPx9.js';
4
+ import { f as printIonWarning, j as printIonError } from './index-Dvqtt_WK.js';
5
5
 
6
6
  /**
7
7
  * Sanitize an untrusted HTML string.
@@ -1,9 +1,8 @@
1
1
  /*!
2
2
  * (C) Ionic http://ionicframework.com - MIT License
3
3
  */
4
- import { d as doc } from './index-ZjP4CjeZ.js';
5
- import { q as pointerCoord } from './helpers-BSmc0nst.js';
6
- import './index-C23AVPx9.js';
4
+ import { n as doc, v as pointerCoord } from './helpers-BJFnZngp.js';
5
+ import './index-Dvqtt_WK.js';
7
6
  import './dir-Dojwmvde.js';
8
7
 
9
8
  const startTapClick = (config) => {
@@ -141,7 +141,7 @@ const printRequiredElementError = (el, ...targetSelectors) => {
141
141
  };
142
142
 
143
143
  /*
144
- Stencil Client Platform v4.44.2 | MIT Licensed | https://stenciljs.com
144
+ Stencil Client Platform v4.45.0 | MIT Licensed | https://stenciljs.com
145
145
  */
146
146
 
147
147
  var Build = {
@@ -2511,7 +2511,7 @@ var updateChildren = (parentElm, oldCh, newVNode2, newCh, isInitialRender = fals
2511
2511
  if (idxInOld >= 0) {
2512
2512
  elmToMove = oldCh[idxInOld];
2513
2513
  if (elmToMove.$tag$ !== newStartVnode.$tag$) {
2514
- node = createElm(oldCh && oldCh[newStartIdx], newVNode2, idxInOld);
2514
+ node = createElm(oldCh && oldCh[newStartIdx], newVNode2, newStartIdx);
2515
2515
  } else {
2516
2516
  patch(elmToMove, newStartVnode, isInitialRender);
2517
2517
  oldCh[idxInOld] = void 0;
@@ -3180,21 +3180,26 @@ var proxyComponent = (Cstr, cmpMeta, flags) => {
3180
3180
  }
3181
3181
  return;
3182
3182
  }
3183
- const setterSetVal = () => {
3183
+ const parsedValue = parsePropertyValue(
3184
+ newValue,
3185
+ memberFlags);
3186
+ const setterSetVal = (val) => {
3184
3187
  const currentValue = ref.$lazyInstance$[memberName];
3185
3188
  if (!ref.$instanceValues$.get(memberName) && currentValue) {
3186
3189
  ref.$instanceValues$.set(memberName, currentValue);
3187
3190
  }
3188
- ref.$lazyInstance$[memberName] = parsePropertyValue(
3189
- newValue,
3190
- memberFlags);
3191
+ ref.$lazyInstance$[memberName] = val;
3191
3192
  setValue(this, memberName, ref.$lazyInstance$[memberName], cmpMeta);
3192
3193
  };
3193
3194
  if (ref.$lazyInstance$) {
3194
- setterSetVal();
3195
+ setterSetVal(parsedValue);
3195
3196
  } else {
3197
+ ref.$instanceValues$.set(memberName, parsedValue);
3196
3198
  ref.$fetchedCbList$.push(() => {
3197
- setterSetVal();
3199
+ const pendingValue = ref.$instanceValues$.get(memberName);
3200
+ if (ref.$lazyInstance$[memberName] !== pendingValue) {
3201
+ setterSetVal(pendingValue);
3202
+ }
3198
3203
  });
3199
3204
  }
3200
3205
  }
@@ -1,12 +1,11 @@
1
1
  /*!
2
2
  * (C) Ionic http://ionicframework.com - MIT License
3
3
  */
4
- import { d as doc } from './index-ZjP4CjeZ.js';
5
- import { MENU_BACK_BUTTON_PRIORITY } from './hardware-back-button-DmkiRgOT.js';
6
- import { f as printIonWarning } from './index-C23AVPx9.js';
7
- import { c as componentOnReady } from './helpers-BSmc0nst.js';
8
- import { b as getIonMode } from './ionic-global-ZXjCXKH0.js';
9
- import { c as createAnimation } from './animation-BFNVlYum.js';
4
+ import { n as doc, c as componentOnReady } from './helpers-BJFnZngp.js';
5
+ import { M as MENU_BACK_BUTTON_PRIORITY } from './overlays-a_5AhqWk.js';
6
+ import { f as printIonWarning } from './index-Dvqtt_WK.js';
7
+ import { b as getIonMode } from './ionic-global-BSaFA7np.js';
8
+ import { c as createAnimation } from './animation-CAzXJ2I1.js';
10
9
 
11
10
  /**
12
11
  * baseAnimation
@@ -1,8 +1,8 @@
1
1
  /*!
2
2
  * (C) Ionic http://ionicframework.com - MIT License
3
3
  */
4
- import { c as componentOnReady } from './helpers-BSmc0nst.js';
5
- import { t as printRequiredElementError } from './index-C23AVPx9.js';
4
+ import { c as componentOnReady } from './helpers-BJFnZngp.js';
5
+ import { t as printRequiredElementError } from './index-Dvqtt_WK.js';
6
6
 
7
7
  const ION_CONTENT_TAG_NAME = 'ION-CONTENT';
8
8
  const ION_CONTENT_ELEMENT_SELECTOR = 'ion-content';
package/dist/esm/index.js CHANGED
@@ -1,25 +1,23 @@
1
1
  /*!
2
2
  * (C) Ionic http://ionicframework.com - MIT License
3
3
  */
4
- export { c as createAnimation } from './animation-BFNVlYum.js';
5
- export { a as LIFECYCLE_DID_ENTER, c as LIFECYCLE_DID_LEAVE, L as LIFECYCLE_WILL_ENTER, b as LIFECYCLE_WILL_LEAVE, d as LIFECYCLE_WILL_UNLOAD, g as getIonPageElement } from './index-DnA_7Bnx.js';
6
- export { iosTransitionAnimation } from './ios.transition-CWAgfQ1r.js';
7
- export { mdTransitionAnimation } from './md.transition-ZuqDDdDW.js';
4
+ export { c as createAnimation } from './animation-CAzXJ2I1.js';
5
+ export { a as LIFECYCLE_DID_ENTER, c as LIFECYCLE_DID_LEAVE, L as LIFECYCLE_WILL_ENTER, b as LIFECYCLE_WILL_LEAVE, d as LIFECYCLE_WILL_UNLOAD, g as getIonPageElement } from './index-CdoVp_rZ.js';
6
+ export { iosTransitionAnimation } from './ios.transition-ofa92pAl.js';
7
+ export { mdTransitionAnimation } from './md.transition-DnFfqsAv.js';
8
8
  export { g as getTimeGivenProgression } from './cubic-bezier-hHmYLOfE.js';
9
9
  export { createGesture } from './index-BmLuEdV7.js';
10
- export { g as getPlatforms, i as initialize, a as isPlatform } from './ionic-global-ZXjCXKH0.js';
11
- export { c as componentOnReady } from './helpers-BSmc0nst.js';
12
- export { L as LogLevel } from './index-C23AVPx9.js';
13
- export { I as IonicSafeString } from './index-D76bbuoi.js';
10
+ export { g as getPlatforms, i as initialize, a as isPlatform } from './ionic-global-BSaFA7np.js';
11
+ export { c as componentOnReady } from './helpers-BJFnZngp.js';
12
+ export { L as LogLevel } from './index-Dvqtt_WK.js';
13
+ export { I as IonicSafeString } from './index-DmnOg_xm.js';
14
14
  export { g as getMode, s as setupConfig } from './config-DWCzVL3Y.js';
15
15
  export { o as openURL } from './theme-byZM6qHV.js';
16
- export { m as menuController } from './index-BuPaALjU.js';
17
- export { b as actionSheetController, a as alertController, l as loadingController, m as modalController, p as popoverController, t as toastController } from './overlays-DKE0DgvE.js';
18
- import './index-ZjP4CjeZ.js';
16
+ export { m as menuController } from './index-iurdcGHg.js';
17
+ export { b as actionSheetController, a as alertController, l as loadingController, m as modalController, p as popoverController, t as toastController } from './overlays-a_5AhqWk.js';
19
18
  import './gesture-controller-B_gJaBk0.js';
20
19
  import './dir-Dojwmvde.js';
21
- import './hardware-back-button-DmkiRgOT.js';
22
- import './framework-delegate-BwNhx9NR.js';
20
+ import './framework-delegate-CUDbUfWS.js';
23
21
 
24
22
  const IonicSlides = (opts) => {
25
23
  const { swiper, extendParams } = opts;
@@ -1,13 +1,12 @@
1
1
  /*!
2
2
  * (C) Ionic http://ionicframework.com - MIT License
3
3
  */
4
- import { w as win, d as doc } from './index-ZjP4CjeZ.js';
5
- import { g as getScrollElement, h as scrollByPoint, a as findClosestIonContent } from './index-C1b9CLFg.js';
6
- import { f as addEventListener, m as removeEventListener, c as componentOnReady } from './helpers-BSmc0nst.js';
7
- import { a as KeyboardResize, K as Keyboard } from './keyboard-DAF8GNJ9.js';
8
- import './index-C23AVPx9.js';
4
+ import { f as addEventListener, m as removeEventListener, w as win, n as doc, c as componentOnReady } from './helpers-BJFnZngp.js';
5
+ import { g as getScrollElement, h as scrollByPoint, a as findClosestIonContent } from './index-obGyiHiO.js';
6
+ import { a as KeyboardResize, K as Keyboard } from './keyboard-Cz4hUjuj.js';
7
+ import './index-Dvqtt_WK.js';
9
8
  import './dir-Dojwmvde.js';
10
- import './capacitor-CFERIeaU.js';
9
+ import './capacitor-C041I3qZ.js';
11
10
 
12
11
  const cloneMap = new WeakMap();
13
12
  const relocateInput = (componentEl, inputEl, shouldRelocate, inputRelativeY = 0, disabledClonedInput = false) => {