@ionic/core 9.0.1-nightly.20260825 → 9.0.1

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 (429) 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-CpYeYl3u.js → p-1sJ0ZDPe.js} +1 -1
  99. package/components/{p-RRH-7cpd.js → p-5ldEpNdG.js} +1 -1
  100. package/{dist/ionic/p-CoEa7CiN.js → components/p-6ZLn6K5e.js} +1 -1
  101. package/components/{p-BqE7e5gH.js → p-B4lxwJ8N.js} +1 -1
  102. package/components/{p-BAJ7NctL.js → p-BF48Oc0v.js} +1 -1
  103. package/components/{p-C8mPeq0D.js → p-BJr2B5hZ.js} +1 -1
  104. package/components/p-BNBnVi_1.js +4 -0
  105. package/components/p-BNIsryb2.js +4 -0
  106. package/components/{p-CJTKYpZv.js → p-BQyuFxYc.js} +1 -1
  107. package/components/{p-QgdyH-Zs.js → p-BT9-hMMz.js} +1 -1
  108. package/components/{p-BE9noJ1O.js → p-BWoa-cki.js} +1 -1
  109. package/components/{p-C12SAK00.js → p-BYJRZKHa.js} +1 -1
  110. package/{dist/ionic/p-DoUx_N0R.js → components/p-BgkOsq-d.js} +1 -1
  111. package/components/{p-BhlP16sB.js → p-Bi-it1EH.js} +1 -1
  112. package/components/p-C-NbvXu4.js +4 -0
  113. package/components/{p-Dcxr2vKX.js → p-C0493tbX.js} +1 -1
  114. package/components/{p-mXsQnyWB.js → p-C09TXohi.js} +1 -1
  115. package/{dist/ionic/p-C10K-FJg.js → components/p-C4VpVfrJ.js} +1 -1
  116. package/components/p-CG_zZq_I.js +4 -0
  117. package/components/{p-7qDu1bID.js → p-CJgnoKcN.js} +1 -1
  118. package/components/{p-CEkamjav.js → p-CMRYD_yR.js} +1 -1
  119. package/components/{p-CyKlfXdt.js → p-CNLioZ3B.js} +1 -1
  120. package/components/{p-CBhGZ6rF.js → p-COO0eJOA.js} +1 -1
  121. package/components/p-CWAks_S_.js +4 -0
  122. package/components/p-CWuIRJQN.js +4 -0
  123. package/components/{p-Bcm-GVQM.js → p-Cd1WaN-0.js} +1 -1
  124. package/components/{p-DMkSsriG.js → p-CqbGBmqb.js} +1 -1
  125. package/components/p-CrAKlX71.js +4 -0
  126. package/components/{p-CdSLe3Q3.js → p-Cw6WocLJ.js} +1 -1
  127. package/components/{p-CDKY4TZ_.js → p-D5w_FlVa.js} +1 -1
  128. package/{dist/ionic/p-wdSUbx5C.js → components/p-D7wDJdFn.js} +1 -1
  129. package/components/p-DFLJvuRK.js +4 -0
  130. package/components/p-DGPjJNOU.js +4 -0
  131. package/components/p-DJR0R0e1.js +4 -0
  132. package/components/{p-l-zxxFre.js → p-DL13ieTa.js} +1 -1
  133. package/components/{p-BWHBdLfY.js → p-DM1gJSMP.js} +1 -1
  134. package/components/{p-CLZPNP7x.js → p-DMBiAyOR.js} +1 -1
  135. package/components/{p-VTfnz_8u.js → p-DZRZic9C.js} +1 -1
  136. package/components/{p-CQxPXWNM.js → p-DhNuxvJH.js} +1 -1
  137. package/components/p-DiuOa1vw.js +4 -0
  138. package/components/{p-DkEb3SCT.js → p-Dj40C8gm.js} +1 -1
  139. package/components/p-DnBNYc7u.js +4 -0
  140. package/components/{p-D6dNJoqU.js → p-DngGb-NV.js} +1 -1
  141. package/components/{p-BFwL2yyK.js → p-DxhHlJln.js} +1 -1
  142. package/components/{p-COxY7PLK.js → p-GGbIHyEF.js} +1 -1
  143. package/components/{p-B2L09UOs.js → p-Hp8t4RMX.js} +1 -1
  144. package/components/{p-D6PwfJ9F.js → p-M34T2gyX.js} +1 -1
  145. package/components/{p-5rFO7X8J.js → p-TWw4e4sO.js} +1 -1
  146. package/components/p-YjMkHuvH.js +4 -0
  147. package/components/{p-CB06XtlF.js → p-cEN43Ahr.js} +1 -1
  148. package/{dist/ionic/p-BpG7jkT9.js → components/p-qAXsfUff.js} +1 -1
  149. package/dist/cjs/{animation-ihPP_z2n.js → animation-Kd1N7WTN.js} +1 -1
  150. package/dist/cjs/{app-globals-BlkzA410.js → app-globals-b1G4t26O.js} +1 -1
  151. package/dist/cjs/{button-active-ItGBjzmO.js → button-active-CQCFubJJ.js} +1 -1
  152. package/dist/cjs/{format-CPIqtp4x.js → format-bHU8N1g5.js} +1 -1
  153. package/dist/cjs/{framework-delegate-DhyWUPGg.js → framework-delegate-d-fWfeI6.js} +1 -1
  154. package/dist/cjs/{hardware-back-button-D5f_kASb.js → hardware-back-button-Bu4Dzw8l.js} +1 -1
  155. package/dist/cjs/{helpers-BCLkFTTd.js → helpers-7wzdhdeg.js} +1 -1
  156. package/dist/cjs/{index-BocV_y-c.js → index-BbqUBe2T.js} +1 -1
  157. package/dist/cjs/{index-xum7jdbq.js → index-C74Q3t6a.js} +2 -2
  158. package/dist/cjs/{index-CldjPPyP.js → index-CQfEIyLK.js} +4 -4
  159. package/dist/cjs/{index-BcyiqD6R.js → index-DFNrCX7M.js} +5 -5
  160. package/dist/cjs/{index-Bgz6BcKx.js → index-DXoo08JC.js} +9 -2
  161. package/dist/cjs/{index-49DTLc_Z.js → index-DtvKGwdh.js} +2 -2
  162. package/dist/cjs/index.cjs.js +12 -12
  163. package/dist/cjs/{input-shims-Jisy7U7-.js → input-shims-VJIiKBKv.js} +3 -3
  164. package/dist/cjs/{input.utils-BDTpGrfn.js → input.utils-EHVE2RK_.js} +1 -1
  165. package/dist/cjs/ion-accordion_2.cjs.entry.js +3 -3
  166. package/dist/cjs/ion-action-sheet.cjs.entry.js +45 -29
  167. package/dist/cjs/ion-alert.cjs.entry.js +29 -21
  168. package/dist/cjs/ion-app_8.cjs.entry.js +12 -12
  169. package/dist/cjs/ion-avatar_3.cjs.entry.js +2 -2
  170. package/dist/cjs/ion-back-button.cjs.entry.js +3 -3
  171. package/dist/cjs/ion-backdrop.cjs.entry.js +2 -2
  172. package/dist/cjs/ion-breadcrumb_2.cjs.entry.js +3 -3
  173. package/dist/cjs/ion-button_2.cjs.entry.js +3 -3
  174. package/dist/cjs/ion-card_5.cjs.entry.js +3 -3
  175. package/dist/cjs/ion-checkbox.cjs.entry.js +4 -4
  176. package/dist/cjs/ion-chip.cjs.entry.js +2 -2
  177. package/dist/cjs/ion-col_3.cjs.entry.js +2 -2
  178. package/dist/cjs/ion-datetime-button.cjs.entry.js +4 -4
  179. package/dist/cjs/ion-datetime.cjs.entry.js +7 -7
  180. package/dist/cjs/ion-fab_3.cjs.entry.js +3 -3
  181. package/dist/cjs/ion-img.cjs.entry.js +3 -3
  182. package/dist/cjs/ion-infinite-scroll_2.cjs.entry.js +5 -5
  183. package/dist/cjs/ion-input-otp.cjs.entry.js +3 -3
  184. package/dist/cjs/ion-input-password-toggle.cjs.entry.js +2 -2
  185. package/dist/cjs/ion-input.cjs.entry.js +5 -5
  186. package/dist/cjs/ion-item-option_3.cjs.entry.js +4 -4
  187. package/dist/cjs/ion-item_8.cjs.entry.js +3 -3
  188. package/dist/cjs/ion-loading.cjs.entry.js +14 -10
  189. package/dist/cjs/ion-menu_3.cjs.entry.js +8 -8
  190. package/dist/cjs/ion-modal.cjs.entry.js +83 -30
  191. package/dist/cjs/ion-nav_2.cjs.entry.js +6 -6
  192. package/dist/cjs/ion-picker-column-option.cjs.entry.js +3 -3
  193. package/dist/cjs/ion-picker-column.cjs.entry.js +3 -3
  194. package/dist/cjs/ion-picker.cjs.entry.js +2 -2
  195. package/dist/cjs/ion-popover.cjs.entry.js +23 -10
  196. package/dist/cjs/ion-progress-bar.cjs.entry.js +3 -3
  197. package/dist/cjs/ion-radio_2.cjs.entry.js +4 -4
  198. package/dist/cjs/ion-range.cjs.entry.js +4 -4
  199. package/dist/cjs/ion-refresher_2.cjs.entry.js +6 -6
  200. package/dist/cjs/ion-reorder_2.cjs.entry.js +4 -4
  201. package/dist/cjs/ion-ripple-effect.cjs.entry.js +2 -2
  202. package/dist/cjs/ion-route_4.cjs.entry.js +4 -4
  203. package/dist/cjs/ion-searchbar.cjs.entry.js +3 -3
  204. package/dist/cjs/ion-segment-content.cjs.entry.js +1 -1
  205. package/dist/cjs/ion-segment-view.cjs.entry.js +1 -1
  206. package/dist/cjs/ion-segment_2.cjs.entry.js +3 -3
  207. package/dist/cjs/ion-select-modal.cjs.entry.js +8 -8
  208. package/dist/cjs/ion-select_3.cjs.entry.js +9 -9
  209. package/dist/cjs/ion-spinner.cjs.entry.js +2 -2
  210. package/dist/cjs/ion-split-pane.cjs.entry.js +2 -2
  211. package/dist/cjs/ion-tab-bar_2.cjs.entry.js +3 -3
  212. package/dist/cjs/ion-tab_2.cjs.entry.js +3 -3
  213. package/dist/cjs/ion-text.cjs.entry.js +2 -2
  214. package/dist/cjs/ion-textarea.cjs.entry.js +5 -5
  215. package/dist/cjs/ion-toast.cjs.entry.js +8 -8
  216. package/dist/cjs/ion-toggle.cjs.entry.js +4 -4
  217. package/dist/cjs/{ionic-global-BMU-Us1Q.js → ionic-global-CYJNT-2P.js} +1 -1
  218. package/dist/cjs/ionic.cjs.js +4 -4
  219. package/dist/cjs/{ios.transition-OCcCN--B.js → ios.transition-DYGiD6gM.js} +4 -4
  220. package/dist/cjs/{item-multiple-inputs-BH9yPC66.js → item-multiple-inputs-Dv6qrMhm.js} +1 -1
  221. package/dist/cjs/loader.cjs.js +3 -3
  222. package/dist/cjs/{md.transition-D0o2IIbo.js → md.transition-CrSkaoz6.js} +4 -4
  223. package/dist/cjs/{overlays-hCtsdAvn.js → overlays-BR21NUIG.js} +59 -34
  224. package/dist/cjs/{select-option-render-BPjGDlsG.js → select-option-render-CrbLc-1j.js} +2 -2
  225. package/dist/cjs/{slot-mutation-controller-IQ250LoG.js → slot-mutation-controller-D6IjSEIh.js} +1 -1
  226. package/dist/cjs/{status-tap-Bakl9czs.js → status-tap-CNP5eD1R.js} +3 -3
  227. package/dist/cjs/{swipe-back-Cv4OZVJ5.js → swipe-back-BYb_nLJe.js} +2 -2
  228. package/dist/collection/collection-manifest.json +1 -1
  229. package/dist/collection/components/action-sheet/action-sheet.js +36 -20
  230. package/dist/collection/components/alert/alert.js +20 -12
  231. package/dist/collection/components/loading/loading.js +7 -3
  232. package/dist/collection/components/modal/modal.js +75 -22
  233. package/dist/collection/components/popover/popover.js +16 -3
  234. package/dist/collection/utils/overlays.js +53 -29
  235. package/dist/collection/utils/test/playwright/detach-reattach.js +23 -0
  236. package/dist/collection/utils/test/playwright/index.js +1 -0
  237. package/dist/docs.json +2 -2
  238. package/dist/esm/{animation-B6KGUJwl.js → animation-BFNVlYum.js} +1 -1
  239. package/dist/esm/{app-globals-BvutUX8P.js → app-globals-BgX0BGL1.js} +1 -1
  240. package/dist/esm/{button-active-DRNebs9r.js → button-active-BfOvDr3b.js} +1 -1
  241. package/dist/esm/{format-BF3btM7P.js → format-DDFE9jM5.js} +1 -1
  242. package/dist/esm/{framework-delegate-60cEIAgt.js → framework-delegate-BwNhx9NR.js} +1 -1
  243. package/dist/esm/{hardware-back-button-rhkwRNk2.js → hardware-back-button-DmkiRgOT.js} +1 -1
  244. package/dist/esm/{helpers-DLLANtRS.js → helpers-BSmc0nst.js} +1 -1
  245. package/dist/esm/{index-D_7MeuVD.js → index-BuPaALjU.js} +5 -5
  246. package/dist/esm/{index-DOrtAUWV.js → index-C1b9CLFg.js} +2 -2
  247. package/dist/esm/{index-h81G-QbJ.js → index-C23AVPx9.js} +9 -2
  248. package/dist/esm/{index-Bl4BUvBL.js → index-CJln0gS3.js} +2 -2
  249. package/dist/esm/{index-JgU5uTSY.js → index-CqoUoxgG.js} +1 -1
  250. package/dist/esm/{index-BZHVn0iF.js → index-DnA_7Bnx.js} +4 -4
  251. package/dist/esm/index.js +12 -12
  252. package/dist/esm/{input-shims-C2ipc_XX.js → input-shims-Dqk-Ou25.js} +3 -3
  253. package/dist/esm/{input.utils-D-qoPjqr.js → input.utils-rqoH22pW.js} +1 -1
  254. package/dist/esm/ion-accordion_2.entry.js +3 -3
  255. package/dist/esm/ion-action-sheet.entry.js +45 -29
  256. package/dist/esm/ion-alert.entry.js +29 -21
  257. package/dist/esm/ion-app_8.entry.js +12 -12
  258. package/dist/esm/ion-avatar_3.entry.js +2 -2
  259. package/dist/esm/ion-back-button.entry.js +3 -3
  260. package/dist/esm/ion-backdrop.entry.js +2 -2
  261. package/dist/esm/ion-breadcrumb_2.entry.js +3 -3
  262. package/dist/esm/ion-button_2.entry.js +3 -3
  263. package/dist/esm/ion-card_5.entry.js +3 -3
  264. package/dist/esm/ion-checkbox.entry.js +4 -4
  265. package/dist/esm/ion-chip.entry.js +2 -2
  266. package/dist/esm/ion-col_3.entry.js +2 -2
  267. package/dist/esm/ion-datetime-button.entry.js +4 -4
  268. package/dist/esm/ion-datetime.entry.js +7 -7
  269. package/dist/esm/ion-fab_3.entry.js +3 -3
  270. package/dist/esm/ion-img.entry.js +3 -3
  271. package/dist/esm/ion-infinite-scroll_2.entry.js +5 -5
  272. package/dist/esm/ion-input-otp.entry.js +3 -3
  273. package/dist/esm/ion-input-password-toggle.entry.js +2 -2
  274. package/dist/esm/ion-input.entry.js +5 -5
  275. package/dist/esm/ion-item-option_3.entry.js +4 -4
  276. package/dist/esm/ion-item_8.entry.js +3 -3
  277. package/dist/esm/ion-loading.entry.js +14 -10
  278. package/dist/esm/ion-menu_3.entry.js +8 -8
  279. package/dist/esm/ion-modal.entry.js +83 -30
  280. package/dist/esm/ion-nav_2.entry.js +6 -6
  281. package/dist/esm/ion-picker-column-option.entry.js +3 -3
  282. package/dist/esm/ion-picker-column.entry.js +3 -3
  283. package/dist/esm/ion-picker.entry.js +2 -2
  284. package/dist/esm/ion-popover.entry.js +23 -10
  285. package/dist/esm/ion-progress-bar.entry.js +3 -3
  286. package/dist/esm/ion-radio_2.entry.js +4 -4
  287. package/dist/esm/ion-range.entry.js +4 -4
  288. package/dist/esm/ion-refresher_2.entry.js +6 -6
  289. package/dist/esm/ion-reorder_2.entry.js +4 -4
  290. package/dist/esm/ion-ripple-effect.entry.js +2 -2
  291. package/dist/esm/ion-route_4.entry.js +4 -4
  292. package/dist/esm/ion-searchbar.entry.js +3 -3
  293. package/dist/esm/ion-segment-content.entry.js +1 -1
  294. package/dist/esm/ion-segment-view.entry.js +1 -1
  295. package/dist/esm/ion-segment_2.entry.js +3 -3
  296. package/dist/esm/ion-select-modal.entry.js +8 -8
  297. package/dist/esm/ion-select_3.entry.js +9 -9
  298. package/dist/esm/ion-spinner.entry.js +2 -2
  299. package/dist/esm/ion-split-pane.entry.js +2 -2
  300. package/dist/esm/ion-tab-bar_2.entry.js +3 -3
  301. package/dist/esm/ion-tab_2.entry.js +3 -3
  302. package/dist/esm/ion-text.entry.js +2 -2
  303. package/dist/esm/ion-textarea.entry.js +5 -5
  304. package/dist/esm/ion-toast.entry.js +8 -8
  305. package/dist/esm/ion-toggle.entry.js +4 -4
  306. package/dist/esm/{ionic-global-B7I1sdvg.js → ionic-global-ZXjCXKH0.js} +1 -1
  307. package/dist/esm/ionic.js +5 -5
  308. package/dist/esm/{ios.transition-C-6IaIxe.js → ios.transition-CWAgfQ1r.js} +4 -4
  309. package/dist/esm/{item-multiple-inputs-DI91syHS.js → item-multiple-inputs-DZnIiOO_.js} +1 -1
  310. package/dist/esm/loader.js +4 -4
  311. package/dist/esm/{md.transition-dyqt0t0d.js → md.transition-ZuqDDdDW.js} +4 -4
  312. package/dist/esm/{overlays-CiFoZEq1.js → overlays-DKE0DgvE.js} +59 -35
  313. package/dist/esm/{select-option-render-CUJpruSC.js → select-option-render-1W6W9pbC.js} +2 -2
  314. package/dist/esm/{slot-mutation-controller-wFuztlVD.js → slot-mutation-controller-B5NpUZ-N.js} +1 -1
  315. package/dist/esm/{status-tap-Dn_42wiy.js → status-tap-Cv9gb3ja.js} +3 -3
  316. package/dist/esm/{swipe-back-CqOqrHW7.js → swipe-back-B2CmabKY.js} +2 -2
  317. package/dist/ionic/index.esm.js +1 -1
  318. package/dist/ionic/ionic.esm.js +1 -1
  319. package/dist/ionic/{p-e5a54d99.entry.js → p-06c6b540.entry.js} +1 -1
  320. package/dist/ionic/{p-dadcb3d2.entry.js → p-099b7f9f.entry.js} +1 -1
  321. package/dist/ionic/{p-e090eca3.entry.js → p-171a2278.entry.js} +1 -1
  322. package/dist/ionic/{p-2aabd568.entry.js → p-191a651e.entry.js} +1 -1
  323. package/dist/ionic/{p-1f66c230.entry.js → p-1f24cb24.entry.js} +1 -1
  324. package/dist/ionic/{p-83aa7d47.entry.js → p-271c3640.entry.js} +1 -1
  325. package/dist/ionic/{p-5dc53bdf.entry.js → p-2c52fe3e.entry.js} +1 -1
  326. package/dist/ionic/{p-da5a7bcd.entry.js → p-2ea4bb36.entry.js} +1 -1
  327. package/dist/ionic/{p-fe80ebb1.entry.js → p-338a02e0.entry.js} +1 -1
  328. package/dist/ionic/{p-326e0d05.entry.js → p-354d38d3.entry.js} +1 -1
  329. package/dist/ionic/{p-0b52d921.entry.js → p-38b9375b.entry.js} +1 -1
  330. package/dist/ionic/{p-a2fccdaa.entry.js → p-3bba83ee.entry.js} +1 -1
  331. package/dist/ionic/{p-cc749877.entry.js → p-4712a8a9.entry.js} +1 -1
  332. package/dist/ionic/{p-ca57763d.entry.js → p-4c3e50f8.entry.js} +1 -1
  333. package/dist/ionic/p-4e2fef42.entry.js +4 -0
  334. package/dist/ionic/{p-2ff12c8a.entry.js → p-54cbb0a7.entry.js} +1 -1
  335. package/dist/ionic/{p-5ed60413.entry.js → p-561af487.entry.js} +1 -1
  336. package/dist/ionic/{p-ecfc9c71.entry.js → p-5906ea6f.entry.js} +1 -1
  337. package/dist/ionic/{p-9f2d3987.entry.js → p-5cc09b40.entry.js} +1 -1
  338. package/dist/ionic/{p-9eba0d8a.entry.js → p-5d9094ac.entry.js} +1 -1
  339. package/dist/ionic/{p-986a1db8.entry.js → p-612ea3b1.entry.js} +1 -1
  340. package/dist/ionic/p-66f150ec.entry.js +4 -0
  341. package/dist/ionic/{p-d1539609.entry.js → p-68cc89a6.entry.js} +1 -1
  342. package/dist/ionic/{p-f607ad4f.entry.js → p-6e386853.entry.js} +1 -1
  343. package/dist/ionic/p-77c96e08.entry.js +4 -0
  344. package/dist/ionic/{p-9e688396.entry.js → p-7bfeccb3.entry.js} +1 -1
  345. package/dist/ionic/{p-6d84fa9f.entry.js → p-7e394cc3.entry.js} +1 -1
  346. package/dist/ionic/{p-fb4dabbb.entry.js → p-7fbb3319.entry.js} +1 -1
  347. package/dist/ionic/{p-7c859f42.entry.js → p-85599fe3.entry.js} +1 -1
  348. package/dist/ionic/{p-53ba5651.entry.js → p-8b80d9f9.entry.js} +1 -1
  349. package/dist/ionic/{p-1a20571c.entry.js → p-90f50a65.entry.js} +1 -1
  350. package/dist/ionic/{p-392079fa.entry.js → p-9595e305.entry.js} +1 -1
  351. package/dist/ionic/{p-e93cc1e1.entry.js → p-9c5f2691.entry.js} +1 -1
  352. package/dist/ionic/p-BY6BzzPF.js +4 -0
  353. package/dist/ionic/{p-BRc8gq5v.js → p-BaeKWZ-a.js} +1 -1
  354. package/dist/ionic/p-Bd72UYI2.js +4 -0
  355. package/dist/ionic/{p-C2BY_4Wp.js → p-BgOvhHy_.js} +1 -1
  356. package/dist/ionic/{p-KJ5pLPiN.js → p-BijjLYjT.js} +1 -1
  357. package/dist/ionic/{p-h81G-QbJ.js → p-C23AVPx9.js} +1 -1
  358. package/dist/ionic/p-C8XilMh0.js +4 -0
  359. package/dist/ionic/{p-Cc-fFNy8.js → p-CER8qW8Y.js} +1 -1
  360. package/dist/ionic/{p-06ZcwRF5.js → p-CFuOr1Tu.js} +1 -1
  361. package/dist/ionic/p-CJv-wOAd.js +4 -0
  362. package/dist/ionic/p-CMZYmFb4.js +4 -0
  363. package/dist/ionic/{p-BC17SPKH.js → p-CkxVYPtX.js} +1 -1
  364. package/dist/ionic/{p-DMj-M2c4.js → p-CmXuiRT6.js} +1 -1
  365. package/dist/ionic/p-D4OrdtJf.js +4 -0
  366. package/dist/ionic/p-D6rHcCvc.js +4 -0
  367. package/{components/p-DG-dUCKp.js → dist/ionic/p-DLM95R4x.js} +1 -1
  368. package/{components/p-DH0rRXjx.js → dist/ionic/p-DTxBioUO.js} +1 -1
  369. package/{components/p-BcuLPPAE.js → dist/ionic/p-DYUjHcuH.js} +1 -1
  370. package/dist/ionic/{p-DA88iqXQ.js → p-DZ6Hmc-8.js} +1 -1
  371. package/dist/ionic/p-D_gb-kdd.js +4 -0
  372. package/dist/ionic/{p-S1shXW5M.js → p-DajLgJ4d.js} +1 -1
  373. package/dist/ionic/{p-CTBfxfjC.js → p-Do3zTvCA.js} +1 -1
  374. package/dist/ionic/{p-5fce4bf4.entry.js → p-a1cc2861.entry.js} +1 -1
  375. package/dist/ionic/{p-4dcd329a.entry.js → p-a20a2ebe.entry.js} +1 -1
  376. package/dist/ionic/{p-d1b888de.entry.js → p-a8ff2489.entry.js} +1 -1
  377. package/dist/ionic/{p-b8cd338d.entry.js → p-b3532b8d.entry.js} +1 -1
  378. package/dist/ionic/{p-8d72244b.entry.js → p-b80c86c4.entry.js} +1 -1
  379. package/dist/ionic/{p-43bae3f5.entry.js → p-b9b4e85d.entry.js} +1 -1
  380. package/dist/ionic/p-c57fc396.entry.js +4 -0
  381. package/dist/ionic/{p-082b8125.entry.js → p-ca1b8865.entry.js} +1 -1
  382. package/dist/ionic/{p-eab77a74.entry.js → p-cc4320d3.entry.js} +1 -1
  383. package/dist/ionic/{p-f0645c98.entry.js → p-d6755739.entry.js} +1 -1
  384. package/dist/ionic/{p-ac71362a.entry.js → p-d8c138d9.entry.js} +1 -1
  385. package/dist/ionic/{p-026e2e4c.entry.js → p-dd01be0a.entry.js} +1 -1
  386. package/dist/ionic/p-e7f4b1e0.entry.js +4 -0
  387. package/dist/ionic/{p-eaeac54e.entry.js → p-ec00fd0d.entry.js} +1 -1
  388. package/dist/ionic/{p-546b1109.entry.js → p-ee09ac9d.entry.js} +1 -1
  389. package/dist/ionic/{p-8e388a30.entry.js → p-efc0cf82.entry.js} +1 -1
  390. package/dist/ionic/{p-47b8b59a.entry.js → p-f0fb23c1.entry.js} +1 -1
  391. package/dist/ionic/{p-9452849d.entry.js → p-f83b3e0c.entry.js} +1 -1
  392. package/dist/ionic/{p-CH8tk7Pr.js → p-fU3rOYad.js} +1 -1
  393. package/dist/ionic/{p-eeb65463.entry.js → p-fe9ed9bd.entry.js} +1 -1
  394. package/{components/p-ntAkt4Ra.js → dist/ionic/p-zWf7R2xV.js} +1 -1
  395. package/dist/types/components/action-sheet/action-sheet.d.ts +10 -0
  396. package/dist/types/components/alert/alert.d.ts +7 -0
  397. package/dist/types/components/modal/modal.d.ts +8 -0
  398. package/dist/types/utils/overlays.d.ts +9 -0
  399. package/dist/types/utils/test/playwright/detach-reattach.d.ts +13 -0
  400. package/dist/types/utils/test/playwright/index.d.ts +1 -0
  401. package/hydrate/index.js +204 -88
  402. package/hydrate/index.mjs +204 -88
  403. package/package.json +3 -3
  404. package/components/p-CFtAWaB6.js +0 -4
  405. package/components/p-CRcX0EGs.js +0 -4
  406. package/components/p-CXQzYyda.js +0 -4
  407. package/components/p-CXpy69Ei.js +0 -4
  408. package/components/p-CoGD-oMG.js +0 -4
  409. package/components/p-D8BOfNYz.js +0 -4
  410. package/components/p-Dr-rBSUW.js +0 -4
  411. package/components/p-FQTgh7aH.js +0 -4
  412. package/components/p-KusMkAnB.js +0 -4
  413. package/components/p-MHpJ2A_m.js +0 -4
  414. package/components/p-U1X_lw_6.js +0 -4
  415. package/components/p-UKksD3f9.js +0 -4
  416. package/components/p-fP0QF3iG.js +0 -4
  417. package/components/p-ufB0gCSU.js +0 -4
  418. package/dist/ionic/p-39415b06.entry.js +0 -4
  419. package/dist/ionic/p-3bad6750.entry.js +0 -4
  420. package/dist/ionic/p-70334101.entry.js +0 -4
  421. package/dist/ionic/p-8db6e422.entry.js +0 -4
  422. package/dist/ionic/p-BRa1Jjxr.js +0 -4
  423. package/dist/ionic/p-Cc4w3fVf.js +0 -4
  424. package/dist/ionic/p-CvRL-Eju.js +0 -4
  425. package/dist/ionic/p-DA52akcQ.js +0 -4
  426. package/dist/ionic/p-D_IgV7tz.js +0 -4
  427. package/dist/ionic/p-Q9w8L_Sw.js +0 -4
  428. package/dist/ionic/p-b62c04b2.entry.js +0 -4
  429. package/dist/ionic/p-w3KTiug9.js +0 -4
package/hydrate/index.mjs CHANGED
@@ -420,7 +420,7 @@ const appGlobalScript = initialize || (() => {});
420
420
  const globalScripts = appGlobalScript;
421
421
 
422
422
  /*
423
- Stencil Hydrate Platform v4.44.1 | MIT Licensed | https://stenciljs.com
423
+ Stencil Hydrate Platform v4.44.2 | MIT Licensed | https://stenciljs.com
424
424
  */
425
425
  var __create = Object.create;
426
426
  var __defProp = Object.defineProperty;
@@ -3227,8 +3227,6 @@ var setValue = (ref, propName, newVal, cmpMeta) => {
3227
3227
  }
3228
3228
  }
3229
3229
  };
3230
-
3231
- // src/runtime/proxy-component.ts
3232
3230
  var proxyComponent = (Cstr, cmpMeta, flags) => {
3233
3231
  var _a2;
3234
3232
  const prototype = Cstr.prototype;
@@ -7980,6 +7978,15 @@ const activeAnimations = new WeakMap();
7980
7978
  const isBackdropAlwaysBlocking = (el) => {
7981
7979
  return el.showBackdrop !== false && !((el.backdropBreakpoint ?? 0) > 0);
7982
7980
  };
7981
+ /**
7982
+ * Whether the overlay takes the app root out of the accessibility tree and
7983
+ * blocks body scroll while presented. Toasts never do, modal and popover can
7984
+ * opt out with `focusTrap={false}`, and a backdrop that does not block
7985
+ * (`showBackdrop={false}`, or a `backdropBreakpoint` above 0) is excluded.
7986
+ */
7987
+ const locksAppRoot = (el) => {
7988
+ return el.tagName !== 'ION-TOAST' && el.focusTrap !== false && isBackdropAlwaysBlocking(el);
7989
+ };
7983
7990
  const createController = (tagName) => {
7984
7991
  return {
7985
7992
  create(options) {
@@ -8348,6 +8355,13 @@ const getPresentedOverlay = (doc, overlayTag, id) => {
8348
8355
  // Otherwise, return the last overlay with the given id
8349
8356
  return (id === undefined ? overlays : overlays.filter((o) => o.id === id)).slice(-1)[0];
8350
8357
  };
8358
+ /**
8359
+ * The element an app nests its views under. Overlays hide this rather than the
8360
+ * whole root, so the overlay itself (a sibling) stays reachable.
8361
+ */
8362
+ const getViewContainer = () => {
8363
+ return getAppRoot(document).querySelector('ion-router-outlet, #ion-view-container-root');
8364
+ };
8351
8365
  /**
8352
8366
  * When an overlay is presented, the main
8353
8367
  * focus is the overlay not the page content.
@@ -8371,8 +8385,7 @@ const getPresentedOverlay = (doc, overlayTag, id) => {
8371
8385
  * for main content.
8372
8386
  */
8373
8387
  const setRootAriaHidden = (hidden = false) => {
8374
- const root = getAppRoot(document);
8375
- const viewContainer = root.querySelector('ion-router-outlet, #ion-view-container-root');
8388
+ const viewContainer = getViewContainer();
8376
8389
  if (!viewContainer) {
8377
8390
  return;
8378
8391
  }
@@ -8397,15 +8410,42 @@ const cleanupRootFocusTrapAccessibility = () => {
8397
8410
  return;
8398
8411
  }
8399
8412
  const remainingOverlays = getPresentedOverlays(document);
8400
- const hasRemainingLocking = remainingOverlays.some((o) => {
8401
- const el = o;
8402
- return el.tagName !== 'ION-TOAST' && el.focusTrap !== false && isBackdropAlwaysBlocking(el);
8403
- });
8413
+ const hasRemainingLocking = remainingOverlays.some((o) => locksAppRoot(o));
8404
8414
  if (!hasRemainingLocking) {
8405
8415
  setRootAriaHidden(false);
8406
8416
  document.body.classList.remove(BACKDROP_NO_SCROLL);
8407
8417
  }
8408
8418
  };
8419
+ /**
8420
+ * Applies the root lock itself: `aria-hidden` on the view container, and
8421
+ * `backdrop-no-scroll` on the body. Shared by `present()` and the restore
8422
+ * below, which have to stay in lockstep.
8423
+ */
8424
+ const applyRootLock = (el) => {
8425
+ // Hiding the container the overlay now sits in would hide the overlay too.
8426
+ if (!getViewContainer()?.contains(el)) {
8427
+ setRootAriaHidden(true);
8428
+ }
8429
+ document.body.classList.add(BACKDROP_NO_SCROLL);
8430
+ };
8431
+ /**
8432
+ * Re-applies the root lock that `cleanupRootFocusTrapAccessibility()` released.
8433
+ * Call from `connectedCallback` when the overlay is still presented.
8434
+ *
8435
+ * A synchronous move keeps the overlay connected, so the lock survives. A
8436
+ * detach with a re-insert in a later task releases it, which is the shape a
8437
+ * framework produces when it takes a subtree out and puts it back.
8438
+ */
8439
+ const restoreRootFocusTrapAccessibility = (overlayEl) => {
8440
+ if (typeof document === 'undefined') {
8441
+ return;
8442
+ }
8443
+ const el = overlayEl;
8444
+ if (!locksAppRoot(el)) {
8445
+ return;
8446
+ }
8447
+ applyRootLock(el);
8448
+ };
8409
8449
  const present = async (overlay, name, iosEnterAnimation, mdEnterAnimation, opts) => {
8410
8450
  if (overlay.presented) {
8411
8451
  return;
@@ -8422,15 +8462,7 @@ const present = async (overlay, name, iosEnterAnimation, mdEnterAnimation, opts)
8422
8462
  restoreElementFocus(overlay.el);
8423
8463
  }
8424
8464
  /**
8425
- * Due to accessibility guidelines, toasts do not have
8426
- * focus traps.
8427
- *
8428
- * All other overlays should have focus traps to prevent
8429
- * the keyboard focus from leaving the overlay unless
8430
- * developers explicitly opt out (for example, sheet
8431
- * modals that should permit background interaction).
8432
- *
8433
- * Note: Some apps move inline overlays to a specific container
8465
+ * Some apps move inline overlays to a specific container
8434
8466
  * during the willPresent lifecycle (e.g., React portals via
8435
8467
  * onWillPresent). Defer applying aria-hidden/inert to the app
8436
8468
  * root until after willPresent so we can detect where the
@@ -8439,18 +8471,11 @@ const present = async (overlay, name, iosEnterAnimation, mdEnterAnimation, opts)
8439
8471
  * to avoid disabling the overlay.
8440
8472
  */
8441
8473
  const overlayEl = overlay.el;
8442
- const shouldTrapFocus = overlayEl.tagName !== 'ION-TOAST' && overlayEl.focusTrap !== false;
8443
- const shouldLockRoot = shouldTrapFocus && isBackdropAlwaysBlocking(overlayEl);
8474
+ const shouldLockRoot = locksAppRoot(overlayEl);
8444
8475
  overlay.presented = true;
8445
8476
  overlay.willPresent.emit();
8446
8477
  if (shouldLockRoot) {
8447
- const root = getAppRoot(document);
8448
- const viewContainer = root.querySelector('ion-router-outlet, #ion-view-container-root');
8449
- const overlayInsideViewContainer = viewContainer ? viewContainer.contains(overlayEl) : false;
8450
- if (!overlayInsideViewContainer) {
8451
- setRootAriaHidden(true);
8452
- }
8453
- document.body.classList.add(BACKDROP_NO_SCROLL);
8478
+ applyRootLock(overlayEl);
8454
8479
  }
8455
8480
  overlay.willPresentShorthand?.emit();
8456
8481
  const mode = getIonMode$1(overlay);
@@ -8576,12 +8601,9 @@ const dismiss = async (overlay, data, role, name, iosLeaveAnimation, mdLeaveAnim
8576
8601
  * from the root element when the last focus-trapping overlay
8577
8602
  * is dismissed.
8578
8603
  */
8579
- const overlaysLockingRoot = presentedOverlays.filter((o) => {
8580
- const el = o;
8581
- return el.tagName !== 'ION-TOAST' && el.focusTrap !== false && isBackdropAlwaysBlocking(el);
8582
- });
8604
+ const overlaysLockingRoot = presentedOverlays.filter((o) => locksAppRoot(o));
8583
8605
  const overlayEl = overlay.el;
8584
- const locksRoot = overlayEl.tagName !== 'ION-TOAST' && overlayEl.focusTrap !== false && isBackdropAlwaysBlocking(overlayEl);
8606
+ const locksRoot = locksAppRoot(overlayEl);
8585
8607
  /**
8586
8608
  * If this is the last visible overlay that is trapping focus
8587
8609
  * then we want to re-add the root to the accessibility tree.
@@ -10577,6 +10599,13 @@ class ActionSheet {
10577
10599
  connectedCallback() {
10578
10600
  prepareOverlay(this.el);
10579
10601
  this.triggerChanged();
10602
+ // `componentDidLoad` only fires once per instance, so a reconnect has to
10603
+ // rebuild the gesture its disconnect destroyed.
10604
+ this.setupButtonActiveGesture();
10605
+ // Re-apply the root lock if moved without dismiss() being called
10606
+ if (this.presented) {
10607
+ restoreRootFocusTrapAccessibility(this.el);
10608
+ }
10580
10609
  }
10581
10610
  disconnectedCallback() {
10582
10611
  if (this.gesture) {
@@ -10596,24 +10625,33 @@ class ActionSheet {
10596
10625
  // Initialize activeRadioId for radio buttons
10597
10626
  this.buttonsChanged();
10598
10627
  }
10599
- componentDidLoad() {
10600
- /**
10601
- * Only create gesture if:
10602
- * 1. A gesture does not already exist
10603
- * 2. App is running in iOS mode
10604
- * 3. A wrapper ref exists
10605
- * 4. A group ref exists
10606
- */
10628
+ /**
10629
+ * Only create gesture if:
10630
+ * 1. A gesture does not already exist
10631
+ * 2. App is running in iOS mode
10632
+ * 3. A wrapper ref exists
10633
+ * 4. A group ref exists
10634
+ * 5. The host is still connected, since a reconnect can schedule this and
10635
+ * disconnect again before the task runs
10636
+ */
10637
+ setupButtonActiveGesture() {
10607
10638
  const { groupEl, wrapperEl } = this;
10608
- if (!this.gesture && getIonMode$1(this) === 'ios' && wrapperEl && groupEl) {
10609
- readTask(() => {
10610
- const isScrollable = groupEl.scrollHeight > groupEl.clientHeight;
10611
- if (!isScrollable) {
10612
- this.gesture = createButtonActiveGesture(wrapperEl, (refEl) => refEl.classList.contains('action-sheet-button'));
10613
- this.gesture.enable(true);
10614
- }
10615
- });
10639
+ if (getIonMode$1(this) !== 'ios' || !wrapperEl || !groupEl) {
10640
+ return;
10616
10641
  }
10642
+ readTask(() => {
10643
+ // Bail if a call queued ahead of this one already built the gesture
10644
+ // (a second would orphan the first with its listeners still bound), if
10645
+ // the host disconnected while this task waited, or if the group scrolls.
10646
+ if (this.gesture || !this.el.isConnected || groupEl.scrollHeight > groupEl.clientHeight) {
10647
+ return;
10648
+ }
10649
+ this.gesture = createButtonActiveGesture(wrapperEl, (refEl) => refEl.classList.contains('action-sheet-button'));
10650
+ this.gesture.enable(true);
10651
+ });
10652
+ }
10653
+ componentDidLoad() {
10654
+ this.setupButtonActiveGesture();
10617
10655
  /**
10618
10656
  * If action sheet was rendered with isOpen="true"
10619
10657
  * then we should open action sheet immediately.
@@ -10706,17 +10744,17 @@ class ActionSheet {
10706
10744
  const cancelButton = allButtons.find((b) => b.role === 'cancel');
10707
10745
  const buttons = allButtons.filter((b) => b.role !== 'cancel');
10708
10746
  const headerID = `action-sheet-${overlayIndex}-header`;
10709
- return (hAsync(Host, { key: '7685831da9a78b73473246a2cea95cefa79a53c3', role: "dialog", "aria-modal": "true", "aria-labelledby": header !== undefined ? headerID : null, tabindex: "-1", ...htmlAttributes, style: {
10747
+ return (hAsync(Host, { key: '83b47ea6b81d4eec6582c1dcaae6f267c78ba634', role: "dialog", "aria-modal": "true", "aria-labelledby": header !== undefined ? headerID : null, tabindex: "-1", ...htmlAttributes, style: {
10710
10748
  zIndex: `${20000 + this.overlayIndex}`,
10711
10749
  }, class: {
10712
10750
  [mode]: true,
10713
10751
  ...getClassMap(this.cssClass),
10714
10752
  'overlay-hidden': true,
10715
10753
  'action-sheet-translucent': this.translucent,
10716
- }, onIonActionSheetWillDismiss: this.dispatchCancelHandler, onIonBackdropTap: this.onBackdropTap }, hAsync("ion-backdrop", { key: 'c70f00e401cac99b89412d1adb867f35bc855d57', tappable: this.backdropDismiss }), hAsync("div", { key: '3332893ce3098f1435875480b1269b2821d41660', tabindex: "0", "aria-hidden": "true" }), hAsync("div", { key: 'eb406b0a9e303d6f94c5c7aa99c6f4c089bfbd41', class: "action-sheet-wrapper ion-overlay-wrapper", ref: (el) => (this.wrapperEl = el) }, hAsync("div", { key: '92ec855379f10e1e0bfce6ff68b45d3cda0c137c', class: "action-sheet-container" }, hAsync("div", { key: 'bc88a396d75396f574961471bf7e6c4edb513353', class: "action-sheet-group", ref: (el) => (this.groupEl = el), role: hasRadioButtons ? 'radiogroup' : undefined }, header !== undefined && (hAsync("div", { key: '33329e0193818888bdcaa443ff5ea301802e0787', id: headerID, class: {
10754
+ }, onIonActionSheetWillDismiss: this.dispatchCancelHandler, onIonBackdropTap: this.onBackdropTap }, hAsync("ion-backdrop", { key: '3652793ec76adcfb87b814eb65d1260ae26f6910', tappable: this.backdropDismiss }), hAsync("div", { key: '7de3a51daf95b50e02734a2cc8eec6f55b1473f3', tabindex: "0", "aria-hidden": "true" }), hAsync("div", { key: '9b76bbf12901b956f7ee6d984f7f71e169bb5939', class: "action-sheet-wrapper ion-overlay-wrapper", ref: (el) => (this.wrapperEl = el) }, hAsync("div", { key: 'cb52c905275a46ff27810fb1b4748ab533a78c45', class: "action-sheet-container" }, hAsync("div", { key: '578c7194cfbcb65c1e41e15c390af41f179a2686', class: "action-sheet-group", ref: (el) => (this.groupEl = el), role: hasRadioButtons ? 'radiogroup' : undefined }, header !== undefined && (hAsync("div", { key: 'ee961307c25cb1fcb0c6bbf667a8ed76ab717860', id: headerID, class: {
10717
10755
  'action-sheet-title': true,
10718
10756
  'action-sheet-has-sub-title': this.subHeader !== undefined,
10719
- } }, header, this.subHeader && hAsync("div", { key: '92ac5a9217a12b7417f7aca9c4fdb7bf6b051364', class: "action-sheet-sub-title" }, this.subHeader))), this.renderActionSheetButtons(buttons)), cancelButton && (hAsync("div", { key: '020463b830fa48fc3ae647ea64f2aaa4d0969305', class: "action-sheet-group action-sheet-group-cancel" }, hAsync("button", { key: 'cefa9c70a2233f6652a81b1a2eae6e717712144d', ...cancelButton.htmlAttributes, type: "button", class: buttonClass$2(cancelButton), onClick: () => this.buttonClick(cancelButton) }, hAsync("span", { key: '56d7e2f8bfb3644e4476895164d334445fda9b2f', class: "action-sheet-button-inner" }, cancelButton.icon && (hAsync("ion-icon", { key: '6a4a49254ec5cd96f4e0dce9447f90d8cac81913', icon: cancelButton.icon, "aria-hidden": "true", lazy: false, class: "action-sheet-icon" })), cancelButton.text), mode === 'md' && hAsync("ion-ripple-effect", { key: '7d3c6e8d70b0922ea0f75520856285ce1005c891' })))))), hAsync("div", { key: '958fc43e603c6a7f5d1e649d3326fce0f163b5d0', tabindex: "0", "aria-hidden": "true" })));
10757
+ } }, header, this.subHeader && hAsync("div", { key: '82d4016010db14d3f3b9911c276cb9a63b960ef4', class: "action-sheet-sub-title" }, this.subHeader))), this.renderActionSheetButtons(buttons)), cancelButton && (hAsync("div", { key: 'a88fbfab194e13c6642a65f2e19a12299dd4ac23', class: "action-sheet-group action-sheet-group-cancel" }, hAsync("button", { key: 'a232b8d23f1fc2efb7b37a605102b6994761a2f6', ...cancelButton.htmlAttributes, type: "button", class: buttonClass$2(cancelButton), onClick: () => this.buttonClick(cancelButton) }, hAsync("span", { key: '19a7d95d3428d78a56b7dacabdec8fc0b722d8c2', class: "action-sheet-button-inner" }, cancelButton.icon && (hAsync("ion-icon", { key: '5f3f3cb996a48e6365a3a09ea72ddc68ac9ccb78', icon: cancelButton.icon, "aria-hidden": "true", lazy: false, class: "action-sheet-icon" })), cancelButton.text), mode === 'md' && hAsync("ion-ripple-effect", { key: '6e8fcb5f103ac19aa4b0682f19791cef0a147001' })))))), hAsync("div", { key: '36f63ab77949c88f662e2cf6bb18510cb9de6a9f', tabindex: "0", "aria-hidden": "true" })));
10720
10758
  }
10721
10759
  get el() { return getElement(this); }
10722
10760
  static get watchers() { return {
@@ -11098,10 +11136,15 @@ class Alert {
11098
11136
  this.triggerChanged();
11099
11137
  /**
11100
11138
  * If the alert was previously connected and is being reattached, the
11101
- * ResizeObserver was disconnected. componentDidLoad only fires once per
11102
- * instance, so re-establish the observer here on reconnect.
11139
+ * `ResizeObserver` and the button gesture were torn down. `componentDidLoad`
11140
+ * only fires once per instance, so re-establish both here on reconnect.
11103
11141
  */
11104
11142
  this.setupButtonGroupResizeObserver();
11143
+ this.setupButtonActiveGesture();
11144
+ // Re-apply the root lock if moved without dismiss() being called
11145
+ if (this.presented) {
11146
+ restoreRootFocusTrapAccessibility(this.el);
11147
+ }
11105
11148
  }
11106
11149
  componentWillLoad() {
11107
11150
  if (!this.htmlAttributes?.id) {
@@ -11123,17 +11166,20 @@ class Alert {
11123
11166
  this.buttonGroupResizeObserver?.disconnect();
11124
11167
  this.buttonGroupResizeObserver = undefined;
11125
11168
  }
11126
- componentDidLoad() {
11127
- /**
11128
- * Only create gesture if:
11129
- * 1. A gesture does not already exist
11130
- * 2. App is running in iOS mode
11131
- * 3. A wrapper ref exists
11132
- */
11169
+ /**
11170
+ * Only create gesture if:
11171
+ * 1. A gesture does not already exist
11172
+ * 2. App is running in iOS mode
11173
+ * 3. A wrapper ref exists
11174
+ */
11175
+ setupButtonActiveGesture() {
11133
11176
  if (!this.gesture && getIonMode$1(this) === 'ios' && this.wrapperEl) {
11134
11177
  this.gesture = createButtonActiveGesture(this.wrapperEl, (refEl) => refEl.classList.contains('alert-button'));
11135
11178
  this.gesture.enable(true);
11136
11179
  }
11180
+ }
11181
+ componentDidLoad() {
11182
+ this.setupButtonActiveGesture();
11137
11183
  this.setupButtonGroupResizeObserver();
11138
11184
  /**
11139
11185
  * If alert was rendered with isOpen="true"
@@ -11454,14 +11500,14 @@ class Alert {
11454
11500
  * If neither are defined, do not set aria-labelledby.
11455
11501
  */
11456
11502
  const ariaLabelledBy = header && subHeader ? `${hdrId} ${subHdrId}` : header ? hdrId : subHeader ? subHdrId : null;
11457
- return (hAsync(Host, { key: '022f3463b8e6c52064b90ec304c524847c3d5ad3', tabindex: "-1", style: {
11503
+ return (hAsync(Host, { key: '083b5250dc4c76e85240e0225abcb7ca2b66de2f', tabindex: "-1", style: {
11458
11504
  zIndex: `${20000 + overlayIndex}`,
11459
11505
  }, class: {
11460
11506
  ...getClassMap(this.cssClass),
11461
11507
  [mode]: true,
11462
11508
  'overlay-hidden': true,
11463
11509
  'alert-translucent': this.translucent,
11464
- }, onIonAlertWillDismiss: this.dispatchCancelHandler, onIonBackdropTap: this.onBackdropTap }, hAsync("ion-backdrop", { key: 'c3cd05738bc2834f54707edeb2fae06ec10d6fd2', tappable: this.backdropDismiss }), hAsync("div", { key: 'b44fadd9ba7ddf073854c5035538d11ae8e66bc2', tabindex: "0", "aria-hidden": "true" }), hAsync("div", { key: 'fafea048141a6c7957e62aef31faa8041dd610c1', class: "alert-wrapper ion-overlay-wrapper", role: role, "aria-modal": "true", "aria-labelledby": ariaLabelledBy, "aria-describedby": message !== undefined ? msgId : null, tabindex: "0", ref: (el) => (this.wrapperEl = el), ...htmlAttributes }, hAsync("div", { key: '3ad9d2d4b7cf425eab8293ddc12eff0fe8df1517', class: "alert-head" }, header && (hAsync("h2", { key: '7d9154f5ee595b7e4da6ecf3a20871f104c1256e', id: hdrId, class: "alert-title" }, header)), subHeader && !header && (hAsync("h2", { key: '1f891f38004be6964e9406b84dd580145c42516a', id: subHdrId, class: "alert-sub-title" }, subHeader)), subHeader && header && (hAsync("h3", { key: '2ab4d344ecb7e384e8f6d3d3e59ee5a1bbcc832c', id: subHdrId, class: "alert-sub-title" }, subHeader))), this.renderAlertMessage(msgId), this.renderAlertInputs(), this.renderAlertButtons()), hAsync("div", { key: '78a4ff09aa3aaafcd0dc2a42d036767d83b3cfa2', tabindex: "0", "aria-hidden": "true" })));
11510
+ }, onIonAlertWillDismiss: this.dispatchCancelHandler, onIonBackdropTap: this.onBackdropTap }, hAsync("ion-backdrop", { key: '65c92a956d998ae9016396dd2a29c42ab7376d0e', tappable: this.backdropDismiss }), hAsync("div", { key: 'f2288fa0b7ef9d0bf031c168fe78c48422cf91c8', tabindex: "0", "aria-hidden": "true" }), hAsync("div", { key: 'dbb109435c378f77c6b0231e58756f8a0467732d', class: "alert-wrapper ion-overlay-wrapper", role: role, "aria-modal": "true", "aria-labelledby": ariaLabelledBy, "aria-describedby": message !== undefined ? msgId : null, tabindex: "0", ref: (el) => (this.wrapperEl = el), ...htmlAttributes }, hAsync("div", { key: '075597f94719673cf1f894a8566e1036849afa75', class: "alert-head" }, header && (hAsync("h2", { key: 'f96f4b1db8473c62040beed6e96108c733978d73', id: hdrId, class: "alert-title" }, header)), subHeader && !header && (hAsync("h2", { key: 'dbd824ef19a07bddde4eb928f11de7c7cadf98b8', id: subHdrId, class: "alert-sub-title" }, subHeader)), subHeader && header && (hAsync("h3", { key: '4774fa13700dd23aec7930492acae80de3bdf5d1', id: subHdrId, class: "alert-sub-title" }, subHeader))), this.renderAlertMessage(msgId), this.renderAlertInputs(), this.renderAlertButtons()), hAsync("div", { key: '5c728b7457e231f64294bbec821bdb547c6437dd', tabindex: "0", "aria-hidden": "true" })));
11465
11511
  }
11466
11512
  get el() { return getElement(this); }
11467
11513
  static get watchers() { return {
@@ -22979,6 +23025,10 @@ class Loading {
22979
23025
  connectedCallback() {
22980
23026
  prepareOverlay(this.el);
22981
23027
  this.triggerChanged();
23028
+ // Re-apply the root lock if moved without dismiss() being called
23029
+ if (this.presented) {
23030
+ restoreRootFocusTrapAccessibility(this.el);
23031
+ }
22982
23032
  }
22983
23033
  componentWillLoad() {
22984
23034
  if (this.spinner === undefined) {
@@ -23079,14 +23129,14 @@ class Loading {
23079
23129
  * Otherwise, don't set aria-labelledby.
23080
23130
  */
23081
23131
  const ariaLabelledBy = message !== undefined ? msgId : null;
23082
- return (hAsync(Host, { key: '2d14122ff3081de73631a7fdd4affdd5c73b8618', role: "dialog", "aria-modal": "true", "aria-labelledby": ariaLabelledBy, tabindex: "-1", ...htmlAttributes, style: {
23132
+ return (hAsync(Host, { key: 'b4430bc66aedeca19d5645667cba73c169c4bd76', role: "dialog", "aria-modal": "true", "aria-labelledby": ariaLabelledBy, tabindex: "-1", ...htmlAttributes, style: {
23083
23133
  zIndex: `${40000 + this.overlayIndex}`,
23084
23134
  }, onIonBackdropTap: this.onBackdropTap, class: {
23085
23135
  ...getClassMap(this.cssClass),
23086
23136
  [mode]: true,
23087
23137
  'overlay-hidden': true,
23088
23138
  'loading-translucent': this.translucent,
23089
- } }, hAsync("ion-backdrop", { key: 'b7d5bb0d670a20c159d7f67327bf3b1489449188', visible: this.showBackdrop, tappable: this.backdropDismiss }), hAsync("div", { key: '085ce92bd2004d323ab47eb472b83826e48dc619', tabindex: "0", "aria-hidden": "true" }), hAsync("div", { key: '4ecd5bfc0bbd3da434d32f0f319f867a44c5e1f1', class: "loading-wrapper ion-overlay-wrapper" }, spinner && (hAsync("div", { key: '5a4498e1421e09d01c0ee4312eae5272e95c3127', class: "loading-spinner" }, hAsync("ion-spinner", { key: '1b3bc7d45d775195657ead3535f65e6b79f37e84', name: spinner, "aria-hidden": "true" }))), message !== undefined && this.renderLoadingMessage(msgId)), hAsync("div", { key: 'bc7c5467b9f1c6ab957f79934e97acc713bdec37', tabindex: "0", "aria-hidden": "true" })));
23139
+ } }, hAsync("ion-backdrop", { key: 'dec0df942ae778c99ebd4dbf08d6c2a0a992639d', visible: this.showBackdrop, tappable: this.backdropDismiss }), hAsync("div", { key: '71b2d5fc259666225047fc901648ada1efcd5d4b', tabindex: "0", "aria-hidden": "true" }), hAsync("div", { key: '1d83dc3b57ee70c9e8c0f006c6fa576bd96ecded', class: "loading-wrapper ion-overlay-wrapper" }, spinner && (hAsync("div", { key: 'd1cd127e044b8831e396b53122322c1db7e89904', class: "loading-spinner" }, hAsync("ion-spinner", { key: '38c2580cf5659da612872f01801a5fbdc2c023ba', name: spinner, "aria-hidden": "true" }))), message !== undefined && this.renderLoadingMessage(msgId)), hAsync("div", { key: '90e5e32ffe0df2c691f364149f43374e676bfaa3', tabindex: "0", "aria-hidden": "true" })));
23090
23140
  }
23091
23141
  get el() { return getElement(this); }
23092
23142
  static get watchers() { return {
@@ -26645,6 +26695,9 @@ class Modal {
26645
26695
  this.inline = false;
26646
26696
  // Whether or not modal is being dismissed via gesture
26647
26697
  this.gestureAnimationDismissing = false;
26698
+ // True from the first safe-area write in `present()` until the enter
26699
+ // animation settles. A position-based read in that window is not the rest position.
26700
+ this.isPresenting = false;
26648
26701
  this.presented = false;
26649
26702
  /** @internal */
26650
26703
  this.hasController = false;
@@ -26881,6 +26934,17 @@ class Modal {
26881
26934
  const { el } = this;
26882
26935
  prepareOverlay(el);
26883
26936
  this.triggerChanged();
26937
+ // A disconnect tears down state this presentation still needs and cannot
26938
+ // tell a re-insert from a removal, so put it back.
26939
+ if (this.presented || this.isPresenting) {
26940
+ this.restoreSafeAreaOverrides();
26941
+ }
26942
+ // A relocation from `willPresent` reaches these before `present()` has
26943
+ // applied the lock, so they apply it instead. Both are idempotent.
26944
+ if (this.presented) {
26945
+ restoreRootFocusTrapAccessibility(el);
26946
+ this.initParentRemovalObserver();
26947
+ }
26884
26948
  }
26885
26949
  disconnectedCallback() {
26886
26950
  this.triggerController.removeClickListener();
@@ -27058,25 +27122,33 @@ class Modal {
27058
27122
  // Recalculate isSheetModal before safe-area setup because framework
27059
27123
  // bindings (e.g., Angular) may not have been applied when componentWillLoad ran.
27060
27124
  this.isSheetModal = this.breakpoints !== undefined && this.initialBreakpoint !== undefined;
27061
- // Set initial safe-area overrides before animation
27062
- this.setInitialSafeAreaOverrides();
27125
+ this.isPresenting = true;
27063
27126
  const hasCardModal = presentingElement !== undefined;
27064
- /**
27065
- * We need to change the status bar at the
27066
- * start of the animation so that it completes
27067
- * by the time the card animation is done.
27068
- */
27069
- if (hasCardModal && getIonMode$1(this) === 'ios') {
27070
- // Cache the original status bar color before the modal is presented
27071
- this.statusBarStyle = await StatusBar.getStyle();
27072
- setCardStatusBarDark();
27127
+ // Wrapped so a throw cannot strand `isPresenting`, which would suppress
27128
+ // the position-based correction for the life of this instance.
27129
+ try {
27130
+ // Set initial safe-area overrides before animation
27131
+ this.setInitialSafeAreaOverrides();
27132
+ /**
27133
+ * We need to change the status bar at the
27134
+ * start of the animation so that it completes
27135
+ * by the time the card animation is done.
27136
+ */
27137
+ if (hasCardModal && getIonMode$1(this) === 'ios') {
27138
+ // Cache the original status bar color before the modal is presented
27139
+ this.statusBarStyle = await StatusBar.getStyle();
27140
+ setCardStatusBarDark();
27141
+ }
27142
+ await present(this, 'modalEnter', iosEnterAnimation$2, mdEnterAnimation$2, {
27143
+ presentingEl: presentingElement,
27144
+ currentBreakpoint: this.initialBreakpoint,
27145
+ backdropBreakpoint: this.backdropBreakpoint,
27146
+ expandToScroll: this.expandToScroll,
27147
+ });
27148
+ }
27149
+ finally {
27150
+ this.isPresenting = false;
27073
27151
  }
27074
- await present(this, 'modalEnter', iosEnterAnimation$2, mdEnterAnimation$2, {
27075
- presentingEl: presentingElement,
27076
- currentBreakpoint: this.initialBreakpoint,
27077
- backdropBreakpoint: this.backdropBreakpoint,
27078
- expandToScroll: this.expandToScroll,
27079
- });
27080
27152
  // Update safe-area based on actual position after animation
27081
27153
  this.updateSafeAreaOverrides();
27082
27154
  // Apply fullscreen safe-area padding if needed
@@ -27578,6 +27650,9 @@ class Modal {
27578
27650
  this.cachedOriginalParent.tagName === 'ION-APP') {
27579
27651
  return;
27580
27652
  }
27653
+ // Both `present()` and a reconnect call this, so drop any existing
27654
+ // observer. Below the guards, so a call that bails cannot leave none.
27655
+ this.cleanupParentRemovalObserver();
27581
27656
  this.parentRemovalObserver = new MutationObserver((mutations) => {
27582
27657
  mutations.forEach((mutation) => {
27583
27658
  if (mutation.type === 'childList' && mutation.removedNodes.length > 0) {
@@ -27656,6 +27731,9 @@ class Modal {
27656
27731
  // Set the internal offset property with the resolved root safe-area-top value
27657
27732
  if (context.isSheetModal) {
27658
27733
  this.updateSheetOffsetTop();
27734
+ // A restore after a DOM move runs this a second time for the same
27735
+ // modal, so drop the previous subscription rather than stacking one.
27736
+ this.unsubscribeRootSafeAreaTop?.();
27659
27737
  this.unsubscribeRootSafeAreaTop = onRootSafeAreaTopChange((safeAreaTop) => this.updateSheetOffsetTop(safeAreaTop));
27660
27738
  }
27661
27739
  }
@@ -27774,6 +27852,31 @@ class Modal {
27774
27852
  const { contentEl } = this.findContentAndFooter();
27775
27853
  this.clearContentSafeAreaPadding(contentEl);
27776
27854
  }
27855
+ /**
27856
+ * Re-applies what `cleanupSafeAreaOverrides()` removed for a modal moved
27857
+ * while presented. Anything needing no measurement goes on synchronously so
27858
+ * the modal is never painted without safe-area. The position-based
27859
+ * correction waits a frame for the layout pass it reads.
27860
+ */
27861
+ restoreSafeAreaOverrides() {
27862
+ this.setInitialSafeAreaOverrides();
27863
+ this.applyFullscreenSafeArea();
27864
+ raf(() => {
27865
+ // A dismiss or another move can land first, and a read before the enter
27866
+ // animation settles is not the rest position. `present()` redoes it.
27867
+ if (!this.presented || !this.el.isConnected || this.isPresenting) {
27868
+ return;
27869
+ }
27870
+ // A hidden subtree carries `display: none`, so there is no box and the
27871
+ // read would write the safe-area for a modal touching no edge. The
27872
+ // prediction applied above holds until the modal is shown again.
27873
+ const { width, height } = this.el.getBoundingClientRect();
27874
+ if (width === 0 && height === 0) {
27875
+ return;
27876
+ }
27877
+ this.updateSafeAreaOverrides();
27878
+ });
27879
+ }
27777
27880
  render() {
27778
27881
  const { handle, isSheetModal, presentingElement, htmlAttributes, handleBehavior, inheritedAttributes, focusTrap, expandToScroll, } = this;
27779
27882
  const showHandle = handle !== false && isSheetModal;
@@ -27781,7 +27884,7 @@ class Modal {
27781
27884
  const isCardModal = presentingElement !== undefined && mode === 'ios';
27782
27885
  const isHandleCycle = handleBehavior === 'cycle';
27783
27886
  const isSheetModalWithHandle = isSheetModal && showHandle;
27784
- return (hAsync(Host, { key: 'a471c293319cb6ee5ffb7ffafec0b8413e4289de', "no-router": true,
27887
+ return (hAsync(Host, { key: '7c9c736052c5a788cf31040b6b2386dd9ea7454b', "no-router": true,
27785
27888
  // Allow the modal to be navigable when the handle is focusable
27786
27889
  tabIndex: isHandleCycle && isSheetModalWithHandle ? 0 : -1, ...htmlAttributes, style: {
27787
27890
  zIndex: `${20000 + this.overlayIndex}`,
@@ -27794,7 +27897,7 @@ class Modal {
27794
27897
  'overlay-hidden': true,
27795
27898
  [FOCUS_TRAP_DISABLE_CLASS]: focusTrap === false,
27796
27899
  ...getClassMap(this.cssClass),
27797
- }, onIonBackdropTap: this.onBackdropTap, onIonModalDidPresent: this.onLifecycle, onIonModalWillPresent: this.onLifecycle, onIonModalWillDismiss: this.onLifecycle, onIonModalDidDismiss: this.onLifecycle, onFocus: this.onModalFocus }, hAsync("ion-backdrop", { key: 'f67934afd4ddad64623856fb641cb6db846df428', ref: (el) => (this.backdropEl = el), visible: this.showBackdrop, tappable: this.backdropDismiss, part: "backdrop" }), mode === 'ios' && hAsync("div", { key: 'a23f5cb6cf60c8f717c1dd556bce375829c80a43', class: "modal-shadow" }), hAsync("div", { key: '51eb6cd1070e4b7e49840a78dc7437238c867a01',
27900
+ }, onIonBackdropTap: this.onBackdropTap, onIonModalDidPresent: this.onLifecycle, onIonModalWillPresent: this.onLifecycle, onIonModalWillDismiss: this.onLifecycle, onIonModalDidDismiss: this.onLifecycle, onFocus: this.onModalFocus }, hAsync("ion-backdrop", { key: '01b5b5765fb3a32393c736065c824bf760728823', ref: (el) => (this.backdropEl = el), visible: this.showBackdrop, tappable: this.backdropDismiss, part: "backdrop" }), mode === 'ios' && hAsync("div", { key: '40fa7727a0923f7d7461dd027f1511a6a148d84a', class: "modal-shadow" }), hAsync("div", { key: '9af934b607f60795bd5bff7bee6eacfc9b14fa35',
27798
27901
  /*
27799
27902
  role and aria-modal must be used on the
27800
27903
  same element. They must also be set inside the
@@ -27807,9 +27910,9 @@ class Modal {
27807
27910
  without the tabindex focus() would be a no-op and screen readers
27808
27911
  may not properly announce the dialog and its content when it opens.
27809
27912
  */
27810
- role: "dialog", ...inheritedAttributes, "aria-modal": "true", tabIndex: -1, class: "modal-wrapper ion-overlay-wrapper", part: "content", ref: (el) => (this.wrapperEl = el) }, showHandle && (hAsync("button", { key: 'f49a144642b5c227c0c2b00b33f4c7e37a2bf088', class: "modal-handle",
27913
+ role: "dialog", ...inheritedAttributes, "aria-modal": "true", tabIndex: -1, class: "modal-wrapper ion-overlay-wrapper", part: "content", ref: (el) => (this.wrapperEl = el) }, showHandle && (hAsync("button", { key: 'df84a6806413b13efc5b03c862edde83151579a7', class: "modal-handle",
27811
27914
  // Prevents the handle from receiving keyboard focus when it does not cycle
27812
- tabIndex: !isHandleCycle ? -1 : 0, "aria-label": "Activate to adjust the size of the dialog overlaying the screen", onClick: isHandleCycle ? this.onHandleClick : undefined, part: "handle", ref: (el) => (this.dragHandleEl = el) })), hAsync("slot", { key: 'e781c0d5881762c6b61aa432721a38b49580ff64', onSlotchange: this.onSlotChange }))));
27915
+ tabIndex: !isHandleCycle ? -1 : 0, "aria-label": "Activate to adjust the size of the dialog overlaying the screen", onClick: isHandleCycle ? this.onHandleClick : undefined, part: "handle", ref: (el) => (this.dragHandleEl = el) })), hAsync("slot", { key: '072d3929ec6f25481946b184d8ac24219011e783', onSlotchange: this.onSlotChange }))));
27813
27916
  }
27814
27917
  get el() { return getElement(this); }
27815
27918
  static get watchers() { return {
@@ -31409,6 +31512,13 @@ class Popover {
31409
31512
  const { configureTriggerInteraction, el } = this;
31410
31513
  prepareOverlay(el);
31411
31514
  configureTriggerInteraction();
31515
+ // Re-apply the root lock if moved without dismiss() being called
31516
+ if (this.presented) {
31517
+ restoreRootFocusTrapAccessibility(el);
31518
+ // The disconnect tore down the header observer, and `present()` is its
31519
+ // only other caller, so a move mid-layout would lose the recalculation.
31520
+ this.recalculateContentOnHeaderReady();
31521
+ }
31412
31522
  }
31413
31523
  disconnectedCallback() {
31414
31524
  const { destroyTriggerInteraction } = this;
@@ -31586,6 +31696,12 @@ class Popover {
31586
31696
  if (!header || contentElements.length === 0) {
31587
31697
  return;
31588
31698
  }
31699
+ // Both `present()` and a reconnect call this, so drop any existing
31700
+ // observer. Below the guards, so a call that bails cannot leave none.
31701
+ if (this.headerResizeObserver) {
31702
+ this.headerResizeObserver.disconnect();
31703
+ this.headerResizeObserver = undefined;
31704
+ }
31589
31705
  this.headerResizeObserver = new ResizeObserver(async () => {
31590
31706
  if (header.offsetHeight > 0) {
31591
31707
  this.headerResizeObserver?.disconnect();
@@ -31658,7 +31774,7 @@ class Popover {
31658
31774
  const { onLifecycle, parentPopover, dismissOnSelect, side, arrow, htmlAttributes, focusTrap } = this;
31659
31775
  const desktop = isPlatform('desktop');
31660
31776
  const enableArrow = arrow && !parentPopover;
31661
- return (hAsync(Host, { key: '52ffc7116969ae1b8b927e67f2acbfe5f5434f70', "aria-modal": "true", "no-router": true, tabindex: "-1", ...htmlAttributes, style: {
31777
+ return (hAsync(Host, { key: 'b5e9c788f58397203976d5f8302dfb89e916efe1', "aria-modal": "true", "no-router": true, tabindex: "-1", ...htmlAttributes, style: {
31662
31778
  zIndex: `${20000 + this.overlayIndex}`,
31663
31779
  }, class: {
31664
31780
  ...getClassMap(this.cssClass),
@@ -31669,7 +31785,7 @@ class Popover {
31669
31785
  [`popover-side-${side}`]: true,
31670
31786
  [FOCUS_TRAP_DISABLE_CLASS]: focusTrap === false,
31671
31787
  'popover-nested': !!parentPopover,
31672
- }, onIonPopoverDidPresent: onLifecycle, onIonPopoverWillPresent: onLifecycle, onIonPopoverWillDismiss: onLifecycle, onIonPopoverDidDismiss: onLifecycle, onIonBackdropTap: this.onBackdropTap }, !parentPopover && hAsync("ion-backdrop", { key: '79a8e851dbd22119e21ffb2f4709c555251045c8', tappable: this.backdropDismiss, visible: this.showBackdrop, part: "backdrop" }), hAsync("div", { key: 'c46c9f62c3ef3f902e23f27404eaa446a5d8cf88', class: "popover-wrapper ion-overlay-wrapper", onClick: dismissOnSelect ? () => this.dismiss() : undefined }, enableArrow && hAsync("div", { key: '9fdcbbc4ea6c7bde74f646d48eb77296b2c9dd83', class: "popover-arrow", part: "arrow" }), hAsync("div", { key: '138e56bb83462ebb0908edb522b45ecf94b82aeb', class: "popover-content", part: "content" }, hAsync("slot", { key: 'daeefcf002e8d89e91d6e0faf7f63f75b68a2dbe' })))));
31788
+ }, onIonPopoverDidPresent: onLifecycle, onIonPopoverWillPresent: onLifecycle, onIonPopoverWillDismiss: onLifecycle, onIonPopoverDidDismiss: onLifecycle, onIonBackdropTap: this.onBackdropTap }, !parentPopover && hAsync("ion-backdrop", { key: 'f3977833c5b2c0087c286ee54363b478d69eb115', tappable: this.backdropDismiss, visible: this.showBackdrop, part: "backdrop" }), hAsync("div", { key: '1059893d6fd2932ca8adcdf8d45a5d66f4794727', class: "popover-wrapper ion-overlay-wrapper", onClick: dismissOnSelect ? () => this.dismiss() : undefined }, enableArrow && hAsync("div", { key: '24d7988bdd95882ad77fcaa7112aeda55878bee4', class: "popover-arrow", part: "arrow" }), hAsync("div", { key: '4d6992e0a9d629f11763045f9199f9a77fa521ab', class: "popover-content", part: "content" }, hAsync("slot", { key: 'b29747419620a01a6c34e9e846cd529b0b210145' })))));
31673
31789
  }
31674
31790
  get el() { return getElement(this); }
31675
31791
  static get watchers() { return {
@@ -42947,7 +43063,7 @@ var NAMESPACE = (
42947
43063
  );
42948
43064
 
42949
43065
  /*
42950
- Stencil Hydrate Runner v4.44.1 | MIT Licensed | https://stenciljs.com
43066
+ Stencil Hydrate Runner v4.44.2 | MIT Licensed | https://stenciljs.com
42951
43067
  */
42952
43068
  var __create = Object.create;
42953
43069
  var __defProp = Object.defineProperty;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ionic/core",
3
- "version": "9.0.1-nightly.20260825",
3
+ "version": "9.0.1",
4
4
  "description": "Base components for Ionic",
5
5
  "engines": {
6
6
  "node": ">= 16"
@@ -66,7 +66,7 @@
66
66
  "loader/"
67
67
  ],
68
68
  "dependencies": {
69
- "@stencil/core": "^4.44.1",
69
+ "@stencil/core": "^4.44.2",
70
70
  "ionicons": "^8.1.0",
71
71
  "tslib": "^2.1.0"
72
72
  },
@@ -86,7 +86,7 @@
86
86
  "@stencil/angular-output-target": "^1.4.1",
87
87
  "@stencil/react-output-target": "^1.6.2",
88
88
  "@stencil/sass": "^3.0.9",
89
- "@stencil/vue-output-target": "0.14.1",
89
+ "@stencil/vue-output-target": "0.14.2",
90
90
  "@types/jest": "^29.5.6",
91
91
  "@types/node": "^24.13.3",
92
92
  "@typescript-eslint/eslint-plugin": "^8.0.0",
@@ -1,4 +0,0 @@
1
- /*!
2
- * (C) Ionic http://ionicframework.com - MIT License
3
- */
4
- import{c as t}from"./p-DG-dUCKp.js";import{g as a}from"./p-ntAkt4Ra.js";const o=(o,r)=>{const i="40px",n="back"===r.direction,s=r.leavingEl,e=a(r.enteringEl),c=e.querySelector("ion-toolbar"),p=t();if(p.addElement(e).fill("both").beforeRemoveClass("ion-page-invisible"),n?p.duration((r.duration??0)||200).easing("cubic-bezier(0.47,0,0.745,0.715)"):p.duration((r.duration??0)||280).easing("cubic-bezier(0.36,0.66,0.04,1)").fromTo("transform",`translateY(${i})`,"translateY(0px)").fromTo("opacity",.01,1),c){const a=t();a.addElement(c),p.addAnimation(a)}if(s&&n){p.duration((r.duration??0)||200).easing("cubic-bezier(0.47,0,0.745,0.715)");const o=t();o.addElement(a(s)).onFinish((t=>{1===t&&o.elements.length>0&&o.elements[0].style.setProperty("display","none")})).fromTo("transform","translateY(0px)",`translateY(${i})`).fromTo("opacity",1,0),p.addAnimation(o)}return p};export{o as mdTransitionAnimation}
@@ -1,4 +0,0 @@
1
- /*!
2
- * (C) Ionic http://ionicframework.com - MIT License
3
- */
4
- import"./p-CpYeYl3u.js";const t=(t,e,n=["item-multiple-inputs"])=>{const i=t.closest("ion-item");if(!i||"undefined"==typeof MutationObserver)return;const r=()=>n.map((t=>i.classList.contains(t))).join(",");let s=r();const o=new MutationObserver((()=>{const t=r();t!==s&&(s=t,e())}));return o.observe(i,{attributes:!0,attributeFilter:["class"]}),o};export{t as c}