@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
@@ -7,3 +7,4 @@ export * from './apply-keyboard-focus';
7
7
  export * from './matchers';
8
8
  export * from './viewports';
9
9
  export * from './generator';
10
+ export * from './detach-reattach';
package/hydrate/index.js CHANGED
@@ -422,7 +422,7 @@ const appGlobalScript = initialize || (() => {});
422
422
  const globalScripts = appGlobalScript;
423
423
 
424
424
  /*
425
- Stencil Hydrate Platform v4.44.1 | MIT Licensed | https://stenciljs.com
425
+ Stencil Hydrate Platform v4.44.2 | MIT Licensed | https://stenciljs.com
426
426
  */
427
427
  var __create = Object.create;
428
428
  var __defProp = Object.defineProperty;
@@ -3229,8 +3229,6 @@ var setValue = (ref, propName, newVal, cmpMeta) => {
3229
3229
  }
3230
3230
  }
3231
3231
  };
3232
-
3233
- // src/runtime/proxy-component.ts
3234
3232
  var proxyComponent = (Cstr, cmpMeta, flags) => {
3235
3233
  var _a2;
3236
3234
  const prototype = Cstr.prototype;
@@ -7982,6 +7980,15 @@ const activeAnimations = new WeakMap();
7982
7980
  const isBackdropAlwaysBlocking = (el) => {
7983
7981
  return el.showBackdrop !== false && !((el.backdropBreakpoint ?? 0) > 0);
7984
7982
  };
7983
+ /**
7984
+ * Whether the overlay takes the app root out of the accessibility tree and
7985
+ * blocks body scroll while presented. Toasts never do, modal and popover can
7986
+ * opt out with `focusTrap={false}`, and a backdrop that does not block
7987
+ * (`showBackdrop={false}`, or a `backdropBreakpoint` above 0) is excluded.
7988
+ */
7989
+ const locksAppRoot = (el) => {
7990
+ return el.tagName !== 'ION-TOAST' && el.focusTrap !== false && isBackdropAlwaysBlocking(el);
7991
+ };
7985
7992
  const createController = (tagName) => {
7986
7993
  return {
7987
7994
  create(options) {
@@ -8350,6 +8357,13 @@ const getPresentedOverlay = (doc, overlayTag, id) => {
8350
8357
  // Otherwise, return the last overlay with the given id
8351
8358
  return (id === undefined ? overlays : overlays.filter((o) => o.id === id)).slice(-1)[0];
8352
8359
  };
8360
+ /**
8361
+ * The element an app nests its views under. Overlays hide this rather than the
8362
+ * whole root, so the overlay itself (a sibling) stays reachable.
8363
+ */
8364
+ const getViewContainer = () => {
8365
+ return getAppRoot(document).querySelector('ion-router-outlet, #ion-view-container-root');
8366
+ };
8353
8367
  /**
8354
8368
  * When an overlay is presented, the main
8355
8369
  * focus is the overlay not the page content.
@@ -8373,8 +8387,7 @@ const getPresentedOverlay = (doc, overlayTag, id) => {
8373
8387
  * for main content.
8374
8388
  */
8375
8389
  const setRootAriaHidden = (hidden = false) => {
8376
- const root = getAppRoot(document);
8377
- const viewContainer = root.querySelector('ion-router-outlet, #ion-view-container-root');
8390
+ const viewContainer = getViewContainer();
8378
8391
  if (!viewContainer) {
8379
8392
  return;
8380
8393
  }
@@ -8399,15 +8412,42 @@ const cleanupRootFocusTrapAccessibility = () => {
8399
8412
  return;
8400
8413
  }
8401
8414
  const remainingOverlays = getPresentedOverlays(document);
8402
- const hasRemainingLocking = remainingOverlays.some((o) => {
8403
- const el = o;
8404
- return el.tagName !== 'ION-TOAST' && el.focusTrap !== false && isBackdropAlwaysBlocking(el);
8405
- });
8415
+ const hasRemainingLocking = remainingOverlays.some((o) => locksAppRoot(o));
8406
8416
  if (!hasRemainingLocking) {
8407
8417
  setRootAriaHidden(false);
8408
8418
  document.body.classList.remove(BACKDROP_NO_SCROLL);
8409
8419
  }
8410
8420
  };
8421
+ /**
8422
+ * Applies the root lock itself: `aria-hidden` on the view container, and
8423
+ * `backdrop-no-scroll` on the body. Shared by `present()` and the restore
8424
+ * below, which have to stay in lockstep.
8425
+ */
8426
+ const applyRootLock = (el) => {
8427
+ // Hiding the container the overlay now sits in would hide the overlay too.
8428
+ if (!getViewContainer()?.contains(el)) {
8429
+ setRootAriaHidden(true);
8430
+ }
8431
+ document.body.classList.add(BACKDROP_NO_SCROLL);
8432
+ };
8433
+ /**
8434
+ * Re-applies the root lock that `cleanupRootFocusTrapAccessibility()` released.
8435
+ * Call from `connectedCallback` when the overlay is still presented.
8436
+ *
8437
+ * A synchronous move keeps the overlay connected, so the lock survives. A
8438
+ * detach with a re-insert in a later task releases it, which is the shape a
8439
+ * framework produces when it takes a subtree out and puts it back.
8440
+ */
8441
+ const restoreRootFocusTrapAccessibility = (overlayEl) => {
8442
+ if (typeof document === 'undefined') {
8443
+ return;
8444
+ }
8445
+ const el = overlayEl;
8446
+ if (!locksAppRoot(el)) {
8447
+ return;
8448
+ }
8449
+ applyRootLock(el);
8450
+ };
8411
8451
  const present = async (overlay, name, iosEnterAnimation, mdEnterAnimation, opts) => {
8412
8452
  if (overlay.presented) {
8413
8453
  return;
@@ -8424,15 +8464,7 @@ const present = async (overlay, name, iosEnterAnimation, mdEnterAnimation, opts)
8424
8464
  restoreElementFocus(overlay.el);
8425
8465
  }
8426
8466
  /**
8427
- * Due to accessibility guidelines, toasts do not have
8428
- * focus traps.
8429
- *
8430
- * All other overlays should have focus traps to prevent
8431
- * the keyboard focus from leaving the overlay unless
8432
- * developers explicitly opt out (for example, sheet
8433
- * modals that should permit background interaction).
8434
- *
8435
- * Note: Some apps move inline overlays to a specific container
8467
+ * Some apps move inline overlays to a specific container
8436
8468
  * during the willPresent lifecycle (e.g., React portals via
8437
8469
  * onWillPresent). Defer applying aria-hidden/inert to the app
8438
8470
  * root until after willPresent so we can detect where the
@@ -8441,18 +8473,11 @@ const present = async (overlay, name, iosEnterAnimation, mdEnterAnimation, opts)
8441
8473
  * to avoid disabling the overlay.
8442
8474
  */
8443
8475
  const overlayEl = overlay.el;
8444
- const shouldTrapFocus = overlayEl.tagName !== 'ION-TOAST' && overlayEl.focusTrap !== false;
8445
- const shouldLockRoot = shouldTrapFocus && isBackdropAlwaysBlocking(overlayEl);
8476
+ const shouldLockRoot = locksAppRoot(overlayEl);
8446
8477
  overlay.presented = true;
8447
8478
  overlay.willPresent.emit();
8448
8479
  if (shouldLockRoot) {
8449
- const root = getAppRoot(document);
8450
- const viewContainer = root.querySelector('ion-router-outlet, #ion-view-container-root');
8451
- const overlayInsideViewContainer = viewContainer ? viewContainer.contains(overlayEl) : false;
8452
- if (!overlayInsideViewContainer) {
8453
- setRootAriaHidden(true);
8454
- }
8455
- document.body.classList.add(BACKDROP_NO_SCROLL);
8480
+ applyRootLock(overlayEl);
8456
8481
  }
8457
8482
  overlay.willPresentShorthand?.emit();
8458
8483
  const mode = getIonMode$1(overlay);
@@ -8578,12 +8603,9 @@ const dismiss = async (overlay, data, role, name, iosLeaveAnimation, mdLeaveAnim
8578
8603
  * from the root element when the last focus-trapping overlay
8579
8604
  * is dismissed.
8580
8605
  */
8581
- const overlaysLockingRoot = presentedOverlays.filter((o) => {
8582
- const el = o;
8583
- return el.tagName !== 'ION-TOAST' && el.focusTrap !== false && isBackdropAlwaysBlocking(el);
8584
- });
8606
+ const overlaysLockingRoot = presentedOverlays.filter((o) => locksAppRoot(o));
8585
8607
  const overlayEl = overlay.el;
8586
- const locksRoot = overlayEl.tagName !== 'ION-TOAST' && overlayEl.focusTrap !== false && isBackdropAlwaysBlocking(overlayEl);
8608
+ const locksRoot = locksAppRoot(overlayEl);
8587
8609
  /**
8588
8610
  * If this is the last visible overlay that is trapping focus
8589
8611
  * then we want to re-add the root to the accessibility tree.
@@ -10579,6 +10601,13 @@ class ActionSheet {
10579
10601
  connectedCallback() {
10580
10602
  prepareOverlay(this.el);
10581
10603
  this.triggerChanged();
10604
+ // `componentDidLoad` only fires once per instance, so a reconnect has to
10605
+ // rebuild the gesture its disconnect destroyed.
10606
+ this.setupButtonActiveGesture();
10607
+ // Re-apply the root lock if moved without dismiss() being called
10608
+ if (this.presented) {
10609
+ restoreRootFocusTrapAccessibility(this.el);
10610
+ }
10582
10611
  }
10583
10612
  disconnectedCallback() {
10584
10613
  if (this.gesture) {
@@ -10598,24 +10627,33 @@ class ActionSheet {
10598
10627
  // Initialize activeRadioId for radio buttons
10599
10628
  this.buttonsChanged();
10600
10629
  }
10601
- componentDidLoad() {
10602
- /**
10603
- * Only create gesture if:
10604
- * 1. A gesture does not already exist
10605
- * 2. App is running in iOS mode
10606
- * 3. A wrapper ref exists
10607
- * 4. A group ref exists
10608
- */
10630
+ /**
10631
+ * Only create gesture if:
10632
+ * 1. A gesture does not already exist
10633
+ * 2. App is running in iOS mode
10634
+ * 3. A wrapper ref exists
10635
+ * 4. A group ref exists
10636
+ * 5. The host is still connected, since a reconnect can schedule this and
10637
+ * disconnect again before the task runs
10638
+ */
10639
+ setupButtonActiveGesture() {
10609
10640
  const { groupEl, wrapperEl } = this;
10610
- if (!this.gesture && getIonMode$1(this) === 'ios' && wrapperEl && groupEl) {
10611
- readTask(() => {
10612
- const isScrollable = groupEl.scrollHeight > groupEl.clientHeight;
10613
- if (!isScrollable) {
10614
- this.gesture = createButtonActiveGesture(wrapperEl, (refEl) => refEl.classList.contains('action-sheet-button'));
10615
- this.gesture.enable(true);
10616
- }
10617
- });
10641
+ if (getIonMode$1(this) !== 'ios' || !wrapperEl || !groupEl) {
10642
+ return;
10618
10643
  }
10644
+ readTask(() => {
10645
+ // Bail if a call queued ahead of this one already built the gesture
10646
+ // (a second would orphan the first with its listeners still bound), if
10647
+ // the host disconnected while this task waited, or if the group scrolls.
10648
+ if (this.gesture || !this.el.isConnected || groupEl.scrollHeight > groupEl.clientHeight) {
10649
+ return;
10650
+ }
10651
+ this.gesture = createButtonActiveGesture(wrapperEl, (refEl) => refEl.classList.contains('action-sheet-button'));
10652
+ this.gesture.enable(true);
10653
+ });
10654
+ }
10655
+ componentDidLoad() {
10656
+ this.setupButtonActiveGesture();
10619
10657
  /**
10620
10658
  * If action sheet was rendered with isOpen="true"
10621
10659
  * then we should open action sheet immediately.
@@ -10708,17 +10746,17 @@ class ActionSheet {
10708
10746
  const cancelButton = allButtons.find((b) => b.role === 'cancel');
10709
10747
  const buttons = allButtons.filter((b) => b.role !== 'cancel');
10710
10748
  const headerID = `action-sheet-${overlayIndex}-header`;
10711
- return (hAsync(Host, { key: '7685831da9a78b73473246a2cea95cefa79a53c3', role: "dialog", "aria-modal": "true", "aria-labelledby": header !== undefined ? headerID : null, tabindex: "-1", ...htmlAttributes, style: {
10749
+ return (hAsync(Host, { key: '83b47ea6b81d4eec6582c1dcaae6f267c78ba634', role: "dialog", "aria-modal": "true", "aria-labelledby": header !== undefined ? headerID : null, tabindex: "-1", ...htmlAttributes, style: {
10712
10750
  zIndex: `${20000 + this.overlayIndex}`,
10713
10751
  }, class: {
10714
10752
  [mode]: true,
10715
10753
  ...getClassMap(this.cssClass),
10716
10754
  'overlay-hidden': true,
10717
10755
  'action-sheet-translucent': this.translucent,
10718
- }, 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: {
10756
+ }, 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: {
10719
10757
  'action-sheet-title': true,
10720
10758
  'action-sheet-has-sub-title': this.subHeader !== undefined,
10721
- } }, 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" })));
10759
+ } }, 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" })));
10722
10760
  }
10723
10761
  get el() { return getElement(this); }
10724
10762
  static get watchers() { return {
@@ -11100,10 +11138,15 @@ class Alert {
11100
11138
  this.triggerChanged();
11101
11139
  /**
11102
11140
  * If the alert was previously connected and is being reattached, the
11103
- * ResizeObserver was disconnected. componentDidLoad only fires once per
11104
- * instance, so re-establish the observer here on reconnect.
11141
+ * `ResizeObserver` and the button gesture were torn down. `componentDidLoad`
11142
+ * only fires once per instance, so re-establish both here on reconnect.
11105
11143
  */
11106
11144
  this.setupButtonGroupResizeObserver();
11145
+ this.setupButtonActiveGesture();
11146
+ // Re-apply the root lock if moved without dismiss() being called
11147
+ if (this.presented) {
11148
+ restoreRootFocusTrapAccessibility(this.el);
11149
+ }
11107
11150
  }
11108
11151
  componentWillLoad() {
11109
11152
  if (!this.htmlAttributes?.id) {
@@ -11125,17 +11168,20 @@ class Alert {
11125
11168
  this.buttonGroupResizeObserver?.disconnect();
11126
11169
  this.buttonGroupResizeObserver = undefined;
11127
11170
  }
11128
- componentDidLoad() {
11129
- /**
11130
- * Only create gesture if:
11131
- * 1. A gesture does not already exist
11132
- * 2. App is running in iOS mode
11133
- * 3. A wrapper ref exists
11134
- */
11171
+ /**
11172
+ * Only create gesture if:
11173
+ * 1. A gesture does not already exist
11174
+ * 2. App is running in iOS mode
11175
+ * 3. A wrapper ref exists
11176
+ */
11177
+ setupButtonActiveGesture() {
11135
11178
  if (!this.gesture && getIonMode$1(this) === 'ios' && this.wrapperEl) {
11136
11179
  this.gesture = createButtonActiveGesture(this.wrapperEl, (refEl) => refEl.classList.contains('alert-button'));
11137
11180
  this.gesture.enable(true);
11138
11181
  }
11182
+ }
11183
+ componentDidLoad() {
11184
+ this.setupButtonActiveGesture();
11139
11185
  this.setupButtonGroupResizeObserver();
11140
11186
  /**
11141
11187
  * If alert was rendered with isOpen="true"
@@ -11456,14 +11502,14 @@ class Alert {
11456
11502
  * If neither are defined, do not set aria-labelledby.
11457
11503
  */
11458
11504
  const ariaLabelledBy = header && subHeader ? `${hdrId} ${subHdrId}` : header ? hdrId : subHeader ? subHdrId : null;
11459
- return (hAsync(Host, { key: '022f3463b8e6c52064b90ec304c524847c3d5ad3', tabindex: "-1", style: {
11505
+ return (hAsync(Host, { key: '083b5250dc4c76e85240e0225abcb7ca2b66de2f', tabindex: "-1", style: {
11460
11506
  zIndex: `${20000 + overlayIndex}`,
11461
11507
  }, class: {
11462
11508
  ...getClassMap(this.cssClass),
11463
11509
  [mode]: true,
11464
11510
  'overlay-hidden': true,
11465
11511
  'alert-translucent': this.translucent,
11466
- }, 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" })));
11512
+ }, 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" })));
11467
11513
  }
11468
11514
  get el() { return getElement(this); }
11469
11515
  static get watchers() { return {
@@ -22981,6 +23027,10 @@ class Loading {
22981
23027
  connectedCallback() {
22982
23028
  prepareOverlay(this.el);
22983
23029
  this.triggerChanged();
23030
+ // Re-apply the root lock if moved without dismiss() being called
23031
+ if (this.presented) {
23032
+ restoreRootFocusTrapAccessibility(this.el);
23033
+ }
22984
23034
  }
22985
23035
  componentWillLoad() {
22986
23036
  if (this.spinner === undefined) {
@@ -23081,14 +23131,14 @@ class Loading {
23081
23131
  * Otherwise, don't set aria-labelledby.
23082
23132
  */
23083
23133
  const ariaLabelledBy = message !== undefined ? msgId : null;
23084
- return (hAsync(Host, { key: '2d14122ff3081de73631a7fdd4affdd5c73b8618', role: "dialog", "aria-modal": "true", "aria-labelledby": ariaLabelledBy, tabindex: "-1", ...htmlAttributes, style: {
23134
+ return (hAsync(Host, { key: 'b4430bc66aedeca19d5645667cba73c169c4bd76', role: "dialog", "aria-modal": "true", "aria-labelledby": ariaLabelledBy, tabindex: "-1", ...htmlAttributes, style: {
23085
23135
  zIndex: `${40000 + this.overlayIndex}`,
23086
23136
  }, onIonBackdropTap: this.onBackdropTap, class: {
23087
23137
  ...getClassMap(this.cssClass),
23088
23138
  [mode]: true,
23089
23139
  'overlay-hidden': true,
23090
23140
  'loading-translucent': this.translucent,
23091
- } }, 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" })));
23141
+ } }, 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" })));
23092
23142
  }
23093
23143
  get el() { return getElement(this); }
23094
23144
  static get watchers() { return {
@@ -26647,6 +26697,9 @@ class Modal {
26647
26697
  this.inline = false;
26648
26698
  // Whether or not modal is being dismissed via gesture
26649
26699
  this.gestureAnimationDismissing = false;
26700
+ // True from the first safe-area write in `present()` until the enter
26701
+ // animation settles. A position-based read in that window is not the rest position.
26702
+ this.isPresenting = false;
26650
26703
  this.presented = false;
26651
26704
  /** @internal */
26652
26705
  this.hasController = false;
@@ -26883,6 +26936,17 @@ class Modal {
26883
26936
  const { el } = this;
26884
26937
  prepareOverlay(el);
26885
26938
  this.triggerChanged();
26939
+ // A disconnect tears down state this presentation still needs and cannot
26940
+ // tell a re-insert from a removal, so put it back.
26941
+ if (this.presented || this.isPresenting) {
26942
+ this.restoreSafeAreaOverrides();
26943
+ }
26944
+ // A relocation from `willPresent` reaches these before `present()` has
26945
+ // applied the lock, so they apply it instead. Both are idempotent.
26946
+ if (this.presented) {
26947
+ restoreRootFocusTrapAccessibility(el);
26948
+ this.initParentRemovalObserver();
26949
+ }
26886
26950
  }
26887
26951
  disconnectedCallback() {
26888
26952
  this.triggerController.removeClickListener();
@@ -27060,25 +27124,33 @@ class Modal {
27060
27124
  // Recalculate isSheetModal before safe-area setup because framework
27061
27125
  // bindings (e.g., Angular) may not have been applied when componentWillLoad ran.
27062
27126
  this.isSheetModal = this.breakpoints !== undefined && this.initialBreakpoint !== undefined;
27063
- // Set initial safe-area overrides before animation
27064
- this.setInitialSafeAreaOverrides();
27127
+ this.isPresenting = true;
27065
27128
  const hasCardModal = presentingElement !== undefined;
27066
- /**
27067
- * We need to change the status bar at the
27068
- * start of the animation so that it completes
27069
- * by the time the card animation is done.
27070
- */
27071
- if (hasCardModal && getIonMode$1(this) === 'ios') {
27072
- // Cache the original status bar color before the modal is presented
27073
- this.statusBarStyle = await StatusBar.getStyle();
27074
- setCardStatusBarDark();
27129
+ // Wrapped so a throw cannot strand `isPresenting`, which would suppress
27130
+ // the position-based correction for the life of this instance.
27131
+ try {
27132
+ // Set initial safe-area overrides before animation
27133
+ this.setInitialSafeAreaOverrides();
27134
+ /**
27135
+ * We need to change the status bar at the
27136
+ * start of the animation so that it completes
27137
+ * by the time the card animation is done.
27138
+ */
27139
+ if (hasCardModal && getIonMode$1(this) === 'ios') {
27140
+ // Cache the original status bar color before the modal is presented
27141
+ this.statusBarStyle = await StatusBar.getStyle();
27142
+ setCardStatusBarDark();
27143
+ }
27144
+ await present(this, 'modalEnter', iosEnterAnimation$2, mdEnterAnimation$2, {
27145
+ presentingEl: presentingElement,
27146
+ currentBreakpoint: this.initialBreakpoint,
27147
+ backdropBreakpoint: this.backdropBreakpoint,
27148
+ expandToScroll: this.expandToScroll,
27149
+ });
27150
+ }
27151
+ finally {
27152
+ this.isPresenting = false;
27075
27153
  }
27076
- await present(this, 'modalEnter', iosEnterAnimation$2, mdEnterAnimation$2, {
27077
- presentingEl: presentingElement,
27078
- currentBreakpoint: this.initialBreakpoint,
27079
- backdropBreakpoint: this.backdropBreakpoint,
27080
- expandToScroll: this.expandToScroll,
27081
- });
27082
27154
  // Update safe-area based on actual position after animation
27083
27155
  this.updateSafeAreaOverrides();
27084
27156
  // Apply fullscreen safe-area padding if needed
@@ -27580,6 +27652,9 @@ class Modal {
27580
27652
  this.cachedOriginalParent.tagName === 'ION-APP') {
27581
27653
  return;
27582
27654
  }
27655
+ // Both `present()` and a reconnect call this, so drop any existing
27656
+ // observer. Below the guards, so a call that bails cannot leave none.
27657
+ this.cleanupParentRemovalObserver();
27583
27658
  this.parentRemovalObserver = new MutationObserver((mutations) => {
27584
27659
  mutations.forEach((mutation) => {
27585
27660
  if (mutation.type === 'childList' && mutation.removedNodes.length > 0) {
@@ -27658,6 +27733,9 @@ class Modal {
27658
27733
  // Set the internal offset property with the resolved root safe-area-top value
27659
27734
  if (context.isSheetModal) {
27660
27735
  this.updateSheetOffsetTop();
27736
+ // A restore after a DOM move runs this a second time for the same
27737
+ // modal, so drop the previous subscription rather than stacking one.
27738
+ this.unsubscribeRootSafeAreaTop?.();
27661
27739
  this.unsubscribeRootSafeAreaTop = onRootSafeAreaTopChange((safeAreaTop) => this.updateSheetOffsetTop(safeAreaTop));
27662
27740
  }
27663
27741
  }
@@ -27776,6 +27854,31 @@ class Modal {
27776
27854
  const { contentEl } = this.findContentAndFooter();
27777
27855
  this.clearContentSafeAreaPadding(contentEl);
27778
27856
  }
27857
+ /**
27858
+ * Re-applies what `cleanupSafeAreaOverrides()` removed for a modal moved
27859
+ * while presented. Anything needing no measurement goes on synchronously so
27860
+ * the modal is never painted without safe-area. The position-based
27861
+ * correction waits a frame for the layout pass it reads.
27862
+ */
27863
+ restoreSafeAreaOverrides() {
27864
+ this.setInitialSafeAreaOverrides();
27865
+ this.applyFullscreenSafeArea();
27866
+ raf(() => {
27867
+ // A dismiss or another move can land first, and a read before the enter
27868
+ // animation settles is not the rest position. `present()` redoes it.
27869
+ if (!this.presented || !this.el.isConnected || this.isPresenting) {
27870
+ return;
27871
+ }
27872
+ // A hidden subtree carries `display: none`, so there is no box and the
27873
+ // read would write the safe-area for a modal touching no edge. The
27874
+ // prediction applied above holds until the modal is shown again.
27875
+ const { width, height } = this.el.getBoundingClientRect();
27876
+ if (width === 0 && height === 0) {
27877
+ return;
27878
+ }
27879
+ this.updateSafeAreaOverrides();
27880
+ });
27881
+ }
27779
27882
  render() {
27780
27883
  const { handle, isSheetModal, presentingElement, htmlAttributes, handleBehavior, inheritedAttributes, focusTrap, expandToScroll, } = this;
27781
27884
  const showHandle = handle !== false && isSheetModal;
@@ -27783,7 +27886,7 @@ class Modal {
27783
27886
  const isCardModal = presentingElement !== undefined && mode === 'ios';
27784
27887
  const isHandleCycle = handleBehavior === 'cycle';
27785
27888
  const isSheetModalWithHandle = isSheetModal && showHandle;
27786
- return (hAsync(Host, { key: 'a471c293319cb6ee5ffb7ffafec0b8413e4289de', "no-router": true,
27889
+ return (hAsync(Host, { key: '7c9c736052c5a788cf31040b6b2386dd9ea7454b', "no-router": true,
27787
27890
  // Allow the modal to be navigable when the handle is focusable
27788
27891
  tabIndex: isHandleCycle && isSheetModalWithHandle ? 0 : -1, ...htmlAttributes, style: {
27789
27892
  zIndex: `${20000 + this.overlayIndex}`,
@@ -27796,7 +27899,7 @@ class Modal {
27796
27899
  'overlay-hidden': true,
27797
27900
  [FOCUS_TRAP_DISABLE_CLASS]: focusTrap === false,
27798
27901
  ...getClassMap(this.cssClass),
27799
- }, 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',
27902
+ }, 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',
27800
27903
  /*
27801
27904
  role and aria-modal must be used on the
27802
27905
  same element. They must also be set inside the
@@ -27809,9 +27912,9 @@ class Modal {
27809
27912
  without the tabindex focus() would be a no-op and screen readers
27810
27913
  may not properly announce the dialog and its content when it opens.
27811
27914
  */
27812
- 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",
27915
+ 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",
27813
27916
  // Prevents the handle from receiving keyboard focus when it does not cycle
27814
- 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 }))));
27917
+ 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 }))));
27815
27918
  }
27816
27919
  get el() { return getElement(this); }
27817
27920
  static get watchers() { return {
@@ -31411,6 +31514,13 @@ class Popover {
31411
31514
  const { configureTriggerInteraction, el } = this;
31412
31515
  prepareOverlay(el);
31413
31516
  configureTriggerInteraction();
31517
+ // Re-apply the root lock if moved without dismiss() being called
31518
+ if (this.presented) {
31519
+ restoreRootFocusTrapAccessibility(el);
31520
+ // The disconnect tore down the header observer, and `present()` is its
31521
+ // only other caller, so a move mid-layout would lose the recalculation.
31522
+ this.recalculateContentOnHeaderReady();
31523
+ }
31414
31524
  }
31415
31525
  disconnectedCallback() {
31416
31526
  const { destroyTriggerInteraction } = this;
@@ -31588,6 +31698,12 @@ class Popover {
31588
31698
  if (!header || contentElements.length === 0) {
31589
31699
  return;
31590
31700
  }
31701
+ // Both `present()` and a reconnect call this, so drop any existing
31702
+ // observer. Below the guards, so a call that bails cannot leave none.
31703
+ if (this.headerResizeObserver) {
31704
+ this.headerResizeObserver.disconnect();
31705
+ this.headerResizeObserver = undefined;
31706
+ }
31591
31707
  this.headerResizeObserver = new ResizeObserver(async () => {
31592
31708
  if (header.offsetHeight > 0) {
31593
31709
  this.headerResizeObserver?.disconnect();
@@ -31660,7 +31776,7 @@ class Popover {
31660
31776
  const { onLifecycle, parentPopover, dismissOnSelect, side, arrow, htmlAttributes, focusTrap } = this;
31661
31777
  const desktop = isPlatform('desktop');
31662
31778
  const enableArrow = arrow && !parentPopover;
31663
- return (hAsync(Host, { key: '52ffc7116969ae1b8b927e67f2acbfe5f5434f70', "aria-modal": "true", "no-router": true, tabindex: "-1", ...htmlAttributes, style: {
31779
+ return (hAsync(Host, { key: 'b5e9c788f58397203976d5f8302dfb89e916efe1', "aria-modal": "true", "no-router": true, tabindex: "-1", ...htmlAttributes, style: {
31664
31780
  zIndex: `${20000 + this.overlayIndex}`,
31665
31781
  }, class: {
31666
31782
  ...getClassMap(this.cssClass),
@@ -31671,7 +31787,7 @@ class Popover {
31671
31787
  [`popover-side-${side}`]: true,
31672
31788
  [FOCUS_TRAP_DISABLE_CLASS]: focusTrap === false,
31673
31789
  'popover-nested': !!parentPopover,
31674
- }, 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' })))));
31790
+ }, 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' })))));
31675
31791
  }
31676
31792
  get el() { return getElement(this); }
31677
31793
  static get watchers() { return {
@@ -42949,7 +43065,7 @@ var NAMESPACE = (
42949
43065
  );
42950
43066
 
42951
43067
  /*
42952
- Stencil Hydrate Runner v4.44.1 | MIT Licensed | https://stenciljs.com
43068
+ Stencil Hydrate Runner v4.44.2 | MIT Licensed | https://stenciljs.com
42953
43069
  */
42954
43070
  var __create = Object.create;
42955
43071
  var __defProp = Object.defineProperty;