@ionic/core 9.0.1-dev.11788212611.154b1596 → 9.0.1-dev.11788285010.17561004

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 (461) 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/{dist/ionic/p-BpG7jkT9.js → components/p-66ogmUZU.js} +1 -1
  99. package/components/p-6Vp915Y7.js +4 -0
  100. package/components/{p-B2L09UOs.js → p-7PNwKFZi.js} +1 -1
  101. package/components/{p-C8mPeq0D.js → p-A8MJRBIY.js} +1 -1
  102. package/components/p-AQcCdH2_.js +4 -0
  103. package/components/{p-DkEb3SCT.js → p-B6x5_b9w.js} +1 -1
  104. package/components/{p-CDKY4TZ_.js → p-B8MQjdvk.js} +1 -1
  105. package/components/{p-CLZPNP7x.js → p-BA_4ZIEg.js} +1 -1
  106. package/components/{p-CyKlfXdt.js → p-BFtL8t1r.js} +1 -1
  107. package/components/{p-RRH-7cpd.js → p-BMfgF-Tv.js} +1 -1
  108. package/components/{p-l-zxxFre.js → p-BPDxVIRr.js} +1 -1
  109. package/{dist/ionic/p-BC17SPKH.js → components/p-BSARlp49.js} +1 -1
  110. package/components/p-BdwCtX8Y.js +4 -0
  111. package/components/p-Bg4OwDwb.js +4 -0
  112. package/components/{p-CBhGZ6rF.js → p-BgUIV8NQ.js} +1 -1
  113. package/components/{p-CxiXpCtB.js → p-Bnc0m4SW.js} +1 -1
  114. package/components/{p-7qDu1bID.js → p-BpLt_Ptn.js} +1 -1
  115. package/components/{p-C12SAK00.js → p-BqBDq1Ma.js} +1 -1
  116. package/components/{p-mXsQnyWB.js → p-BrFaQbGY.js} +1 -1
  117. package/{dist/ionic/p-CoEa7CiN.js → components/p-BuPAFTWI.js} +1 -1
  118. package/components/{p-CB06XtlF.js → p-Bx2saTHs.js} +1 -1
  119. package/components/p-BxhE2W85.js +4 -0
  120. package/components/p-CHswSpKy.js +4 -0
  121. package/components/p-CQAjyETU.js +4 -0
  122. package/components/p-CR9OgE6N.js +4 -0
  123. package/components/{p-CEkamjav.js → p-CWETxTjE.js} +1 -1
  124. package/components/p-CaZeZIL2.js +4 -0
  125. package/components/{p-Dq1-WhnV.js → p-CaiZOhfC.js} +1 -1
  126. package/components/{p-BFwL2yyK.js → p-CgvDC7hC.js} +1 -1
  127. package/components/p-CqyGR9Aq.js +4 -0
  128. package/components/{p-DMkSsriG.js → p-D7ysFE2B.js} +1 -1
  129. package/components/p-DCWfzDM8.js +4 -0
  130. package/{dist/ionic/p-DA88iqXQ.js → components/p-DDdkefwf.js} +1 -1
  131. package/components/{p-CJTKYpZv.js → p-DEW7CnUc.js} +1 -1
  132. package/components/p-DQ1IPvZO.js +4 -0
  133. package/components/{p-BAJ7NctL.js → p-DcOH6-o5.js} +1 -1
  134. package/components/p-DfdYCsov.js +4 -0
  135. package/{dist/ionic/p-DoUx_N0R.js → components/p-DhOoEIAs.js} +1 -1
  136. package/components/p-Dl_7b_UJ.js +4 -0
  137. package/components/p-DqAI6tg7.js +4 -0
  138. package/components/p-DrehWDfv.js +4 -0
  139. package/components/{p-BWHBdLfY.js → p-DysqCsJu.js} +1 -1
  140. package/components/{p-BqE7e5gH.js → p-H1f2qsk4.js} +1 -1
  141. package/components/p-HVYBAhFx.js +4 -0
  142. package/components/{p-BE9noJ1O.js → p-Kmrg3Fed.js} +1 -1
  143. package/{dist/ionic/p-wdSUbx5C.js → components/p-RFfE9hF6.js} +1 -1
  144. package/components/{p-Bcm-GVQM.js → p-SR-LLqp_.js} +1 -1
  145. package/components/p-eFI3mtEX.js +4 -0
  146. package/components/{p-5rFO7X8J.js → p-gFwXiYC_.js} +1 -1
  147. package/components/{p-COxY7PLK.js → p-tX3UxCnU.js} +1 -1
  148. package/components/{p-VTfnz_8u.js → p-v2NpoOHp.js} +1 -1
  149. package/css/core.css +1 -1
  150. package/css/core.css.map +1 -1
  151. package/css/ionic.bundle.css +1 -1
  152. package/css/ionic.bundle.css.map +1 -1
  153. package/dist/cjs/{animation-ihPP_z2n.js → animation-D-OqR4a4.js} +1 -1
  154. package/dist/cjs/{app-globals-BlkzA410.js → app-globals-BzgwARwJ.js} +1 -1
  155. package/dist/cjs/{button-active-ItGBjzmO.js → button-active-BlWSD7uK.js} +1 -1
  156. package/dist/cjs/{format-CPIqtp4x.js → format-D7ig6Vm0.js} +1 -1
  157. package/dist/cjs/{framework-delegate-DhyWUPGg.js → framework-delegate-BZUx4TnE.js} +1 -1
  158. package/dist/cjs/{hardware-back-button-D5f_kASb.js → hardware-back-button-JOAEFSzc.js} +1 -1
  159. package/dist/cjs/{helpers-BCLkFTTd.js → helpers-Dj5o76mq.js} +1 -1
  160. package/dist/cjs/{index-CldjPPyP.js → index-2sO-zkZ2.js} +4 -4
  161. package/dist/cjs/{index-Bgz6BcKx.js → index-BrVMoqUk.js} +16 -50
  162. package/dist/cjs/{index-49DTLc_Z.js → index-C8zH6b3d.js} +2 -2
  163. package/dist/cjs/{index-BcyiqD6R.js → index-CZ6vzt_q.js} +5 -5
  164. package/dist/cjs/{index-xum7jdbq.js → index-Csue6G3m.js} +2 -2
  165. package/dist/cjs/{index-BocV_y-c.js → index-EJLjthTK.js} +1 -2
  166. package/dist/cjs/index.cjs.js +12 -12
  167. package/dist/cjs/{input-shims-Jisy7U7-.js → input-shims-Bh7bnt2v.js} +3 -3
  168. package/dist/cjs/{input.utils-BDTpGrfn.js → input.utils-Cq3g9uHy.js} +1 -1
  169. package/dist/cjs/ion-accordion_2.cjs.entry.js +3 -3
  170. package/dist/cjs/ion-action-sheet.cjs.entry.js +29 -45
  171. package/dist/cjs/ion-alert.cjs.entry.js +21 -29
  172. package/dist/cjs/ion-app_8.cjs.entry.js +16 -93
  173. package/dist/cjs/ion-avatar_3.cjs.entry.js +2 -2
  174. package/dist/cjs/ion-back-button.cjs.entry.js +3 -3
  175. package/dist/cjs/ion-backdrop.cjs.entry.js +2 -2
  176. package/dist/cjs/ion-breadcrumb_2.cjs.entry.js +3 -3
  177. package/dist/cjs/ion-button_2.cjs.entry.js +3 -3
  178. package/dist/cjs/ion-card_5.cjs.entry.js +3 -3
  179. package/dist/cjs/ion-checkbox.cjs.entry.js +4 -4
  180. package/dist/cjs/ion-chip.cjs.entry.js +2 -2
  181. package/dist/cjs/ion-col_3.cjs.entry.js +2 -2
  182. package/dist/cjs/ion-datetime-button.cjs.entry.js +4 -4
  183. package/dist/cjs/ion-datetime.cjs.entry.js +24 -32
  184. package/dist/cjs/ion-fab_3.cjs.entry.js +3 -3
  185. package/dist/cjs/ion-img.cjs.entry.js +3 -3
  186. package/dist/cjs/ion-infinite-scroll_2.cjs.entry.js +5 -5
  187. package/dist/cjs/ion-input-otp.cjs.entry.js +3 -3
  188. package/dist/cjs/ion-input-password-toggle.cjs.entry.js +2 -2
  189. package/dist/cjs/ion-input.cjs.entry.js +5 -5
  190. package/dist/cjs/ion-item-option_3.cjs.entry.js +15 -13
  191. package/dist/cjs/ion-item_8.cjs.entry.js +3 -3
  192. package/dist/cjs/ion-loading.cjs.entry.js +10 -14
  193. package/dist/cjs/ion-menu_3.cjs.entry.js +8 -8
  194. package/dist/cjs/ion-modal.cjs.entry.js +32 -85
  195. package/dist/cjs/ion-nav_2.cjs.entry.js +6 -6
  196. package/dist/cjs/ion-picker-column-option.cjs.entry.js +3 -3
  197. package/dist/cjs/ion-picker-column.cjs.entry.js +46 -210
  198. package/dist/cjs/ion-picker.cjs.entry.js +2 -2
  199. package/dist/cjs/ion-popover.cjs.entry.js +10 -23
  200. package/dist/cjs/ion-progress-bar.cjs.entry.js +3 -3
  201. package/dist/cjs/ion-radio_2.cjs.entry.js +4 -4
  202. package/dist/cjs/ion-range.cjs.entry.js +4 -4
  203. package/dist/cjs/ion-refresher_2.cjs.entry.js +6 -6
  204. package/dist/cjs/ion-reorder_2.cjs.entry.js +4 -4
  205. package/dist/cjs/ion-ripple-effect.cjs.entry.js +2 -2
  206. package/dist/cjs/ion-route_4.cjs.entry.js +4 -4
  207. package/dist/cjs/ion-searchbar.cjs.entry.js +3 -3
  208. package/dist/cjs/ion-segment-content.cjs.entry.js +1 -1
  209. package/dist/cjs/ion-segment-view.cjs.entry.js +1 -1
  210. package/dist/cjs/ion-segment_2.cjs.entry.js +10 -14
  211. package/dist/cjs/ion-select-modal.cjs.entry.js +8 -8
  212. package/dist/cjs/ion-select_3.cjs.entry.js +47 -57
  213. package/dist/cjs/ion-spinner.cjs.entry.js +2 -2
  214. package/dist/cjs/ion-split-pane.cjs.entry.js +2 -2
  215. package/dist/cjs/ion-tab-bar_2.cjs.entry.js +3 -3
  216. package/dist/cjs/ion-tab_2.cjs.entry.js +3 -3
  217. package/dist/cjs/ion-text.cjs.entry.js +2 -2
  218. package/dist/cjs/ion-textarea.cjs.entry.js +5 -5
  219. package/dist/cjs/ion-toast.cjs.entry.js +8 -8
  220. package/dist/cjs/ion-toggle.cjs.entry.js +4 -4
  221. package/dist/cjs/{ionic-global-BMU-Us1Q.js → ionic-global-DvgIzM2F.js} +1 -1
  222. package/dist/cjs/ionic.cjs.js +4 -4
  223. package/dist/cjs/{ios.transition-OCcCN--B.js → ios.transition-zIgdoSYe.js} +4 -4
  224. package/dist/cjs/{item-multiple-inputs-BH9yPC66.js → item-multiple-inputs-DG-ZGm6j.js} +1 -1
  225. package/dist/cjs/loader.cjs.js +3 -3
  226. package/dist/cjs/{md.transition-D0o2IIbo.js → md.transition-CXeJ9rfh.js} +4 -4
  227. package/dist/cjs/{overlays-HN9joo1Z.js → overlays-Bg0auTQa.js} +34 -59
  228. package/dist/cjs/{select-option-render-BPjGDlsG.js → select-option-render-7m1WdFzF.js} +2 -2
  229. package/dist/cjs/{slot-mutation-controller-IQ250LoG.js → slot-mutation-controller-BJEJzx_e.js} +1 -1
  230. package/dist/cjs/{status-tap-Bakl9czs.js → status-tap-DxbUM5XX.js} +3 -3
  231. package/dist/cjs/{swipe-back-Cv4OZVJ5.js → swipe-back-F_DBt-Aw.js} +2 -2
  232. package/dist/collection/collection-manifest.json +1 -1
  233. package/dist/collection/components/action-sheet/action-sheet.js +20 -36
  234. package/dist/collection/components/alert/alert.js +12 -20
  235. package/dist/collection/components/content/content.js +4 -81
  236. package/dist/collection/components/datetime/datetime.js +17 -25
  237. package/dist/collection/components/item-sliding/item-sliding.js +12 -10
  238. package/dist/collection/components/loading/loading.js +3 -7
  239. package/dist/collection/components/modal/modal.ios.css +1 -12
  240. package/dist/collection/components/modal/modal.js +22 -75
  241. package/dist/collection/components/modal/modal.md.css +1 -12
  242. package/dist/collection/components/picker-column/picker-column.js +43 -207
  243. package/dist/collection/components/popover/popover.js +3 -16
  244. package/dist/collection/components/segment-button/segment-button.js +7 -11
  245. package/dist/collection/components/select/select.js +39 -49
  246. package/dist/collection/utils/overlays.js +29 -53
  247. package/dist/collection/utils/test/playwright/index.js +0 -1
  248. package/dist/docs.json +48 -279
  249. package/dist/esm/{animation-B6KGUJwl.js → animation-TxGPYeDn.js} +1 -1
  250. package/dist/esm/{app-globals-BvutUX8P.js → app-globals-Do8rJest.js} +1 -1
  251. package/dist/esm/{button-active-DRNebs9r.js → button-active-ChA4D-ml.js} +1 -1
  252. package/dist/esm/{format-BF3btM7P.js → format-CVk5e_GP.js} +1 -1
  253. package/dist/esm/{framework-delegate-60cEIAgt.js → framework-delegate-DaLWnISz.js} +1 -1
  254. package/dist/esm/{hardware-back-button-rhkwRNk2.js → hardware-back-button-D8W4L0JP.js} +1 -1
  255. package/dist/esm/{helpers-DLLANtRS.js → helpers-BIgoInJU.js} +1 -1
  256. package/dist/esm/{index-DOrtAUWV.js → index-BmOR8tCv.js} +2 -2
  257. package/dist/esm/{index-D_7MeuVD.js → index-C5ZdL0qp.js} +5 -5
  258. package/dist/esm/{index-BZHVn0iF.js → index-C8Dsa6li.js} +4 -4
  259. package/dist/esm/{index-h81G-QbJ.js → index-CKYcsw8f.js} +16 -50
  260. package/dist/esm/{index-Bl4BUvBL.js → index-DHw2lZxe.js} +2 -2
  261. package/dist/esm/{index-JgU5uTSY.js → index-elneMH8y.js} +2 -2
  262. package/dist/esm/index.js +12 -12
  263. package/dist/esm/{input-shims-C2ipc_XX.js → input-shims-09NN97kF.js} +3 -3
  264. package/dist/esm/{input.utils-D-qoPjqr.js → input.utils-BxyH9l1w.js} +1 -1
  265. package/dist/esm/ion-accordion_2.entry.js +3 -3
  266. package/dist/esm/ion-action-sheet.entry.js +29 -45
  267. package/dist/esm/ion-alert.entry.js +21 -29
  268. package/dist/esm/ion-app_8.entry.js +16 -93
  269. package/dist/esm/ion-avatar_3.entry.js +2 -2
  270. package/dist/esm/ion-back-button.entry.js +3 -3
  271. package/dist/esm/ion-backdrop.entry.js +2 -2
  272. package/dist/esm/ion-breadcrumb_2.entry.js +3 -3
  273. package/dist/esm/ion-button_2.entry.js +3 -3
  274. package/dist/esm/ion-card_5.entry.js +3 -3
  275. package/dist/esm/ion-checkbox.entry.js +4 -4
  276. package/dist/esm/ion-chip.entry.js +2 -2
  277. package/dist/esm/ion-col_3.entry.js +2 -2
  278. package/dist/esm/ion-datetime-button.entry.js +4 -4
  279. package/dist/esm/ion-datetime.entry.js +24 -32
  280. package/dist/esm/ion-fab_3.entry.js +3 -3
  281. package/dist/esm/ion-img.entry.js +3 -3
  282. package/dist/esm/ion-infinite-scroll_2.entry.js +5 -5
  283. package/dist/esm/ion-input-otp.entry.js +3 -3
  284. package/dist/esm/ion-input-password-toggle.entry.js +2 -2
  285. package/dist/esm/ion-input.entry.js +5 -5
  286. package/dist/esm/ion-item-option_3.entry.js +15 -13
  287. package/dist/esm/ion-item_8.entry.js +3 -3
  288. package/dist/esm/ion-loading.entry.js +10 -14
  289. package/dist/esm/ion-menu_3.entry.js +8 -8
  290. package/dist/esm/ion-modal.entry.js +32 -85
  291. package/dist/esm/ion-nav_2.entry.js +6 -6
  292. package/dist/esm/ion-picker-column-option.entry.js +3 -3
  293. package/dist/esm/ion-picker-column.entry.js +47 -211
  294. package/dist/esm/ion-picker.entry.js +2 -2
  295. package/dist/esm/ion-popover.entry.js +10 -23
  296. package/dist/esm/ion-progress-bar.entry.js +3 -3
  297. package/dist/esm/ion-radio_2.entry.js +4 -4
  298. package/dist/esm/ion-range.entry.js +4 -4
  299. package/dist/esm/ion-refresher_2.entry.js +6 -6
  300. package/dist/esm/ion-reorder_2.entry.js +4 -4
  301. package/dist/esm/ion-ripple-effect.entry.js +2 -2
  302. package/dist/esm/ion-route_4.entry.js +4 -4
  303. package/dist/esm/ion-searchbar.entry.js +3 -3
  304. package/dist/esm/ion-segment-content.entry.js +1 -1
  305. package/dist/esm/ion-segment-view.entry.js +1 -1
  306. package/dist/esm/ion-segment_2.entry.js +10 -14
  307. package/dist/esm/ion-select-modal.entry.js +8 -8
  308. package/dist/esm/ion-select_3.entry.js +47 -57
  309. package/dist/esm/ion-spinner.entry.js +2 -2
  310. package/dist/esm/ion-split-pane.entry.js +2 -2
  311. package/dist/esm/ion-tab-bar_2.entry.js +3 -3
  312. package/dist/esm/ion-tab_2.entry.js +3 -3
  313. package/dist/esm/ion-text.entry.js +2 -2
  314. package/dist/esm/ion-textarea.entry.js +5 -5
  315. package/dist/esm/ion-toast.entry.js +8 -8
  316. package/dist/esm/ion-toggle.entry.js +4 -4
  317. package/dist/esm/{ionic-global-B7I1sdvg.js → ionic-global-lrowsHfi.js} +1 -1
  318. package/dist/esm/ionic.js +5 -5
  319. package/dist/esm/{ios.transition-C-6IaIxe.js → ios.transition-BQhADrk1.js} +4 -4
  320. package/dist/esm/{item-multiple-inputs-DI91syHS.js → item-multiple-inputs-D_N3fDkD.js} +1 -1
  321. package/dist/esm/loader.js +4 -4
  322. package/dist/esm/{md.transition-dyqt0t0d.js → md.transition-D58NpmRa.js} +4 -4
  323. package/dist/esm/{overlays-Dz2cGX5q.js → overlays-BpnIFlXI.js} +35 -59
  324. package/dist/esm/{select-option-render-CUJpruSC.js → select-option-render-lIuu64EV.js} +2 -2
  325. package/dist/esm/{slot-mutation-controller-wFuztlVD.js → slot-mutation-controller-rS_T3FDR.js} +1 -1
  326. package/dist/esm/{status-tap-Dn_42wiy.js → status-tap-CpFQMLl6.js} +3 -3
  327. package/dist/esm/{swipe-back-CqOqrHW7.js → swipe-back-rmc7zeNW.js} +2 -2
  328. package/dist/ionic/index.esm.js +1 -1
  329. package/dist/ionic/ionic.esm.js +1 -1
  330. package/dist/ionic/{p-025763b2.entry.js → p-05800a02.entry.js} +1 -1
  331. package/dist/ionic/p-0eb50dca.entry.js +4 -0
  332. package/dist/ionic/{p-0b52d921.entry.js → p-16e9f542.entry.js} +1 -1
  333. package/dist/ionic/p-18d532a3.entry.js +4 -0
  334. package/dist/ionic/{p-a2fccdaa.entry.js → p-1db2afb4.entry.js} +1 -1
  335. package/dist/ionic/{p-5ed60413.entry.js → p-1df75f9e.entry.js} +1 -1
  336. package/dist/ionic/{p-2ff12c8a.entry.js → p-295ff427.entry.js} +1 -1
  337. package/dist/ionic/p-34b9379b.entry.js +4 -0
  338. package/dist/ionic/{p-cc749877.entry.js → p-39a8d4e0.entry.js} +1 -1
  339. package/dist/ionic/p-4437015c.entry.js +4 -0
  340. package/dist/ionic/{p-53ba5651.entry.js → p-478035a7.entry.js} +1 -1
  341. package/dist/ionic/{p-1a20571c.entry.js → p-485fb218.entry.js} +1 -1
  342. package/dist/ionic/p-48c859fe.entry.js +4 -0
  343. package/dist/ionic/p-49b9d405.entry.js +4 -0
  344. package/dist/ionic/{p-d1539609.entry.js → p-56307aea.entry.js} +1 -1
  345. package/dist/ionic/{p-eeb65463.entry.js → p-5ee2d7b1.entry.js} +1 -1
  346. package/dist/ionic/{p-ca57763d.entry.js → p-5f216b79.entry.js} +1 -1
  347. package/dist/ionic/{p-fb4dabbb.entry.js → p-61c799d1.entry.js} +1 -1
  348. package/dist/ionic/{p-fe80ebb1.entry.js → p-63bbba8d.entry.js} +1 -1
  349. package/dist/ionic/p-68507e70.entry.js +4 -0
  350. package/dist/ionic/{p-43bae3f5.entry.js → p-6f048604.entry.js} +1 -1
  351. package/dist/ionic/{p-dadcb3d2.entry.js → p-70ee8888.entry.js} +1 -1
  352. package/dist/ionic/{p-7c859f42.entry.js → p-72ad7c64.entry.js} +1 -1
  353. package/dist/ionic/{p-90e06e60.entry.js → p-75887ee0.entry.js} +1 -1
  354. package/dist/ionic/{p-bdc01880.entry.js → p-873a315a.entry.js} +1 -1
  355. package/dist/ionic/{p-f0645c98.entry.js → p-881b6954.entry.js} +1 -1
  356. package/dist/ionic/p-886d9e66.entry.js +4 -0
  357. package/dist/ionic/{p-5dc53bdf.entry.js → p-8dd4c026.entry.js} +1 -1
  358. package/dist/ionic/{p-9f2d3987.entry.js → p-8e007f11.entry.js} +1 -1
  359. package/dist/ionic/p-8f464a8f.entry.js +4 -0
  360. package/dist/ionic/p-8f51110d.entry.js +4 -0
  361. package/dist/ionic/{p-1f66c230.entry.js → p-90ba736e.entry.js} +1 -1
  362. package/dist/ionic/{p-8d72244b.entry.js → p-959df5f8.entry.js} +1 -1
  363. package/dist/ionic/{p-8e388a30.entry.js → p-9e455875.entry.js} +1 -1
  364. package/{components/p-BcuLPPAE.js → dist/ionic/p-9wczfs_v.js} +1 -1
  365. package/dist/ionic/{p-C10K-FJg.js → p-B1Y7LZhV.js} +1 -1
  366. package/dist/ionic/p-B5RyLYvl.js +4 -0
  367. package/dist/ionic/p-BQv5i5Kf.js +4 -0
  368. package/dist/ionic/{p-CH8tk7Pr.js → p-BZVE25Gu.js} +1 -1
  369. package/{components/p-CdSLe3Q3.js → dist/ionic/p-BZxjcGRP.js} +1 -1
  370. package/dist/ionic/p-BnGA34Pd.js +4 -0
  371. package/dist/ionic/{p-Q9w8L_Sw.js → p-ByLaqOPm.js} +1 -1
  372. package/dist/ionic/p-C06QNN45.js +4 -0
  373. package/dist/ionic/{p-KJ5pLPiN.js → p-C4IBDDj6.js} +1 -1
  374. package/dist/ionic/p-CCVlNZ__.js +4 -0
  375. package/dist/ionic/{p-CTBfxfjC.js → p-CDBop-kz.js} +1 -1
  376. package/dist/ionic/p-CKYcsw8f.js +5 -0
  377. package/dist/ionic/p-CazSodad.js +4 -0
  378. package/dist/ionic/{p-S1shXW5M.js → p-ClrlQU2y.js} +1 -1
  379. package/{components/p-DG-dUCKp.js → dist/ionic/p-D0dfUysx.js} +1 -1
  380. package/dist/ionic/{p-C2BY_4Wp.js → p-D9yvytgv.js} +1 -1
  381. package/{components/p-DH0rRXjx.js → dist/ionic/p-DF_Uqql8.js} +1 -1
  382. package/dist/ionic/{p-DMj-M2c4.js → p-DXJgZWgi.js} +1 -1
  383. package/dist/ionic/p-DdhHqKj-.js +4 -0
  384. package/dist/ionic/{p-BRc8gq5v.js → p-De0eY881.js} +1 -1
  385. package/dist/ionic/p-DgUL3JbO.js +4 -0
  386. package/dist/ionic/{p-06ZcwRF5.js → p-RzUn7cKs.js} +1 -1
  387. package/dist/ionic/p-VquyMbjp.js +4 -0
  388. package/dist/ionic/{p-2aabd568.entry.js → p-a0fee899.entry.js} +1 -1
  389. package/dist/ionic/{p-9e688396.entry.js → p-a54bcd16.entry.js} +1 -1
  390. package/dist/ionic/{p-eaeac54e.entry.js → p-aebc4d69.entry.js} +1 -1
  391. package/dist/ionic/{p-9452849d.entry.js → p-b5f37106.entry.js} +1 -1
  392. package/dist/ionic/{p-082b8125.entry.js → p-b62bfce8.entry.js} +1 -1
  393. package/dist/ionic/p-b7a11b58.entry.js +4 -0
  394. package/dist/ionic/{p-546b1109.entry.js → p-bbf6878c.entry.js} +1 -1
  395. package/dist/ionic/{p-e93cc1e1.entry.js → p-c49165af.entry.js} +1 -1
  396. package/dist/ionic/{p-9eba0d8a.entry.js → p-cad4eccf.entry.js} +1 -1
  397. package/dist/ionic/{p-d1b888de.entry.js → p-cdc5115e.entry.js} +1 -1
  398. package/dist/ionic/{p-47b8b59a.entry.js → p-d3384a40.entry.js} +1 -1
  399. package/dist/ionic/{p-f607ad4f.entry.js → p-d8bae128.entry.js} +1 -1
  400. package/dist/ionic/{p-026e2e4c.entry.js → p-d8deff43.entry.js} +1 -1
  401. package/dist/ionic/{p-6d84fa9f.entry.js → p-ddfb7e5f.entry.js} +1 -1
  402. package/dist/ionic/{p-ecfc9c71.entry.js → p-e538f18d.entry.js} +1 -1
  403. package/dist/ionic/{p-83aa7d47.entry.js → p-f376876b.entry.js} +1 -1
  404. package/dist/ionic/p-f521b13c.entry.js +4 -0
  405. package/dist/ionic/{p-ac71362a.entry.js → p-fbd83d4c.entry.js} +1 -1
  406. package/dist/types/components/action-sheet/action-sheet.d.ts +0 -10
  407. package/dist/types/components/alert/alert.d.ts +0 -7
  408. package/dist/types/components/content/content.d.ts +0 -24
  409. package/dist/types/components/modal/modal.d.ts +0 -8
  410. package/dist/types/components/picker-column/picker-column.d.ts +0 -42
  411. package/dist/types/components.d.ts +1 -1
  412. package/dist/types/stencil-public-runtime.d.ts +0 -12
  413. package/dist/types/utils/overlays.d.ts +0 -9
  414. package/dist/types/utils/test/playwright/index.d.ts +0 -1
  415. package/hydrate/index.js +213 -596
  416. package/hydrate/index.mjs +213 -596
  417. package/loader/index.d.ts +1 -1
  418. package/package.json +2 -2
  419. package/components/p-BhlP16sB.js +0 -4
  420. package/components/p-C8Tp0cQy.js +0 -4
  421. package/components/p-CFtAWaB6.js +0 -4
  422. package/components/p-CQxPXWNM.js +0 -4
  423. package/components/p-CRcX0EGs.js +0 -4
  424. package/components/p-CVNvmbDp.js +0 -4
  425. package/components/p-CXpy69Ei.js +0 -4
  426. package/components/p-CoGD-oMG.js +0 -4
  427. package/components/p-CpYeYl3u.js +0 -4
  428. package/components/p-D2XJVty5.js +0 -4
  429. package/components/p-D49fFp1g.js +0 -4
  430. package/components/p-DALTMT_o.js +0 -4
  431. package/components/p-Dr-rBSUW.js +0 -4
  432. package/components/p-MHpJ2A_m.js +0 -4
  433. package/components/p-QgdyH-Zs.js +0 -4
  434. package/components/p-UKksD3f9.js +0 -4
  435. package/components/p-fP0QF3iG.js +0 -4
  436. package/components/p-ntAkt4Ra.js +0 -4
  437. package/components/p-ufB0gCSU.js +0 -4
  438. package/components/p-z-BF3clL.js +0 -4
  439. package/dist/collection/utils/test/late-props/late-props.js +0 -69
  440. package/dist/collection/utils/test/playwright/detach-reattach.js +0 -23
  441. package/dist/ionic/p-010601fe.entry.js +0 -4
  442. package/dist/ionic/p-0c2b3555.entry.js +0 -4
  443. package/dist/ionic/p-26911da5.entry.js +0 -4
  444. package/dist/ionic/p-326e0d05.entry.js +0 -4
  445. package/dist/ionic/p-392079fa.entry.js +0 -4
  446. package/dist/ionic/p-4778b90f.entry.js +0 -4
  447. package/dist/ionic/p-7dec112e.entry.js +0 -4
  448. package/dist/ionic/p-9fef333a.entry.js +0 -4
  449. package/dist/ionic/p-BRa1Jjxr.js +0 -4
  450. package/dist/ionic/p-Cc-fFNy8.js +0 -4
  451. package/dist/ionic/p-Cc4w3fVf.js +0 -4
  452. package/dist/ionic/p-CvRL-Eju.js +0 -4
  453. package/dist/ionic/p-D_IgV7tz.js +0 -4
  454. package/dist/ionic/p-b8cd338d.entry.js +0 -4
  455. package/dist/ionic/p-d85e59b1.entry.js +0 -4
  456. package/dist/ionic/p-dad2f3e4.entry.js +0 -4
  457. package/dist/ionic/p-eab77a74.entry.js +0 -4
  458. package/dist/ionic/p-h81G-QbJ.js +0 -6
  459. package/dist/ionic/p-nxFQkv7U.js +0 -4
  460. package/dist/ionic/p-w3KTiug9.js +0 -4
  461. package/dist/types/utils/test/playwright/detach-reattach.d.ts +0 -13
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.43.5 | MIT Licensed | https://stenciljs.com
424
424
  */
425
425
  var __create = Object.create;
426
426
  var __defProp = Object.defineProperty;
@@ -755,8 +755,6 @@ var DEFAULT_DOC_DATA = {
755
755
  };
756
756
  var SLOT_FB_CSS = "slot-fb{display:contents}slot-fb[hidden]{display:none}";
757
757
  var XLINK_NS = "http://www.w3.org/1999/xlink";
758
- var MAX_LAZY_LOAD_RETRIES = 3;
759
- var LAZY_LOAD_RETRY_INTERVAL_MS = 1e3;
760
758
 
761
759
  // src/utils/style.ts
762
760
  function createStyleSheetIfNeededAndSupported(styles2) {
@@ -820,7 +818,7 @@ function getHostSlotNodes(childNodes, hostName, slotName) {
820
818
  slottedNodes.push(childNode);
821
819
  if (typeof slotName !== "undefined") return slottedNodes;
822
820
  }
823
- slottedNodes = [...slottedNodes, ...getHostSlotNodes(internalCall(childNode, "childNodes"), hostName, slotName)];
821
+ slottedNodes = [...slottedNodes, ...getHostSlotNodes(childNode.childNodes, hostName, slotName)];
824
822
  }
825
823
  return slottedNodes;
826
824
  }
@@ -1064,11 +1062,6 @@ var h = (nodeName, vnodeData, ...children) => {
1064
1062
  } else if (child != null && typeof child !== "boolean") {
1065
1063
  if (simple = typeof nodeName !== "function" && !isComplexType(child)) {
1066
1064
  child = String(child);
1067
- } else if (typeof nodeName !== "function" && child.$flags$ === void 0) {
1068
- {
1069
- consoleError("Invalid vNode child");
1070
- }
1071
- continue;
1072
1065
  }
1073
1066
  if (simple && lastSimple) {
1074
1067
  vNodeChildren[vNodeChildren.length - 1].$text$ += child;
@@ -2304,7 +2297,7 @@ var setAccessor = (elm, memberName, oldValue, newValue, isSvg, flags, initialRen
2304
2297
  }
2305
2298
  }
2306
2299
  if (newValue == null || newValue === false) {
2307
- if (newValue !== false || elm.getAttribute(memberName) === "" || flags & 4 /* isHost */ && !isEnumeratedAttribute(memberName)) {
2300
+ if (newValue !== false || elm.getAttribute(memberName) === "") {
2308
2301
  if (xlink) {
2309
2302
  elm.removeAttributeNS(XLINK_NS, memberName);
2310
2303
  } else {
@@ -2321,8 +2314,6 @@ var setAccessor = (elm, memberName, oldValue, newValue, isSvg, flags, initialRen
2321
2314
  }
2322
2315
  }
2323
2316
  };
2324
- var ENUMERATED_ATTRIBUTES = /* @__PURE__ */ new Set(["draggable", "contenteditable", "spellcheck"]);
2325
- var isEnumeratedAttribute = (attrName) => ENUMERATED_ATTRIBUTES.has(attrName) || attrName.startsWith("aria-");
2326
2317
  var parseClassListRegex = /\s/;
2327
2318
  var parseClassList = (value) => {
2328
2319
  if (typeof value === "object" && value && "baseVal" in value) {
@@ -2725,10 +2716,7 @@ var markSlotContentForRelocation = (elm) => {
2725
2716
  const slotName = childNode["s-sn"];
2726
2717
  for (j = hostContentNodes.length - 1; j >= 0; j--) {
2727
2718
  node = hostContentNodes[j];
2728
- if (!node["s-cn"] && !node["s-nr"] && node["s-hn"] !== childNode["s-hn"] && // let an exact named-slot match override a stale default-slot claim. Skip this for
2729
- // `slotName === ''` itself - a matched default node's cached `s-sn` is `''` too, which
2730
- // would trivially "match" on every re-render and force pointless re-insertion.
2731
- (!node["s-sh"] || node["s-sh"] !== childNode["s-hn"] || slotName !== "" && getSlotName(node) === slotName)) {
2719
+ if (!node["s-cn"] && !node["s-nr"] && node["s-hn"] !== childNode["s-hn"] && (!node["s-sh"] || node["s-sh"] !== childNode["s-hn"])) {
2732
2720
  if (isNodeLocatedInSlot(node, slotName)) {
2733
2721
  let relocateNodeData = relocateNodes.find((r) => r.$nodeToRelocate$ === node);
2734
2722
  checkSlotFallbackVisibility = true;
@@ -2798,7 +2786,7 @@ var insertBefore = (parent, newNode, reference, isInitialLoad) => {
2798
2786
  return newNode;
2799
2787
  }
2800
2788
  }
2801
- if ((parent == null ? void 0 : parent.__insertBefore)) {
2789
+ if (parent.__insertBefore) {
2802
2790
  return parent.__insertBefore(newNode, reference);
2803
2791
  } else {
2804
2792
  return parent == null ? void 0 : parent.insertBefore(newNode, reference);
@@ -3303,12 +3291,10 @@ var proxyComponent = (Cstr, cmpMeta, flags) => {
3303
3291
 
3304
3292
  // src/runtime/initialize-component.ts
3305
3293
  var initializeComponent = async (elm, hostRef, cmpMeta, hmrVersionId) => {
3306
- var _a2;
3307
3294
  let Cstr;
3308
3295
  try {
3309
3296
  if ((hostRef.$flags$ & 32 /* hasInitializedComponent */) === 0) {
3310
3297
  hostRef.$flags$ |= 32 /* hasInitializedComponent */;
3311
- hostRef.$flags$ &= -1025 /* hasFailedLoad */;
3312
3298
  const bundleId = cmpMeta.$lazyBundleId$;
3313
3299
  if (bundleId) {
3314
3300
  const CstrImport = loadModule(cmpMeta);
@@ -3320,11 +3306,6 @@ var initializeComponent = async (elm, hostRef, cmpMeta, hmrVersionId) => {
3320
3306
  Cstr = CstrImport;
3321
3307
  }
3322
3308
  if (!Cstr) {
3323
- hostRef.$flags$ &= -33 /* hasInitializedComponent */;
3324
- hostRef.$loadRetryCount$ = ((_a2 = hostRef.$loadRetryCount$) != null ? _a2 : 0) + 1;
3325
- if (hostRef.$loadRetryCount$ < MAX_LAZY_LOAD_RETRIES) {
3326
- hostRef.$flags$ |= 1024 /* hasFailedLoad */;
3327
- }
3328
3309
  throw new Error(`Constructor for "${cmpMeta.$tagName$}#${hostRef.$modeName$}" was not found`);
3329
3310
  }
3330
3311
  if (!Cstr.isProxied) {
@@ -3404,7 +3385,7 @@ var initializeComponent = async (elm, hostRef, cmpMeta, hmrVersionId) => {
3404
3385
  hostRef.$onRenderResolve$();
3405
3386
  hostRef.$onRenderResolve$ = void 0;
3406
3387
  }
3407
- if (hostRef.$onReadyResolve$ && !(hostRef.$flags$ & 1024 /* hasFailedLoad */)) {
3388
+ if (hostRef.$onReadyResolve$) {
3408
3389
  hostRef.$onReadyResolve$(elm);
3409
3390
  }
3410
3391
  }
@@ -3463,8 +3444,6 @@ var connectedCallback = (elm) => {
3463
3444
  addHostEventListeners(elm, hostRef, cmpMeta.$listeners$);
3464
3445
  if (hostRef == null ? void 0 : hostRef.$lazyInstance$) {
3465
3446
  fireConnectedCallback(hostRef.$lazyInstance$, elm);
3466
- } else if (hostRef.$flags$ & 1024 /* hasFailedLoad */) {
3467
- setTimeout(() => initializeComponent(elm, hostRef, cmpMeta), LAZY_LOAD_RETRY_INTERVAL_MS);
3468
3447
  } else if (hostRef == null ? void 0 : hostRef.$onReadyPromise$) {
3469
3448
  hostRef.$onReadyPromise$.then(() => fireConnectedCallback(hostRef.$lazyInstance$, elm));
3470
3449
  }
@@ -7980,15 +7959,6 @@ const activeAnimations = new WeakMap();
7980
7959
  const isBackdropAlwaysBlocking = (el) => {
7981
7960
  return el.showBackdrop !== false && !((el.backdropBreakpoint ?? 0) > 0);
7982
7961
  };
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
- };
7992
7962
  const createController = (tagName) => {
7993
7963
  return {
7994
7964
  create(options) {
@@ -8357,13 +8327,6 @@ const getPresentedOverlay = (doc, overlayTag, id) => {
8357
8327
  // Otherwise, return the last overlay with the given id
8358
8328
  return (id === undefined ? overlays : overlays.filter((o) => o.id === id)).slice(-1)[0];
8359
8329
  };
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
- };
8367
8330
  /**
8368
8331
  * When an overlay is presented, the main
8369
8332
  * focus is the overlay not the page content.
@@ -8387,7 +8350,8 @@ const getViewContainer = () => {
8387
8350
  * for main content.
8388
8351
  */
8389
8352
  const setRootAriaHidden = (hidden = false) => {
8390
- const viewContainer = getViewContainer();
8353
+ const root = getAppRoot(document);
8354
+ const viewContainer = root.querySelector('ion-router-outlet, #ion-view-container-root');
8391
8355
  if (!viewContainer) {
8392
8356
  return;
8393
8357
  }
@@ -8412,42 +8376,15 @@ const cleanupRootFocusTrapAccessibility = () => {
8412
8376
  return;
8413
8377
  }
8414
8378
  const remainingOverlays = getPresentedOverlays(document);
8415
- const hasRemainingLocking = remainingOverlays.some((o) => locksAppRoot(o));
8379
+ const hasRemainingLocking = remainingOverlays.some((o) => {
8380
+ const el = o;
8381
+ return el.tagName !== 'ION-TOAST' && el.focusTrap !== false && isBackdropAlwaysBlocking(el);
8382
+ });
8416
8383
  if (!hasRemainingLocking) {
8417
8384
  setRootAriaHidden(false);
8418
8385
  document.body.classList.remove(BACKDROP_NO_SCROLL);
8419
8386
  }
8420
8387
  };
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
- };
8451
8388
  const present = async (overlay, name, iosEnterAnimation, mdEnterAnimation, opts) => {
8452
8389
  if (overlay.presented) {
8453
8390
  return;
@@ -8464,7 +8401,15 @@ const present = async (overlay, name, iosEnterAnimation, mdEnterAnimation, opts)
8464
8401
  restoreElementFocus(overlay.el);
8465
8402
  }
8466
8403
  /**
8467
- * Some apps move inline overlays to a specific container
8404
+ * Due to accessibility guidelines, toasts do not have
8405
+ * focus traps.
8406
+ *
8407
+ * All other overlays should have focus traps to prevent
8408
+ * the keyboard focus from leaving the overlay unless
8409
+ * developers explicitly opt out (for example, sheet
8410
+ * modals that should permit background interaction).
8411
+ *
8412
+ * Note: Some apps move inline overlays to a specific container
8468
8413
  * during the willPresent lifecycle (e.g., React portals via
8469
8414
  * onWillPresent). Defer applying aria-hidden/inert to the app
8470
8415
  * root until after willPresent so we can detect where the
@@ -8473,11 +8418,18 @@ const present = async (overlay, name, iosEnterAnimation, mdEnterAnimation, opts)
8473
8418
  * to avoid disabling the overlay.
8474
8419
  */
8475
8420
  const overlayEl = overlay.el;
8476
- const shouldLockRoot = locksAppRoot(overlayEl);
8421
+ const shouldTrapFocus = overlayEl.tagName !== 'ION-TOAST' && overlayEl.focusTrap !== false;
8422
+ const shouldLockRoot = shouldTrapFocus && isBackdropAlwaysBlocking(overlayEl);
8477
8423
  overlay.presented = true;
8478
8424
  overlay.willPresent.emit();
8479
8425
  if (shouldLockRoot) {
8480
- applyRootLock(overlayEl);
8426
+ const root = getAppRoot(document);
8427
+ const viewContainer = root.querySelector('ion-router-outlet, #ion-view-container-root');
8428
+ const overlayInsideViewContainer = viewContainer ? viewContainer.contains(overlayEl) : false;
8429
+ if (!overlayInsideViewContainer) {
8430
+ setRootAriaHidden(true);
8431
+ }
8432
+ document.body.classList.add(BACKDROP_NO_SCROLL);
8481
8433
  }
8482
8434
  overlay.willPresentShorthand?.emit();
8483
8435
  const mode = getIonMode$1(overlay);
@@ -8603,9 +8555,12 @@ const dismiss = async (overlay, data, role, name, iosLeaveAnimation, mdLeaveAnim
8603
8555
  * from the root element when the last focus-trapping overlay
8604
8556
  * is dismissed.
8605
8557
  */
8606
- const overlaysLockingRoot = presentedOverlays.filter((o) => locksAppRoot(o));
8558
+ const overlaysLockingRoot = presentedOverlays.filter((o) => {
8559
+ const el = o;
8560
+ return el.tagName !== 'ION-TOAST' && el.focusTrap !== false && isBackdropAlwaysBlocking(el);
8561
+ });
8607
8562
  const overlayEl = overlay.el;
8608
- const locksRoot = locksAppRoot(overlayEl);
8563
+ const locksRoot = overlayEl.tagName !== 'ION-TOAST' && overlayEl.focusTrap !== false && isBackdropAlwaysBlocking(overlayEl);
8609
8564
  /**
8610
8565
  * If this is the last visible overlay that is trapping focus
8611
8566
  * then we want to re-add the root to the accessibility tree.
@@ -10601,13 +10556,6 @@ class ActionSheet {
10601
10556
  connectedCallback() {
10602
10557
  prepareOverlay(this.el);
10603
10558
  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
- }
10611
10559
  }
10612
10560
  disconnectedCallback() {
10613
10561
  if (this.gesture) {
@@ -10627,33 +10575,24 @@ class ActionSheet {
10627
10575
  // Initialize activeRadioId for radio buttons
10628
10576
  this.buttonsChanged();
10629
10577
  }
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() {
10578
+ componentDidLoad() {
10579
+ /**
10580
+ * Only create gesture if:
10581
+ * 1. A gesture does not already exist
10582
+ * 2. App is running in iOS mode
10583
+ * 3. A wrapper ref exists
10584
+ * 4. A group ref exists
10585
+ */
10640
10586
  const { groupEl, wrapperEl } = this;
10641
- if (getIonMode$1(this) !== 'ios' || !wrapperEl || !groupEl) {
10642
- return;
10587
+ if (!this.gesture && getIonMode$1(this) === 'ios' && wrapperEl && groupEl) {
10588
+ readTask(() => {
10589
+ const isScrollable = groupEl.scrollHeight > groupEl.clientHeight;
10590
+ if (!isScrollable) {
10591
+ this.gesture = createButtonActiveGesture(wrapperEl, (refEl) => refEl.classList.contains('action-sheet-button'));
10592
+ this.gesture.enable(true);
10593
+ }
10594
+ });
10643
10595
  }
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();
10657
10596
  /**
10658
10597
  * If action sheet was rendered with isOpen="true"
10659
10598
  * then we should open action sheet immediately.
@@ -10746,17 +10685,17 @@ class ActionSheet {
10746
10685
  const cancelButton = allButtons.find((b) => b.role === 'cancel');
10747
10686
  const buttons = allButtons.filter((b) => b.role !== 'cancel');
10748
10687
  const headerID = `action-sheet-${overlayIndex}-header`;
10749
- return (hAsync(Host, { key: '83b47ea6b81d4eec6582c1dcaae6f267c78ba634', role: "dialog", "aria-modal": "true", "aria-labelledby": header !== undefined ? headerID : null, tabindex: "-1", ...htmlAttributes, style: {
10688
+ return (hAsync(Host, { key: '7685831da9a78b73473246a2cea95cefa79a53c3', role: "dialog", "aria-modal": "true", "aria-labelledby": header !== undefined ? headerID : null, tabindex: "-1", ...htmlAttributes, style: {
10750
10689
  zIndex: `${20000 + this.overlayIndex}`,
10751
10690
  }, class: {
10752
10691
  [mode]: true,
10753
10692
  ...getClassMap(this.cssClass),
10754
10693
  'overlay-hidden': true,
10755
10694
  'action-sheet-translucent': this.translucent,
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: {
10695
+ }, 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: {
10757
10696
  'action-sheet-title': true,
10758
10697
  'action-sheet-has-sub-title': this.subHeader !== undefined,
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" })));
10698
+ } }, 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" })));
10760
10699
  }
10761
10700
  get el() { return getElement(this); }
10762
10701
  static get watchers() { return {
@@ -11138,15 +11077,10 @@ class Alert {
11138
11077
  this.triggerChanged();
11139
11078
  /**
11140
11079
  * If the alert was previously connected and is being reattached, the
11141
- * `ResizeObserver` and the button gesture were torn down. `componentDidLoad`
11142
- * only fires once per instance, so re-establish both here on reconnect.
11080
+ * ResizeObserver was disconnected. componentDidLoad only fires once per
11081
+ * instance, so re-establish the observer here on reconnect.
11143
11082
  */
11144
11083
  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
- }
11150
11084
  }
11151
11085
  componentWillLoad() {
11152
11086
  if (!this.htmlAttributes?.id) {
@@ -11168,20 +11102,17 @@ class Alert {
11168
11102
  this.buttonGroupResizeObserver?.disconnect();
11169
11103
  this.buttonGroupResizeObserver = undefined;
11170
11104
  }
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() {
11105
+ componentDidLoad() {
11106
+ /**
11107
+ * Only create gesture if:
11108
+ * 1. A gesture does not already exist
11109
+ * 2. App is running in iOS mode
11110
+ * 3. A wrapper ref exists
11111
+ */
11178
11112
  if (!this.gesture && getIonMode$1(this) === 'ios' && this.wrapperEl) {
11179
11113
  this.gesture = createButtonActiveGesture(this.wrapperEl, (refEl) => refEl.classList.contains('alert-button'));
11180
11114
  this.gesture.enable(true);
11181
11115
  }
11182
- }
11183
- componentDidLoad() {
11184
- this.setupButtonActiveGesture();
11185
11116
  this.setupButtonGroupResizeObserver();
11186
11117
  /**
11187
11118
  * If alert was rendered with isOpen="true"
@@ -11502,14 +11433,14 @@ class Alert {
11502
11433
  * If neither are defined, do not set aria-labelledby.
11503
11434
  */
11504
11435
  const ariaLabelledBy = header && subHeader ? `${hdrId} ${subHdrId}` : header ? hdrId : subHeader ? subHdrId : null;
11505
- return (hAsync(Host, { key: '083b5250dc4c76e85240e0225abcb7ca2b66de2f', tabindex: "-1", style: {
11436
+ return (hAsync(Host, { key: '022f3463b8e6c52064b90ec304c524847c3d5ad3', tabindex: "-1", style: {
11506
11437
  zIndex: `${20000 + overlayIndex}`,
11507
11438
  }, class: {
11508
11439
  ...getClassMap(this.cssClass),
11509
11440
  [mode]: true,
11510
11441
  'overlay-hidden': true,
11511
11442
  'alert-translucent': this.translucent,
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" })));
11443
+ }, 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" })));
11513
11444
  }
11514
11445
  get el() { return getElement(this); }
11515
11446
  static get watchers() { return {
@@ -13507,7 +13438,6 @@ class Content {
13507
13438
  this.cTop = -1;
13508
13439
  this.cBottom = -1;
13509
13440
  this.isMainContent = true;
13510
- this.sizeToContent = false;
13511
13441
  this.resizeTimeout = null;
13512
13442
  this.inheritedAttributes = {};
13513
13443
  this.tabsElement = null;
@@ -13604,7 +13534,6 @@ class Content {
13604
13534
  }
13605
13535
  // Re-observe on reattach, since componentDidLoad only fires once.
13606
13536
  this.setupFullscreenResizeObserver();
13607
- this.setupSizeToContentObserver();
13608
13537
  }
13609
13538
  componentDidLoad() {
13610
13539
  // The custom elements build assigns fullscreen after connectedCallback.
@@ -13631,7 +13560,6 @@ class Content {
13631
13560
  this.resizeTimeout = null;
13632
13561
  }
13633
13562
  this.destroyFullscreenResizeObserver();
13634
- this.destroySizeToContentObserver();
13635
13563
  }
13636
13564
  /**
13637
13565
  * Header and footer sizes can change after load without a window resize
@@ -13645,34 +13573,6 @@ class Content {
13645
13573
  return;
13646
13574
  }
13647
13575
  }
13648
- /**
13649
- * A modal's `--height` can be changed at runtime with no event to react to,
13650
- * either by setting the property directly or by toggling a class that changes
13651
- * which rule wins. Both of those mutate an attribute on the modal, so watch
13652
- * for that and re-evaluate. Viewport driven changes are already covered by
13653
- * the `resize` listener.
13654
- */
13655
- setupSizeToContentObserver() {
13656
- {
13657
- return;
13658
- }
13659
- }
13660
- destroySizeToContentObserver() {
13661
- if (this.sizeToContentObserver !== undefined) {
13662
- this.sizeToContentObserver.disconnect();
13663
- this.sizeToContentObserver = undefined;
13664
- }
13665
- }
13666
- /**
13667
- * Re-renders when the overlay is no longer sized the way the last render
13668
- * assumed. Read in a `readTask` because resolving the custom property forces
13669
- * a style recalculation.
13670
- */
13671
- updateSizeToContent() {
13672
- readTask(() => {
13673
- if (this.shouldSizeToContent() !== this.sizeToContent) ;
13674
- });
13675
- }
13676
13576
  destroyFullscreenResizeObserver() {
13677
13577
  if (this.fullscreenResizeObserver !== undefined) {
13678
13578
  this.fullscreenResizeObserver.disconnect();
@@ -13719,30 +13619,6 @@ class Content {
13719
13619
  const mode = getIonMode$1(this);
13720
13620
  return forceOverscroll === undefined ? mode === 'ios' && isPlatform('ios') : forceOverscroll;
13721
13621
  }
13722
- /**
13723
- * Whether this component should size itself to its contents height, which
13724
- * is the case inside any popover and inside a modal whose `--height` is a
13725
- * content-based value. Those overlays give the content no definite height
13726
- * to fill.
13727
- */
13728
- shouldSizeToContent() {
13729
- if (hostContext('ion-popover', this.el)) {
13730
- return true;
13731
- }
13732
- const modal = this.el.closest('ion-modal');
13733
- if (modal === null) {
13734
- return false;
13735
- }
13736
- const height = getComputedStyle(modal).getPropertyValue('--height').trim();
13737
- /**
13738
- * Compared as a suffix so a value carrying only a vendor prefix is still
13739
- * recognized, such as the `-moz-fit-content` that Firefox needs before 94.
13740
- *
13741
- * TODO: replace with `CONTENT_SIZED_HEIGHTS.includes(height)` once the
13742
- * oldest supported Firefox is 94 or higher.
13743
- */
13744
- return CONTENT_SIZED_HEIGHTS.some((value) => height.endsWith(value));
13745
- }
13746
13622
  resize() {
13747
13623
  }
13748
13624
  /**
@@ -13922,21 +13798,21 @@ class Content {
13922
13798
  const forceOverscroll = this.shouldForceOverscroll();
13923
13799
  const transitionShadow = mode === 'ios';
13924
13800
  this.resize();
13925
- return (hAsync(Host, { key: '3985c7121dd5183fef892c2ab20935419bca3ad5', role: isMainContent ? 'main' : undefined, class: createColorClasses$1(this.color, {
13801
+ return (hAsync(Host, { key: '9551c759df407b10d809171641fc6e8f14d92219', role: isMainContent ? 'main' : undefined, class: createColorClasses$1(this.color, {
13926
13802
  [mode]: true,
13927
13803
  'content-fullscreen': this.fullscreen,
13928
- 'content-sizing': (this.sizeToContent = this.shouldSizeToContent()),
13804
+ 'content-sizing': hostContext('ion-popover', this.el),
13929
13805
  overscroll: forceOverscroll,
13930
13806
  [`content-${rtl}`]: true,
13931
13807
  }), style: {
13932
13808
  '--offset-top': `${this.cTop}px`,
13933
13809
  '--offset-bottom': `${this.cBottom}px`,
13934
- }, ...inheritedAttributes }, hAsync("div", { key: 'dcfd45fc6118836de36951b263c38fd4f2e002f9', ref: (el) => (this.backgroundContentEl = el), id: "background-content", part: "background" }), fixedSlotPlacement === 'before' ? hAsync("slot", { name: "fixed" }) : null, hAsync("div", { key: '948705ac47da2753e39775145472e55deee88aec', class: {
13810
+ }, ...inheritedAttributes }, hAsync("div", { key: 'c6de8fd226f0d10a534eb107fe032ac155fbe68e', ref: (el) => (this.backgroundContentEl = el), id: "background-content", part: "background" }), fixedSlotPlacement === 'before' ? hAsync("slot", { name: "fixed" }) : null, hAsync("div", { key: '082fc2936061360060b48221ecb1c864a3711fa0', class: {
13935
13811
  'inner-scroll': true,
13936
13812
  'scroll-x': scrollX,
13937
13813
  'scroll-y': scrollY,
13938
13814
  overscroll: (scrollX || scrollY) && forceOverscroll,
13939
- }, ref: (scrollEl) => (this.scrollEl = scrollEl), onScroll: this.scrollEvents ? (ev) => this.onScroll(ev) : undefined, part: "scroll" }, hAsync("slot", { key: 'd7c7f83747d89751c20cd27923242af6953df5c4' })), transitionShadow ? (hAsync("div", { class: "transition-effect" }, hAsync("div", { class: "transition-cover" }), hAsync("div", { class: "transition-shadow" }))) : null, fixedSlotPlacement === 'after' ? hAsync("slot", { name: "fixed" }) : null));
13815
+ }, ref: (scrollEl) => (this.scrollEl = scrollEl), onScroll: this.scrollEvents ? (ev) => this.onScroll(ev) : undefined, part: "scroll" }, hAsync("slot", { key: '0d2286206facb22696a9ca7e74a3f6b7d2397aab' })), transitionShadow ? (hAsync("div", { class: "transition-effect" }, hAsync("div", { class: "transition-cover" }), hAsync("div", { class: "transition-shadow" }))) : null, fixedSlotPlacement === 'after' ? hAsync("slot", { name: "fixed" }) : null));
13940
13816
  }
13941
13817
  get el() { return getElement(this); }
13942
13818
  static get watchers() { return {
@@ -13969,11 +13845,6 @@ class Content {
13969
13845
  "$attrsToReflect$": [["color", "color"]]
13970
13846
  }; }
13971
13847
  }
13972
- /**
13973
- * `ion-modal` `--height` values that size the modal to its contents, leaving
13974
- * children an indefinite height to resolve against.
13975
- */
13976
- const CONTENT_SIZED_HEIGHTS = ['auto', 'fit-content', 'min-content', 'max-content'];
13977
13848
  const getParentElement = (el) => {
13978
13849
  if (el.parentElement) {
13979
13850
  // normal element with a parent element
@@ -17155,6 +17026,7 @@ class Datetime {
17155
17026
  }
17156
17027
  renderCombinedDatePickerColumn() {
17157
17028
  const { defaultParts, disabled, workingParts, locale, minParts, maxParts, todayParts, isDateEnabled } = this;
17029
+ const activePart = this.getActivePartsWithFallback();
17158
17030
  /**
17159
17031
  * By default, generate a range of 3 months:
17160
17032
  * Previous month, current month, and next month
@@ -17210,10 +17082,8 @@ class Datetime {
17210
17082
  return (hAsync("ion-picker-column", { part: WHEEL_PART, "aria-label": "Select a date", class: "date-column", color: this.color, disabled: disabled, value: todayString, onIonChange: (ev) => {
17211
17083
  const { value } = ev.detail;
17212
17084
  const findPart = parts.find(({ month, day, year }) => value === `${year}-${month}-${day}`);
17213
- // Read live so parts a sibling column just committed are included.
17214
- const activePart = this.getActivePartsWithFallback();
17215
17085
  this.setWorkingParts({
17216
- ...this.workingParts,
17086
+ ...workingParts,
17217
17087
  ...findPart,
17218
17088
  });
17219
17089
  this.setActiveParts({
@@ -17290,12 +17160,11 @@ class Datetime {
17290
17160
  return [];
17291
17161
  }
17292
17162
  const { disabled, workingParts } = this;
17163
+ const activePart = this.getActivePartsWithFallback();
17293
17164
  const pickerColumnValue = (workingParts.day !== null ? workingParts.day : this.defaultParts.day) ?? undefined;
17294
17165
  return (hAsync("ion-picker-column", { part: WHEEL_PART, "aria-label": "Select a day", class: "day-column", color: this.color, disabled: disabled, value: pickerColumnValue, onIonChange: (ev) => {
17295
- // Read live so parts a sibling column just committed are included.
17296
- const activePart = this.getActivePartsWithFallback();
17297
17166
  this.setWorkingParts({
17298
- ...this.workingParts,
17167
+ ...workingParts,
17299
17168
  day: ev.detail.value,
17300
17169
  });
17301
17170
  this.setActiveParts({
@@ -17310,11 +17179,10 @@ class Datetime {
17310
17179
  return [];
17311
17180
  }
17312
17181
  const { disabled, workingParts } = this;
17182
+ const activePart = this.getActivePartsWithFallback();
17313
17183
  return (hAsync("ion-picker-column", { part: WHEEL_PART, "aria-label": "Select a month", class: "month-column", color: this.color, disabled: disabled, value: workingParts.month, onIonChange: (ev) => {
17314
- // Read live so parts a sibling column just committed are included.
17315
- const activePart = this.getActivePartsWithFallback();
17316
17184
  this.setWorkingParts({
17317
- ...this.workingParts,
17185
+ ...workingParts,
17318
17186
  month: ev.detail.value,
17319
17187
  });
17320
17188
  // Month wheel is navigation-only in multi-select mode as a fix for https://github.com/ionic-team/ionic-framework/issues/29673
@@ -17332,11 +17200,10 @@ class Datetime {
17332
17200
  return [];
17333
17201
  }
17334
17202
  const { disabled, workingParts } = this;
17203
+ const activePart = this.getActivePartsWithFallback();
17335
17204
  return (hAsync("ion-picker-column", { part: WHEEL_PART, "aria-label": "Select a year", class: "year-column", color: this.color, disabled: disabled, value: workingParts.year, onIonChange: (ev) => {
17336
- // Read live so parts a sibling column just committed are included.
17337
- const activePart = this.getActivePartsWithFallback();
17338
17205
  this.setWorkingParts({
17339
- ...this.workingParts,
17206
+ ...workingParts,
17340
17207
  year: ev.detail.value,
17341
17208
  });
17342
17209
  // Year wheel is navigation-only in multi-select mode as a fix for https://github.com/ionic-team/ionic-framework/issues/29673
@@ -17372,14 +17239,13 @@ class Datetime {
17372
17239
  ];
17373
17240
  }
17374
17241
  renderHourPickerColumn(hoursData) {
17375
- const { disabled } = this;
17242
+ const { disabled, workingParts } = this;
17376
17243
  if (hoursData.length === 0)
17377
17244
  return [];
17378
17245
  const activePart = this.getActivePartsWithFallback();
17379
17246
  return (hAsync("ion-picker-column", { part: WHEEL_PART, "aria-label": "Select an hour", color: this.color, disabled: disabled, value: activePart.hour, numericInput: true, onIonChange: (ev) => {
17380
- // Read live so parts a sibling column just committed are included.
17381
17247
  this.setWorkingParts({
17382
- ...this.workingParts,
17248
+ ...workingParts,
17383
17249
  hour: ev.detail.value,
17384
17250
  });
17385
17251
  this.setActiveParts({
@@ -17390,14 +17256,13 @@ class Datetime {
17390
17256
  } }, hoursData.map((hour) => (hAsync("ion-picker-column-option", { color: this.color, part: hour.value === activePart.hour ? `${WHEEL_ITEM_PART} ${WHEEL_ITEM_ACTIVE_PART}` : WHEEL_ITEM_PART, key: hour.value, disabled: hour.disabled, value: hour.value }, hour.text)))));
17391
17257
  }
17392
17258
  renderMinutePickerColumn(minutesData) {
17393
- const { disabled } = this;
17259
+ const { disabled, workingParts } = this;
17394
17260
  if (minutesData.length === 0)
17395
17261
  return [];
17396
17262
  const activePart = this.getActivePartsWithFallback();
17397
17263
  return (hAsync("ion-picker-column", { part: WHEEL_PART, "aria-label": "Select a minute", color: this.color, disabled: disabled, value: activePart.minute, numericInput: true, onIonChange: (ev) => {
17398
- // Read live so parts a sibling column just committed are included.
17399
17264
  this.setWorkingParts({
17400
- ...this.workingParts,
17265
+ ...workingParts,
17401
17266
  minute: ev.detail.value,
17402
17267
  });
17403
17268
  this.setActiveParts({
@@ -17408,18 +17273,16 @@ class Datetime {
17408
17273
  } }, minutesData.map((minute) => (hAsync("ion-picker-column-option", { color: this.color, part: minute.value === activePart.minute ? `${WHEEL_ITEM_PART} ${WHEEL_ITEM_ACTIVE_PART}` : WHEEL_ITEM_PART, key: minute.value, disabled: minute.disabled, value: minute.value }, minute.text)))));
17409
17274
  }
17410
17275
  renderDayPeriodPickerColumn(dayPeriodData) {
17411
- const { disabled } = this;
17276
+ const { disabled, workingParts } = this;
17412
17277
  if (dayPeriodData.length === 0) {
17413
17278
  return [];
17414
17279
  }
17415
17280
  const activePart = this.getActivePartsWithFallback();
17416
17281
  const isDayPeriodRTL = isLocaleDayPeriodRTL(this.locale);
17417
17282
  return (hAsync("ion-picker-column", { part: WHEEL_PART, "aria-label": "Select a day period", style: isDayPeriodRTL ? { order: '-1' } : {}, color: this.color, disabled: disabled, value: activePart.ampm, onIonChange: (ev) => {
17418
- // Read live so parts a sibling column just committed are included.
17419
- const currentParts = this.workingParts;
17420
- const hour = calculateHourFromAMPM(currentParts, ev.detail.value);
17283
+ const hour = calculateHourFromAMPM(workingParts, ev.detail.value);
17421
17284
  this.setWorkingParts({
17422
- ...currentParts,
17285
+ ...workingParts,
17423
17286
  ampm: ev.detail.value,
17424
17287
  hour,
17425
17288
  });
@@ -17771,7 +17634,7 @@ class Datetime {
17771
17634
  const hasDatePresentation = presentation === 'date' || presentation === 'date-time' || presentation === 'time-date';
17772
17635
  const hasWheelVariant = hasDatePresentation && preferWheel;
17773
17636
  renderHiddenInput(true, el, name, formatValue(value), disabled);
17774
- return (hAsync(Host, { key: '4e0b529a70924b065bcc6191e08550428b5a52a0', "aria-disabled": disabled ? 'true' : null, onFocus: this.onFocus, onBlur: this.onBlur, class: {
17637
+ return (hAsync(Host, { key: 'd8e6dfe5e3bffb1c38a3e37b63b3aec099f40d29', "aria-disabled": disabled ? 'true' : null, onFocus: this.onFocus, onBlur: this.onBlur, class: {
17775
17638
  ...createColorClasses$1(color, {
17776
17639
  [mode]: true,
17777
17640
  ['datetime-readonly']: readonly,
@@ -17783,7 +17646,7 @@ class Datetime {
17783
17646
  [`datetime-prefer-wheel`]: hasWheelVariant,
17784
17647
  [`datetime-grid`]: isGridStyle,
17785
17648
  }),
17786
- } }, hAsync("div", { key: 'cc9d1b92f960984cb0466d0003a240ace67da243', class: "intersection-tracker", ref: (el) => (this.intersectionTrackerRef = el) }), this.renderDatetime(mode)));
17649
+ } }, hAsync("div", { key: '20889d3c68dd5109633c0e214411a63d6f3025bb', class: "intersection-tracker", ref: (el) => (this.intersectionTrackerRef = el) }), this.renderDatetime(mode)));
17787
17650
  }
17788
17651
  get el() { return getElement(this); }
17789
17652
  static get watchers() { return {
@@ -22465,17 +22328,19 @@ class ItemSliding {
22465
22328
  }
22466
22329
  }
22467
22330
  async updateOptions() {
22468
- const options = Array.from(this.el.querySelectorAll('ion-item-options'));
22469
- /**
22470
- * Frameworks that assign element props after inserting the element haven't set
22471
- * `side` while `connectedCallback` runs, so reading it any earlier reports every
22472
- * option as `end`.
22473
- */
22474
- await Promise.all(options.map((option) => new Promise((resolve) => componentOnReady(option, resolve))));
22331
+ const options = this.el.querySelectorAll('ion-item-options');
22475
22332
  let sides = 0;
22476
22333
  // Reset left and right options in case they were removed
22477
22334
  this.leftOptions = this.rightOptions = undefined;
22478
- for (const option of options) {
22335
+ for (let i = 0; i < options.length; i++) {
22336
+ const item = options.item(i);
22337
+ /**
22338
+ * We cannot use the componentOnReady helper
22339
+ * util here since we need to wait for all of these items
22340
+ * to be ready before we set `this.sides` and `this.optsDirty`.
22341
+ */
22342
+ // eslint-disable-next-line custom-rules/no-component-on-ready-method
22343
+ const option = item.componentOnReady !== undefined ? await item.componentOnReady() : item;
22479
22344
  const side = isEndSide(option.side ?? option.getAttribute('side')) ? 'end' : 'start';
22480
22345
  if (side === 'start') {
22481
22346
  this.leftOptions = option;
@@ -22674,7 +22539,7 @@ class ItemSliding {
22674
22539
  }
22675
22540
  render() {
22676
22541
  const mode = getIonMode$1(this);
22677
- return (hAsync(Host, { key: '02174ca963753d3a51a4249068f3d436f8acb03d', class: {
22542
+ return (hAsync(Host, { key: '15f6a98f8c888e86c29827cdf55d98ace08699dd', class: {
22678
22543
  [mode]: true,
22679
22544
  'item-sliding-active-slide': this.state !== 2 /* SlidingState.Disabled */,
22680
22545
  'item-sliding-active-options-end': (this.state & 8 /* SlidingState.End */) !== 0,
@@ -23087,10 +22952,6 @@ class Loading {
23087
22952
  connectedCallback() {
23088
22953
  prepareOverlay(this.el);
23089
22954
  this.triggerChanged();
23090
- // Re-apply the root lock if moved without dismiss() being called
23091
- if (this.presented) {
23092
- restoreRootFocusTrapAccessibility(this.el);
23093
- }
23094
22955
  }
23095
22956
  componentWillLoad() {
23096
22957
  if (this.spinner === undefined) {
@@ -23191,14 +23052,14 @@ class Loading {
23191
23052
  * Otherwise, don't set aria-labelledby.
23192
23053
  */
23193
23054
  const ariaLabelledBy = message !== undefined ? msgId : null;
23194
- return (hAsync(Host, { key: 'b4430bc66aedeca19d5645667cba73c169c4bd76', role: "dialog", "aria-modal": "true", "aria-labelledby": ariaLabelledBy, tabindex: "-1", ...htmlAttributes, style: {
23055
+ return (hAsync(Host, { key: '2d14122ff3081de73631a7fdd4affdd5c73b8618', role: "dialog", "aria-modal": "true", "aria-labelledby": ariaLabelledBy, tabindex: "-1", ...htmlAttributes, style: {
23195
23056
  zIndex: `${40000 + this.overlayIndex}`,
23196
23057
  }, onIonBackdropTap: this.onBackdropTap, class: {
23197
23058
  ...getClassMap(this.cssClass),
23198
23059
  [mode]: true,
23199
23060
  'overlay-hidden': true,
23200
23061
  'loading-translucent': this.translucent,
23201
- } }, 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" })));
23062
+ } }, 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" })));
23202
23063
  }
23203
23064
  get el() { return getElement(this); }
23204
23065
  static get watchers() { return {
@@ -26719,9 +26580,9 @@ const clearSafeAreaOverrides = (hostEl) => {
26719
26580
  hostEl.style.removeProperty('--ion-safe-area-right');
26720
26581
  };
26721
26582
 
26722
- const modalIosCss = () => `:host{--width:100%;--min-width:auto;--max-width:auto;--height:100%;--min-height:auto;--max-height:100%;--overflow:hidden;--border-radius:0;--border-width:0;--border-style:none;--border-color:transparent;--background:var(--ion-background-color, #fff);--box-shadow:none;--backdrop-opacity:0;left:0;right:0;top:0;bottom:0;display:-ms-flexbox;display:flex;position:absolute;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center;outline:none;color:var(--ion-text-color, #000);contain:strict}.modal-wrapper,ion-backdrop{pointer-events:auto}:host(.overlay-hidden){display:none}.modal-wrapper,.modal-shadow{border-radius:var(--border-radius);width:var(--width);min-width:var(--min-width);max-width:var(--max-width);height:var(--height);min-height:var(--min-height);max-height:var(--max-height);border-width:var(--border-width);border-style:var(--border-style);border-color:var(--border-color);background:var(--background);-webkit-box-shadow:var(--box-shadow);box-shadow:var(--box-shadow);overflow:var(--overflow);z-index:10}.modal-wrapper{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;outline:none}.modal-shadow{position:absolute;background:transparent}@media only screen and (min-width: 768px) and (min-height: 600px){:host{--width:600px;--height:500px}}@media only screen and (min-width: 768px) and (min-height: 768px){:host{--width:600px;--height:600px}}.modal-handle{left:0px;right:0px;top:5px;border-radius:8px;-webkit-margin-start:auto;margin-inline-start:auto;-webkit-margin-end:auto;margin-inline-end:auto;position:absolute;width:36px;height:5px;-webkit-transform:translateZ(0);transform:translateZ(0);border:0;background:var(--ion-color-step-350, var(--ion-background-color-step-350, #c0c0be));cursor:pointer;z-index:11}.modal-handle::before{-webkit-padding-start:4px;padding-inline-start:4px;-webkit-padding-end:4px;padding-inline-end:4px;padding-top:4px;padding-bottom:4px;position:absolute;width:36px;height:5px;-webkit-transform:translate(-50%, -50%);transform:translate(-50%, -50%);content:""}:host(.modal-sheet){--height:calc(100% - (var(--ion-modal-offset-top, 0px) + 10px))}:host(.modal-sheet) .modal-wrapper,:host(.modal-sheet) .modal-shadow{position:absolute;bottom:0}:host(.modal-sheet.modal-no-expand-scroll) ion-footer{position:absolute;bottom:0;width:var(--width)}:host{--backdrop-opacity:var(--ion-backdrop-opacity, 0.4)}:host(.modal-card),:host(.modal-sheet){--border-radius:10px}@media only screen and (min-width: 768px) and (min-height: 600px){:host{--border-radius:10px}}.modal-wrapper{-webkit-transform:translate3d(0, 100%, 0);transform:translate3d(0, 100%, 0)}@media screen and (max-width: 767px){@supports (width: max(0px, 1px)){:host(.modal-card){--height:calc(100% - max(30px, var(--ion-safe-area-top)) - 10px)}}@supports not (width: max(0px, 1px)){:host(.modal-card){--height:calc(100% - 40px)}}:host(.modal-card) .modal-wrapper{border-start-start-radius:var(--border-radius);border-start-end-radius:var(--border-radius);border-end-end-radius:0;border-end-start-radius:0}:host(.modal-card){--backdrop-opacity:0;--width:100%;-ms-flex-align:end;align-items:flex-end}:host(.modal-card) .modal-shadow{display:none}:host(.modal-card) ion-backdrop{pointer-events:none}}@media screen and (min-width: 768px){:host(.modal-card){--width:calc(100% - 120px);--height:calc(100% - (120px + var(--ion-safe-area-top) + var(--ion-safe-area-bottom)));--max-width:720px;--max-height:1000px;--backdrop-opacity:0;--box-shadow:0px 0px 30px 10px rgba(0, 0, 0, 0.1);-webkit-transition:all 0.5s ease-in-out;transition:all 0.5s ease-in-out}:host(.modal-card) .modal-wrapper{-webkit-box-shadow:none;box-shadow:none}:host(.modal-card) .modal-shadow{-webkit-box-shadow:var(--box-shadow);box-shadow:var(--box-shadow)}}:host(.modal-sheet) .modal-wrapper{border-start-start-radius:var(--border-radius);border-start-end-radius:var(--border-radius);border-end-end-radius:0;border-end-start-radius:0}`;
26583
+ const modalIosCss = () => `:host{--width:100%;--min-width:auto;--max-width:auto;--height:100%;--min-height:auto;--max-height:auto;--overflow:hidden;--border-radius:0;--border-width:0;--border-style:none;--border-color:transparent;--background:var(--ion-background-color, #fff);--box-shadow:none;--backdrop-opacity:0;left:0;right:0;top:0;bottom:0;display:-ms-flexbox;display:flex;position:absolute;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center;outline:none;color:var(--ion-text-color, #000);contain:strict}.modal-wrapper,ion-backdrop{pointer-events:auto}:host(.overlay-hidden){display:none}.modal-wrapper,.modal-shadow{border-radius:var(--border-radius);width:var(--width);min-width:var(--min-width);max-width:var(--max-width);height:var(--height);min-height:var(--min-height);max-height:var(--max-height);border-width:var(--border-width);border-style:var(--border-style);border-color:var(--border-color);background:var(--background);-webkit-box-shadow:var(--box-shadow);box-shadow:var(--box-shadow);overflow:var(--overflow);z-index:10}.modal-wrapper{outline:none}.modal-shadow{position:absolute;background:transparent}@media only screen and (min-width: 768px) and (min-height: 600px){:host{--width:600px;--height:500px}}@media only screen and (min-width: 768px) and (min-height: 768px){:host{--width:600px;--height:600px}}.modal-handle{left:0px;right:0px;top:5px;border-radius:8px;-webkit-margin-start:auto;margin-inline-start:auto;-webkit-margin-end:auto;margin-inline-end:auto;position:absolute;width:36px;height:5px;-webkit-transform:translateZ(0);transform:translateZ(0);border:0;background:var(--ion-color-step-350, var(--ion-background-color-step-350, #c0c0be));cursor:pointer;z-index:11}.modal-handle::before{-webkit-padding-start:4px;padding-inline-start:4px;-webkit-padding-end:4px;padding-inline-end:4px;padding-top:4px;padding-bottom:4px;position:absolute;width:36px;height:5px;-webkit-transform:translate(-50%, -50%);transform:translate(-50%, -50%);content:""}:host(.modal-sheet){--height:calc(100% - (var(--ion-modal-offset-top, 0px) + 10px))}:host(.modal-sheet) .modal-wrapper,:host(.modal-sheet) .modal-shadow{position:absolute;bottom:0}:host(.modal-sheet.modal-no-expand-scroll) ion-footer{position:absolute;bottom:0;width:var(--width)}:host{--backdrop-opacity:var(--ion-backdrop-opacity, 0.4)}:host(.modal-card),:host(.modal-sheet){--border-radius:10px}@media only screen and (min-width: 768px) and (min-height: 600px){:host{--border-radius:10px}}.modal-wrapper{-webkit-transform:translate3d(0, 100%, 0);transform:translate3d(0, 100%, 0)}@media screen and (max-width: 767px){@supports (width: max(0px, 1px)){:host(.modal-card){--height:calc(100% - max(30px, var(--ion-safe-area-top)) - 10px)}}@supports not (width: max(0px, 1px)){:host(.modal-card){--height:calc(100% - 40px)}}:host(.modal-card) .modal-wrapper{border-start-start-radius:var(--border-radius);border-start-end-radius:var(--border-radius);border-end-end-radius:0;border-end-start-radius:0}:host(.modal-card){--backdrop-opacity:0;--width:100%;-ms-flex-align:end;align-items:flex-end}:host(.modal-card) .modal-shadow{display:none}:host(.modal-card) ion-backdrop{pointer-events:none}}@media screen and (min-width: 768px){:host(.modal-card){--width:calc(100% - 120px);--height:calc(100% - (120px + var(--ion-safe-area-top) + var(--ion-safe-area-bottom)));--max-width:720px;--max-height:1000px;--backdrop-opacity:0;--box-shadow:0px 0px 30px 10px rgba(0, 0, 0, 0.1);-webkit-transition:all 0.5s ease-in-out;transition:all 0.5s ease-in-out}:host(.modal-card) .modal-wrapper{-webkit-box-shadow:none;box-shadow:none}:host(.modal-card) .modal-shadow{-webkit-box-shadow:var(--box-shadow);box-shadow:var(--box-shadow)}}:host(.modal-sheet) .modal-wrapper{border-start-start-radius:var(--border-radius);border-start-end-radius:var(--border-radius);border-end-end-radius:0;border-end-start-radius:0}`;
26723
26584
 
26724
- const modalMdCss = () => `:host{--width:100%;--min-width:auto;--max-width:auto;--height:100%;--min-height:auto;--max-height:100%;--overflow:hidden;--border-radius:0;--border-width:0;--border-style:none;--border-color:transparent;--background:var(--ion-background-color, #fff);--box-shadow:none;--backdrop-opacity:0;left:0;right:0;top:0;bottom:0;display:-ms-flexbox;display:flex;position:absolute;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center;outline:none;color:var(--ion-text-color, #000);contain:strict}.modal-wrapper,ion-backdrop{pointer-events:auto}:host(.overlay-hidden){display:none}.modal-wrapper,.modal-shadow{border-radius:var(--border-radius);width:var(--width);min-width:var(--min-width);max-width:var(--max-width);height:var(--height);min-height:var(--min-height);max-height:var(--max-height);border-width:var(--border-width);border-style:var(--border-style);border-color:var(--border-color);background:var(--background);-webkit-box-shadow:var(--box-shadow);box-shadow:var(--box-shadow);overflow:var(--overflow);z-index:10}.modal-wrapper{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;outline:none}.modal-shadow{position:absolute;background:transparent}@media only screen and (min-width: 768px) and (min-height: 600px){:host{--width:600px;--height:500px}}@media only screen and (min-width: 768px) and (min-height: 768px){:host{--width:600px;--height:600px}}.modal-handle{left:0px;right:0px;top:5px;border-radius:8px;-webkit-margin-start:auto;margin-inline-start:auto;-webkit-margin-end:auto;margin-inline-end:auto;position:absolute;width:36px;height:5px;-webkit-transform:translateZ(0);transform:translateZ(0);border:0;background:var(--ion-color-step-350, var(--ion-background-color-step-350, #c0c0be));cursor:pointer;z-index:11}.modal-handle::before{-webkit-padding-start:4px;padding-inline-start:4px;-webkit-padding-end:4px;padding-inline-end:4px;padding-top:4px;padding-bottom:4px;position:absolute;width:36px;height:5px;-webkit-transform:translate(-50%, -50%);transform:translate(-50%, -50%);content:""}:host(.modal-sheet){--height:calc(100% - (var(--ion-modal-offset-top, 0px) + 10px))}:host(.modal-sheet) .modal-wrapper,:host(.modal-sheet) .modal-shadow{position:absolute;bottom:0}:host(.modal-sheet.modal-no-expand-scroll) ion-footer{position:absolute;bottom:0;width:var(--width)}:host{--backdrop-opacity:var(--ion-backdrop-opacity, 0.32)}@media only screen and (min-width: 768px) and (min-height: 600px){:host{--border-radius:2px;--box-shadow:0 28px 48px rgba(0, 0, 0, 0.4)}}.modal-wrapper{-webkit-transform:translate3d(0, 40px, 0);transform:translate3d(0, 40px, 0);opacity:0.01}`;
26585
+ const modalMdCss = () => `:host{--width:100%;--min-width:auto;--max-width:auto;--height:100%;--min-height:auto;--max-height:auto;--overflow:hidden;--border-radius:0;--border-width:0;--border-style:none;--border-color:transparent;--background:var(--ion-background-color, #fff);--box-shadow:none;--backdrop-opacity:0;left:0;right:0;top:0;bottom:0;display:-ms-flexbox;display:flex;position:absolute;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center;outline:none;color:var(--ion-text-color, #000);contain:strict}.modal-wrapper,ion-backdrop{pointer-events:auto}:host(.overlay-hidden){display:none}.modal-wrapper,.modal-shadow{border-radius:var(--border-radius);width:var(--width);min-width:var(--min-width);max-width:var(--max-width);height:var(--height);min-height:var(--min-height);max-height:var(--max-height);border-width:var(--border-width);border-style:var(--border-style);border-color:var(--border-color);background:var(--background);-webkit-box-shadow:var(--box-shadow);box-shadow:var(--box-shadow);overflow:var(--overflow);z-index:10}.modal-wrapper{outline:none}.modal-shadow{position:absolute;background:transparent}@media only screen and (min-width: 768px) and (min-height: 600px){:host{--width:600px;--height:500px}}@media only screen and (min-width: 768px) and (min-height: 768px){:host{--width:600px;--height:600px}}.modal-handle{left:0px;right:0px;top:5px;border-radius:8px;-webkit-margin-start:auto;margin-inline-start:auto;-webkit-margin-end:auto;margin-inline-end:auto;position:absolute;width:36px;height:5px;-webkit-transform:translateZ(0);transform:translateZ(0);border:0;background:var(--ion-color-step-350, var(--ion-background-color-step-350, #c0c0be));cursor:pointer;z-index:11}.modal-handle::before{-webkit-padding-start:4px;padding-inline-start:4px;-webkit-padding-end:4px;padding-inline-end:4px;padding-top:4px;padding-bottom:4px;position:absolute;width:36px;height:5px;-webkit-transform:translate(-50%, -50%);transform:translate(-50%, -50%);content:""}:host(.modal-sheet){--height:calc(100% - (var(--ion-modal-offset-top, 0px) + 10px))}:host(.modal-sheet) .modal-wrapper,:host(.modal-sheet) .modal-shadow{position:absolute;bottom:0}:host(.modal-sheet.modal-no-expand-scroll) ion-footer{position:absolute;bottom:0;width:var(--width)}:host{--backdrop-opacity:var(--ion-backdrop-opacity, 0.32)}@media only screen and (min-width: 768px) and (min-height: 600px){:host{--border-radius:2px;--box-shadow:0 28px 48px rgba(0, 0, 0, 0.4)}}.modal-wrapper{-webkit-transform:translate3d(0, 40px, 0);transform:translate3d(0, 40px, 0);opacity:0.01}`;
26725
26586
 
26726
26587
  // TODO(FW-2832): types
26727
26588
  /**
@@ -26757,9 +26618,6 @@ class Modal {
26757
26618
  this.inline = false;
26758
26619
  // Whether or not modal is being dismissed via gesture
26759
26620
  this.gestureAnimationDismissing = false;
26760
- // True from the first safe-area write in `present()` until the enter
26761
- // animation settles. A position-based read in that window is not the rest position.
26762
- this.isPresenting = false;
26763
26621
  this.presented = false;
26764
26622
  /** @internal */
26765
26623
  this.hasController = false;
@@ -26996,17 +26854,6 @@ class Modal {
26996
26854
  const { el } = this;
26997
26855
  prepareOverlay(el);
26998
26856
  this.triggerChanged();
26999
- // A disconnect tears down state this presentation still needs and cannot
27000
- // tell a re-insert from a removal, so put it back.
27001
- if (this.presented || this.isPresenting) {
27002
- this.restoreSafeAreaOverrides();
27003
- }
27004
- // A relocation from `willPresent` reaches these before `present()` has
27005
- // applied the lock, so they apply it instead. Both are idempotent.
27006
- if (this.presented) {
27007
- restoreRootFocusTrapAccessibility(el);
27008
- this.initParentRemovalObserver();
27009
- }
27010
26857
  }
27011
26858
  disconnectedCallback() {
27012
26859
  this.triggerController.removeClickListener();
@@ -27184,33 +27031,25 @@ class Modal {
27184
27031
  // Recalculate isSheetModal before safe-area setup because framework
27185
27032
  // bindings (e.g., Angular) may not have been applied when componentWillLoad ran.
27186
27033
  this.isSheetModal = this.breakpoints !== undefined && this.initialBreakpoint !== undefined;
27187
- this.isPresenting = true;
27034
+ // Set initial safe-area overrides before animation
27035
+ this.setInitialSafeAreaOverrides();
27188
27036
  const hasCardModal = presentingElement !== undefined;
27189
- // Wrapped so a throw cannot strand `isPresenting`, which would suppress
27190
- // the position-based correction for the life of this instance.
27191
- try {
27192
- // Set initial safe-area overrides before animation
27193
- this.setInitialSafeAreaOverrides();
27194
- /**
27195
- * We need to change the status bar at the
27196
- * start of the animation so that it completes
27197
- * by the time the card animation is done.
27198
- */
27199
- if (hasCardModal && getIonMode$1(this) === 'ios') {
27200
- // Cache the original status bar color before the modal is presented
27201
- this.statusBarStyle = await StatusBar.getStyle();
27202
- setCardStatusBarDark();
27203
- }
27204
- await present(this, 'modalEnter', iosEnterAnimation$2, mdEnterAnimation$2, {
27205
- presentingEl: presentingElement,
27206
- currentBreakpoint: this.initialBreakpoint,
27207
- backdropBreakpoint: this.backdropBreakpoint,
27208
- expandToScroll: this.expandToScroll,
27209
- });
27210
- }
27211
- finally {
27212
- this.isPresenting = false;
27037
+ /**
27038
+ * We need to change the status bar at the
27039
+ * start of the animation so that it completes
27040
+ * by the time the card animation is done.
27041
+ */
27042
+ if (hasCardModal && getIonMode$1(this) === 'ios') {
27043
+ // Cache the original status bar color before the modal is presented
27044
+ this.statusBarStyle = await StatusBar.getStyle();
27045
+ setCardStatusBarDark();
27213
27046
  }
27047
+ await present(this, 'modalEnter', iosEnterAnimation$2, mdEnterAnimation$2, {
27048
+ presentingEl: presentingElement,
27049
+ currentBreakpoint: this.initialBreakpoint,
27050
+ backdropBreakpoint: this.backdropBreakpoint,
27051
+ expandToScroll: this.expandToScroll,
27052
+ });
27214
27053
  // Update safe-area based on actual position after animation
27215
27054
  this.updateSafeAreaOverrides();
27216
27055
  // Apply fullscreen safe-area padding if needed
@@ -27712,9 +27551,6 @@ class Modal {
27712
27551
  this.cachedOriginalParent.tagName === 'ION-APP') {
27713
27552
  return;
27714
27553
  }
27715
- // Both `present()` and a reconnect call this, so drop any existing
27716
- // observer. Below the guards, so a call that bails cannot leave none.
27717
- this.cleanupParentRemovalObserver();
27718
27554
  this.parentRemovalObserver = new MutationObserver((mutations) => {
27719
27555
  mutations.forEach((mutation) => {
27720
27556
  if (mutation.type === 'childList' && mutation.removedNodes.length > 0) {
@@ -27793,9 +27629,6 @@ class Modal {
27793
27629
  // Set the internal offset property with the resolved root safe-area-top value
27794
27630
  if (context.isSheetModal) {
27795
27631
  this.updateSheetOffsetTop();
27796
- // A restore after a DOM move runs this a second time for the same
27797
- // modal, so drop the previous subscription rather than stacking one.
27798
- this.unsubscribeRootSafeAreaTop?.();
27799
27632
  this.unsubscribeRootSafeAreaTop = onRootSafeAreaTopChange((safeAreaTop) => this.updateSheetOffsetTop(safeAreaTop));
27800
27633
  }
27801
27634
  }
@@ -27914,31 +27747,6 @@ class Modal {
27914
27747
  const { contentEl } = this.findContentAndFooter();
27915
27748
  this.clearContentSafeAreaPadding(contentEl);
27916
27749
  }
27917
- /**
27918
- * Re-applies what `cleanupSafeAreaOverrides()` removed for a modal moved
27919
- * while presented. Anything needing no measurement goes on synchronously so
27920
- * the modal is never painted without safe-area. The position-based
27921
- * correction waits a frame for the layout pass it reads.
27922
- */
27923
- restoreSafeAreaOverrides() {
27924
- this.setInitialSafeAreaOverrides();
27925
- this.applyFullscreenSafeArea();
27926
- raf(() => {
27927
- // A dismiss or another move can land first, and a read before the enter
27928
- // animation settles is not the rest position. `present()` redoes it.
27929
- if (!this.presented || !this.el.isConnected || this.isPresenting) {
27930
- return;
27931
- }
27932
- // A hidden subtree carries `display: none`, so there is no box and the
27933
- // read would write the safe-area for a modal touching no edge. The
27934
- // prediction applied above holds until the modal is shown again.
27935
- const { width, height } = this.el.getBoundingClientRect();
27936
- if (width === 0 && height === 0) {
27937
- return;
27938
- }
27939
- this.updateSafeAreaOverrides();
27940
- });
27941
- }
27942
27750
  render() {
27943
27751
  const { handle, isSheetModal, presentingElement, htmlAttributes, handleBehavior, inheritedAttributes, focusTrap, expandToScroll, } = this;
27944
27752
  const showHandle = handle !== false && isSheetModal;
@@ -27946,7 +27754,7 @@ class Modal {
27946
27754
  const isCardModal = presentingElement !== undefined && mode === 'ios';
27947
27755
  const isHandleCycle = handleBehavior === 'cycle';
27948
27756
  const isSheetModalWithHandle = isSheetModal && showHandle;
27949
- return (hAsync(Host, { key: '7c9c736052c5a788cf31040b6b2386dd9ea7454b', "no-router": true,
27757
+ return (hAsync(Host, { key: 'a471c293319cb6ee5ffb7ffafec0b8413e4289de', "no-router": true,
27950
27758
  // Allow the modal to be navigable when the handle is focusable
27951
27759
  tabIndex: isHandleCycle && isSheetModalWithHandle ? 0 : -1, ...htmlAttributes, style: {
27952
27760
  zIndex: `${20000 + this.overlayIndex}`,
@@ -27959,7 +27767,7 @@ class Modal {
27959
27767
  'overlay-hidden': true,
27960
27768
  [FOCUS_TRAP_DISABLE_CLASS]: focusTrap === false,
27961
27769
  ...getClassMap(this.cssClass),
27962
- }, 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',
27770
+ }, 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',
27963
27771
  /*
27964
27772
  role and aria-modal must be used on the
27965
27773
  same element. They must also be set inside the
@@ -27972,9 +27780,9 @@ class Modal {
27972
27780
  without the tabindex focus() would be a no-op and screen readers
27973
27781
  may not properly announce the dialog and its content when it opens.
27974
27782
  */
27975
- 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",
27783
+ 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",
27976
27784
  // Prevents the handle from receiving keyboard focus when it does not cycle
27977
- 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 }))));
27785
+ 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 }))));
27978
27786
  }
27979
27787
  get el() { return getElement(this); }
27980
27788
  static get watchers() { return {
@@ -29449,12 +29257,6 @@ class PickerColumn {
29449
29257
  this.isColumnVisible = false;
29450
29258
  this.canExitInputMode = true;
29451
29259
  this.updateValueTextOnScroll = false;
29452
- this.isUserScroll = false;
29453
- /**
29454
- * The haptics for the wheel picker are an iOS-only feature. As a result,
29455
- * they should be disabled on Android.
29456
- */
29457
- this.enableHaptics = false;
29458
29260
  this.ariaLabel = null;
29459
29261
  this.isActive = false;
29460
29262
  /**
@@ -29486,12 +29288,6 @@ class PickerColumn {
29486
29288
  */
29487
29289
  this.canExitInputMode = canExitInputMode;
29488
29290
  this.updateValueTextOnScroll = false;
29489
- /**
29490
- * This scroll takes over from whatever the user was doing, so an outside
29491
- * press must not commit an option the column is only passing through.
29492
- */
29493
- this.isUserScroll = false;
29494
- this.stopWatchingForOutsidePress();
29495
29291
  scrollEl.scroll({
29496
29292
  top,
29497
29293
  left: 0,
@@ -29546,117 +29342,6 @@ class PickerColumn {
29546
29342
  }
29547
29343
  this.isActive = state;
29548
29344
  };
29549
- this.clearScrollEndTimeout = () => {
29550
- if (this.scrollEndTimeout) {
29551
- clearTimeout(this.scrollEndTimeout);
29552
- this.scrollEndTimeout = undefined;
29553
- }
29554
- };
29555
- /**
29556
- * Resets the idle timer that commits the centered option.
29557
- */
29558
- this.resetScrollEndTimeout = () => {
29559
- this.clearScrollEndTimeout();
29560
- this.scrollEndTimeout = setTimeout(this.settle, SCROLL_END_DELAY);
29561
- };
29562
- /**
29563
- * Capture so the column still commits if an application's own pointerdown
29564
- * handler stops the event before it reaches the document.
29565
- */
29566
- this.watchForOutsidePress = () => {
29567
- doc?.addEventListener('pointerdown', this.onPointerDownOutside, { capture: true });
29568
- };
29569
- this.stopWatchingForOutsidePress = () => {
29570
- doc?.removeEventListener('pointerdown', this.onPointerDownOutside, { capture: true });
29571
- };
29572
- /**
29573
- * Resets everything the current scroll interaction is holding, so nothing
29574
- * pending on it can commit later.
29575
- */
29576
- this.discardScroll = () => {
29577
- this.stopWatchingForOutsidePress();
29578
- this.clearScrollEndTimeout();
29579
- this.scrollEndCallback = undefined;
29580
- this.centeredOption = undefined;
29581
- this.haltedAtScrollTop = undefined;
29582
- this.isScrolling = false;
29583
- this.isUserScroll = false;
29584
- this.canExitInputMode = true;
29585
- };
29586
- /**
29587
- * Commits the option that is currently centered under the highlight and ends
29588
- * the scroll interaction.
29589
- */
29590
- this.settle = () => {
29591
- const { centeredOption } = this;
29592
- this.clearScrollEndTimeout();
29593
- this.stopWatchingForOutsidePress();
29594
- this.isUserScroll = false;
29595
- this.isScrolling = false;
29596
- this.updateValueTextOnScroll = true;
29597
- this.enableHaptics && hapticSelectionEnd();
29598
- /**
29599
- * Certain tasks (such as those that
29600
- * cause re-renders) should only be done
29601
- * once scrolling has finished, otherwise
29602
- * flickering may occur.
29603
- */
29604
- const { scrollEndCallback } = this;
29605
- if (scrollEndCallback) {
29606
- scrollEndCallback();
29607
- this.scrollEndCallback = undefined;
29608
- }
29609
- /**
29610
- * Reset this flag as the
29611
- * next scroll interaction could
29612
- * be a scroll from the user. In this
29613
- * case, we should exit input mode.
29614
- */
29615
- this.canExitInputMode = true;
29616
- if (centeredOption !== undefined) {
29617
- // Cleared here so a later scroll that centers nothing cannot fall back on it.
29618
- this.centeredOption = undefined;
29619
- if (centeredOption.isConnected) {
29620
- this.setValue(centeredOption.value);
29621
- }
29622
- }
29623
- };
29624
- /**
29625
- * Commits the option the user can see when they press anything outside of the
29626
- * column during a scroll they started. This runs on pointerdown rather than
29627
- * click so the value is up to date by the time an application's own click
29628
- * handler (a Save button, for example) reads it.
29629
- */
29630
- this.onPointerDownOutside = (ev) => {
29631
- const { centeredOption, parentEl, scrollEl } = this;
29632
- if (!this.isScrolling) {
29633
- return;
29634
- }
29635
- /**
29636
- * The column can live in another component's Shadow DOM, where a document
29637
- * listener sees the target retargeted to the outer host. The composed path
29638
- * is the only reliable way to tell a press on the column apart.
29639
- */
29640
- const path = ev.composedPath();
29641
- /**
29642
- * A press anywhere in the parent picker counts as inside, so reaching for a
29643
- * sibling wheel leaves this column coasting.
29644
- */
29645
- if (path.includes(this.el) || (parentEl != null && path.includes(parentEl))) {
29646
- return;
29647
- }
29648
- /**
29649
- * Landing on the centered option halts the in-flight momentum scroll, so the
29650
- * committed value and the option the user is left looking at agree. The
29651
- * option list can be replaced mid-scroll, and a detached option has no
29652
- * offset to center on.
29653
- */
29654
- if (centeredOption !== undefined && centeredOption.isConnected) {
29655
- this.centerPickerItemInView(centeredOption, false, false);
29656
- this.haltedAtScrollTop = scrollEl?.scrollTop;
29657
- }
29658
- this.settle();
29659
- };
29660
29345
  /**
29661
29346
  * When the column scrolls, the component
29662
29347
  * needs to determine which item is centered
@@ -29664,42 +29349,27 @@ class PickerColumn {
29664
29349
  * the item object.
29665
29350
  */
29666
29351
  this.initializeScrollListener = () => {
29667
- this.enableHaptics = isPlatform('ios');
29352
+ /**
29353
+ * The haptics for the wheel picker are
29354
+ * an iOS-only feature. As a result, they should
29355
+ * be disabled on Android.
29356
+ */
29357
+ const enableHaptics = isPlatform('ios');
29668
29358
  const { el, scrollEl } = this;
29359
+ let timeout;
29669
29360
  let activeEl = this.activeItem;
29670
29361
  const scrollCallback = () => {
29671
29362
  raf(() => {
29672
- /**
29673
- * This frame cannot be cancelled, and moving the column disconnects it
29674
- * without the observer reporting a change, so this checks live state.
29675
- */
29676
- if (!this.el.isConnected || !this.isColumnVisible || !scrollEl)
29363
+ if (!scrollEl)
29677
29364
  return;
29678
- const { haltedAtScrollTop } = this;
29679
- if (haltedAtScrollTop !== undefined) {
29680
- /**
29681
- * Still at the halted position, so this frame is the halt landing
29682
- * rather than the wheel moving, and re-arming would start a second
29683
- * commit cycle.
29684
- */
29685
- if (Math.abs(scrollEl.scrollTop - haltedAtScrollTop) <= HALT_TOLERANCE)
29686
- return;
29687
- this.haltedAtScrollTop = undefined;
29365
+ if (timeout) {
29366
+ clearTimeout(timeout);
29367
+ timeout = undefined;
29688
29368
  }
29689
- // Armed before the early returns below, so a scroll never ends uncommitted.
29690
- this.resetScrollEndTimeout();
29691
29369
  if (!this.isScrolling) {
29692
- this.enableHaptics && hapticSelectionStart();
29370
+ enableHaptics && hapticSelectionStart();
29693
29371
  this.isScrolling = true;
29694
29372
  }
29695
- /**
29696
- * Only a user-driven scroll holds an uncommitted selection. Checked every
29697
- * frame because the user can take hold of the wheel mid-scroll, and
29698
- * re-adding the same listener is a no-op.
29699
- */
29700
- if (this.isUserScroll) {
29701
- this.watchForOutsidePress();
29702
- }
29703
29373
  /**
29704
29374
  * Select item in the center of the column
29705
29375
  * which is the month/year that we want to select
@@ -29759,23 +29429,18 @@ class PickerColumn {
29759
29429
  newActiveElement = fallbackActiveElement;
29760
29430
  }
29761
29431
  }
29762
- /**
29763
- * A scroll can land with no selectable option centered, such as an
29764
- * overscroll bounce briefly centering the empty padding rows. Keep the
29765
- * current selection until an option is centered again.
29766
- */
29767
- if (newActiveElement === undefined || newActiveElement.disabled) {
29768
- return;
29769
- }
29770
29432
  if (activeEl !== undefined) {
29771
29433
  this.setPickerItemActiveState(activeEl, false);
29772
29434
  }
29435
+ if (newActiveElement === undefined || newActiveElement.disabled) {
29436
+ return;
29437
+ }
29773
29438
  /**
29774
29439
  * If we are selecting a new value,
29775
29440
  * we need to run haptics again.
29776
29441
  */
29777
29442
  if (newActiveElement !== activeEl) {
29778
- this.enableHaptics && hapticSelectionChanged();
29443
+ enableHaptics && hapticSelectionChanged();
29779
29444
  if (this.canExitInputMode) {
29780
29445
  /**
29781
29446
  * The native iOS wheel picker
@@ -29807,14 +29472,32 @@ class PickerColumn {
29807
29472
  if (this.updateValueTextOnScroll) {
29808
29473
  this.assistiveFocusable?.setAttribute('aria-valuetext', this.getOptionValueText(newActiveElement));
29809
29474
  }
29810
- this.centeredOption = newActiveElement;
29475
+ timeout = setTimeout(() => {
29476
+ this.isScrolling = false;
29477
+ this.updateValueTextOnScroll = true;
29478
+ enableHaptics && hapticSelectionEnd();
29479
+ /**
29480
+ * Certain tasks (such as those that
29481
+ * cause re-renders) should only be done
29482
+ * once scrolling has finished, otherwise
29483
+ * flickering may occur.
29484
+ */
29485
+ const { scrollEndCallback } = this;
29486
+ if (scrollEndCallback) {
29487
+ scrollEndCallback();
29488
+ this.scrollEndCallback = undefined;
29489
+ }
29490
+ /**
29491
+ * Reset this flag as the
29492
+ * next scroll interaction could
29493
+ * be a scroll from the user. In this
29494
+ * case, we should exit input mode.
29495
+ */
29496
+ this.canExitInputMode = true;
29497
+ this.setValue(newActiveElement.value);
29498
+ }, 250);
29811
29499
  });
29812
29500
  };
29813
- const userScrollCallback = () => {
29814
- this.isUserScroll = true;
29815
- // Taking hold of the wheel ends the halt even if it has not moved yet.
29816
- this.haltedAtScrollTop = undefined;
29817
- };
29818
29501
  /**
29819
29502
  * Wrap this in an raf so that the scroll callback
29820
29503
  * does not fire when component is initially shown.
@@ -29823,19 +29506,8 @@ class PickerColumn {
29823
29506
  if (!scrollEl)
29824
29507
  return;
29825
29508
  scrollEl.addEventListener('scroll', scrollCallback);
29826
- scrollEl.addEventListener('pointerdown', userScrollCallback);
29827
- scrollEl.addEventListener('wheel', userScrollCallback, { passive: true });
29828
- /**
29829
- * A `pointerdown` fires once per touch, so a drag that pauses long enough
29830
- * to commit would look like a scroll the column started. A `touchmove`
29831
- * keeps arriving while the finger moves.
29832
- */
29833
- scrollEl.addEventListener('touchmove', userScrollCallback, { passive: true });
29834
29509
  this.destroyScrollListener = () => {
29835
29510
  scrollEl.removeEventListener('scroll', scrollCallback);
29836
- scrollEl.removeEventListener('pointerdown', userScrollCallback);
29837
- scrollEl.removeEventListener('wheel', userScrollCallback);
29838
- scrollEl.removeEventListener('touchmove', userScrollCallback);
29839
29511
  };
29840
29512
  });
29841
29513
  };
@@ -30018,14 +29690,6 @@ class PickerColumn {
30018
29690
  }
30019
29691
  else {
30020
29692
  this.isColumnVisible = false;
30021
- /**
30022
- * The pending timer still runs so it resets the scroll state, but the
30023
- * option it would have committed is dropped. A column the user cannot
30024
- * see should not change its value.
30025
- */
30026
- this.stopWatchingForOutsidePress();
30027
- this.centeredOption = undefined;
30028
- this.haltedAtScrollTop = undefined;
30029
29693
  if (this.destroyScrollListener) {
30030
29694
  this.destroyScrollListener();
30031
29695
  this.destroyScrollListener = undefined;
@@ -30096,13 +29760,6 @@ class PickerColumn {
30096
29760
  connectedCallback() {
30097
29761
  this.ariaLabel = this.el.getAttribute('aria-label') ?? 'Select a value';
30098
29762
  }
30099
- disconnectedCallback() {
30100
- /**
30101
- * A pending settle would otherwise commit a value on a column that is no
30102
- * longer in the DOM.
30103
- */
30104
- this.discardScroll();
30105
- }
30106
29763
  get activeItem() {
30107
29764
  const { value } = this;
30108
29765
  const options = Array.from(this.el.querySelectorAll('ion-picker-column-option'));
@@ -30120,14 +29777,14 @@ class PickerColumn {
30120
29777
  render() {
30121
29778
  const { color, disabled, isActive, numericInput } = this;
30122
29779
  const mode = getIonMode$1(this);
30123
- return (hAsync(Host, { key: '60a893619d0b01fba53fbccef67a10d533a22657', class: createColorClasses$1(color, {
29780
+ return (hAsync(Host, { key: '78b46ad10d88ea1bb43ca8c36748767912f03224', class: createColorClasses$1(color, {
30124
29781
  [mode]: true,
30125
29782
  ['picker-column-active']: isActive,
30126
29783
  ['picker-column-numeric-input']: numericInput,
30127
29784
  ['picker-column-disabled']: disabled,
30128
- }) }, hAsync("slot", { key: '79f1e047f89c5ec916ed02efaac56ef3f73b8969', name: "prefix" }), hAsync("div", { key: 'c45c86e88353a196ff38159f40f390bc27852c9e', class: "picker-opts", ref: (el) => {
29785
+ }) }, hAsync("slot", { key: '761e501df77f7de896ffb3ebb99ebf88c5c3bf70', name: "prefix" }), hAsync("div", { key: '9f4caaeef8ab704522a85f30876d371712f47c5c', class: "picker-opts", ref: (el) => {
30129
29786
  this.scrollEl = el;
30130
- }, role: "slider", tabindex: this.disabled ? undefined : 0, "aria-label": this.ariaLabel, "aria-valuemin": 0, "aria-valuemax": 0, "aria-valuenow": 0, "aria-valuetext": this.getOptionValueText(this.activeItem), "aria-orientation": "vertical", onKeyDown: (ev) => this.onKeyDown(ev) }, hAsync("div", { key: 'e02d76752f5d3dd4cd2846fbc28645f1508a4b49', class: "picker-item-empty", "aria-hidden": "true" }, "\u00A0"), hAsync("div", { key: 'd577bcbadc530970b2781692b050811633625c5a', class: "picker-item-empty", "aria-hidden": "true" }, "\u00A0"), hAsync("div", { key: 'c89e78c3a896bc1f55b922d01df16fdbb1259bdd', class: "picker-item-empty", "aria-hidden": "true" }, "\u00A0"), hAsync("slot", { key: '6c597ff899692597432ee2aa0b42de53b86deed4' }), hAsync("div", { key: '91686ed94f14c47647836ed4d63e54b5c54ee3b9', class: "picker-item-empty", "aria-hidden": "true" }, "\u00A0"), hAsync("div", { key: '2ff058c6d0e8cef4e143c2d848f9a52684579af1', class: "picker-item-empty", "aria-hidden": "true" }, "\u00A0"), hAsync("div", { key: 'bc7386bec6fced36e44084a7a137b3fe6506c996', class: "picker-item-empty", "aria-hidden": "true" }, "\u00A0")), hAsync("slot", { key: '8835fd3f4e025bce964e6f05984c9aaadc20d7fb', name: "suffix" })));
29787
+ }, role: "slider", tabindex: this.disabled ? undefined : 0, "aria-label": this.ariaLabel, "aria-valuemin": 0, "aria-valuemax": 0, "aria-valuenow": 0, "aria-valuetext": this.getOptionValueText(this.activeItem), "aria-orientation": "vertical", onKeyDown: (ev) => this.onKeyDown(ev) }, hAsync("div", { key: '9d3533436aba6c61c93f65f84a077fba832194a0', class: "picker-item-empty", "aria-hidden": "true" }, "\u00A0"), hAsync("div", { key: '3f18d3a47361f06f55321b65fdf5742a61722b26', class: "picker-item-empty", "aria-hidden": "true" }, "\u00A0"), hAsync("div", { key: 'eac0d20ab8c533ef829875e323e93e1ee2067d6d', class: "picker-item-empty", "aria-hidden": "true" }, "\u00A0"), hAsync("slot", { key: '92e25989ef41cf6f910c73238e1a0a5ac03f1c1f' }), hAsync("div", { key: '33a84644ebdc84108b44a8e3a129b54e824939c8', class: "picker-item-empty", "aria-hidden": "true" }, "\u00A0"), hAsync("div", { key: '128ad61a3a68c7ff2d2e44a6e968424fcc608a15', class: "picker-item-empty", "aria-hidden": "true" }, "\u00A0"), hAsync("div", { key: '6e4d59a4f75befcbbf47279a263f28a69b12dbbd', class: "picker-item-empty", "aria-hidden": "true" }, "\u00A0")), hAsync("slot", { key: '3c6621b64438792a3024c90e3d9916a0a3614506', name: "suffix" })));
30131
29788
  }
30132
29789
  get el() { return getElement(this); }
30133
29790
  static get watchers() { return {
@@ -30159,19 +29816,6 @@ class PickerColumn {
30159
29816
  }; }
30160
29817
  }
30161
29818
  const PICKER_ITEM_ACTIVE_CLASS = 'option-active';
30162
- /**
30163
- * How long the column must be idle before the centered option is treated as
30164
- * the user's selection. Replaceable by the `scrollend` event once that is
30165
- * supported everywhere (https://caniuse.com/?search=scrollend).
30166
- */
30167
- const SCROLL_END_DELAY = 250;
30168
- /**
30169
- * How far, in pixels, the column may report from where it was halted and still
30170
- * count as having stayed there. Centering targets a position between two snap
30171
- * points, so mandatory snapping corrects it by half the column height less
30172
- * three option heights: 2px at the default sizes.
30173
- */
30174
- const HALT_TOLERANCE = 2;
30175
29819
 
30176
29820
  const pickerColumnOptionIosCss = () => `.picker-column-option-button{padding-left:0;padding-right:0;padding-top:0;padding-bottom:0;margin-left:0;margin-right:0;margin-top:0;margin-bottom:0;width:100%;height:34px;border:0px;outline:none;background:transparent;color:inherit;font-family:var(--ion-font-family, inherit);font-size:inherit;line-height:34px;text-align:inherit;text-overflow:ellipsis;white-space:nowrap;cursor:pointer;overflow:hidden}:host(.option-disabled){opacity:0.4}:host(.option-disabled) .picker-column-option-button{cursor:default}`;
30177
29821
 
@@ -31574,13 +31218,6 @@ class Popover {
31574
31218
  const { configureTriggerInteraction, el } = this;
31575
31219
  prepareOverlay(el);
31576
31220
  configureTriggerInteraction();
31577
- // Re-apply the root lock if moved without dismiss() being called
31578
- if (this.presented) {
31579
- restoreRootFocusTrapAccessibility(el);
31580
- // The disconnect tore down the header observer, and `present()` is its
31581
- // only other caller, so a move mid-layout would lose the recalculation.
31582
- this.recalculateContentOnHeaderReady();
31583
- }
31584
31221
  }
31585
31222
  disconnectedCallback() {
31586
31223
  const { destroyTriggerInteraction } = this;
@@ -31758,12 +31395,6 @@ class Popover {
31758
31395
  if (!header || contentElements.length === 0) {
31759
31396
  return;
31760
31397
  }
31761
- // Both `present()` and a reconnect call this, so drop any existing
31762
- // observer. Below the guards, so a call that bails cannot leave none.
31763
- if (this.headerResizeObserver) {
31764
- this.headerResizeObserver.disconnect();
31765
- this.headerResizeObserver = undefined;
31766
- }
31767
31398
  this.headerResizeObserver = new ResizeObserver(async () => {
31768
31399
  if (header.offsetHeight > 0) {
31769
31400
  this.headerResizeObserver?.disconnect();
@@ -31836,7 +31467,7 @@ class Popover {
31836
31467
  const { onLifecycle, parentPopover, dismissOnSelect, side, arrow, htmlAttributes, focusTrap } = this;
31837
31468
  const desktop = isPlatform('desktop');
31838
31469
  const enableArrow = arrow && !parentPopover;
31839
- return (hAsync(Host, { key: 'b5e9c788f58397203976d5f8302dfb89e916efe1', "aria-modal": "true", "no-router": true, tabindex: "-1", ...htmlAttributes, style: {
31470
+ return (hAsync(Host, { key: '52ffc7116969ae1b8b927e67f2acbfe5f5434f70', "aria-modal": "true", "no-router": true, tabindex: "-1", ...htmlAttributes, style: {
31840
31471
  zIndex: `${20000 + this.overlayIndex}`,
31841
31472
  }, class: {
31842
31473
  ...getClassMap(this.cssClass),
@@ -31847,7 +31478,7 @@ class Popover {
31847
31478
  [`popover-side-${side}`]: true,
31848
31479
  [FOCUS_TRAP_DISABLE_CLASS]: focusTrap === false,
31849
31480
  'popover-nested': !!parentPopover,
31850
- }, 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' })))));
31481
+ }, 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' })))));
31851
31482
  }
31852
31483
  get el() { return getElement(this); }
31853
31484
  static get watchers() { return {
@@ -37642,6 +37273,11 @@ class SegmentButton {
37642
37273
  addEventListener$1(segmentEl, 'ionSelect', this.updateState);
37643
37274
  addEventListener$1(segmentEl, 'ionStyle', this.updateStyle);
37644
37275
  }
37276
+ // Prevent buttons from being disabled when associated with segment content
37277
+ if (this.contentId && this.disabled) {
37278
+ printIonWarning(`[ion-segment-button] - Segment buttons cannot be disabled when associated with an <ion-segment-content>.`);
37279
+ this.disabled = false;
37280
+ }
37645
37281
  }
37646
37282
  disconnectedCallback() {
37647
37283
  const segmentEl = this.segmentEl;
@@ -37658,15 +37294,6 @@ class SegmentButton {
37658
37294
  // Return if there is no contentId defined
37659
37295
  if (!this.contentId)
37660
37296
  return;
37661
- /**
37662
- * Checked here rather than in `connectedCallback` so frameworks that assign element
37663
- * props after inserting the element have set `disabled` by now. A disabled ion-segment
37664
- * pushes that onto its buttons too, which this guard should not undo.
37665
- */
37666
- if (this.disabled && this.segmentEl?.disabled !== true) {
37667
- printIonWarning(`[ion-segment-button] - Segment buttons cannot be disabled when associated with an <ion-segment-content>.`);
37668
- this.disabled = false;
37669
- }
37670
37297
  // Attempt to find the Segment Content by its contentId
37671
37298
  const segmentContent = document.getElementById(this.contentId);
37672
37299
  // If no associated Segment Content exists, log an error and return
@@ -37701,7 +37328,7 @@ class SegmentButton {
37701
37328
  const { checked, type, disabled, hasIcon, hasLabel, layout, segmentEl } = this;
37702
37329
  const mode = getIonMode$1(this);
37703
37330
  const hasSegmentColor = () => segmentEl?.color !== undefined;
37704
- return (hAsync(Host, { key: 'd8acc71d87e26b32f20b2d0f9a6acc9f0dab0dee', class: {
37331
+ return (hAsync(Host, { key: '2b4b7ad8b981d2ee39aba5b9c734de8a5bd045ba', class: {
37705
37332
  [mode]: true,
37706
37333
  'in-toolbar': hostContext('ion-toolbar', this.el),
37707
37334
  'in-toolbar-color': hostContext('ion-toolbar[color]', this.el),
@@ -37717,7 +37344,7 @@ class SegmentButton {
37717
37344
  'ion-activatable': true,
37718
37345
  'ion-activatable-instant': true,
37719
37346
  'ion-focusable': true,
37720
- } }, hAsync("button", { key: 'ce65da07b1a012bce353b3c6c24eecfbd4071d54', "aria-selected": checked ? 'true' : 'false', role: "tab", ref: (el) => (this.nativeEl = el), type: type, class: "button-native", part: "native", disabled: disabled, ...this.inheritedAttributes }, hAsync("span", { key: '6c4b4dcd20e407e5dc31674bea23633d8a09187a', class: "button-inner" }, hAsync("slot", { key: '817145ae77a3c5ada88ab95723d881f1bde96b2a' })), mode === 'md' && hAsync("ion-ripple-effect", { key: '054d7e5e2a13013914fac6bbde8efdb28d9b459e' })), hAsync("div", { key: 'c48074881a302510ad4752eeb9383222cd3a54cb', part: "indicator", class: "segment-button-indicator segment-button-indicator-animated" }, hAsync("div", { key: '7672a6b10ee18ad026b798fbd8207dc3cd5683f9', part: "indicator-background", class: "segment-button-indicator-background" }))));
37347
+ } }, hAsync("button", { key: '9cc58cfbe70844a0f5e1a307002e0d04e044be99', "aria-selected": checked ? 'true' : 'false', role: "tab", ref: (el) => (this.nativeEl = el), type: type, class: "button-native", part: "native", disabled: disabled, ...this.inheritedAttributes }, hAsync("span", { key: '6443551951ce589efdb2d0e1fd1a14e35b82ed19', class: "button-inner" }, hAsync("slot", { key: 'c3548b469ae6e5477d8372cb28bc70dff3a24d18' })), mode === 'md' && hAsync("ion-ripple-effect", { key: 'fb176415ca1702766c4d7a5964ec0bb467bdcb55' })), hAsync("div", { key: 'aa22b4752f8336d0e232a1e0894e87023b284a08', part: "indicator", class: "segment-button-indicator segment-button-indicator-animated" }, hAsync("div", { key: '61e29ea52048fa0583fce6c20c81614a4d0199cb', part: "indicator-background", class: "segment-button-indicator-background" }))));
37721
37348
  }
37722
37349
  get el() { return getElement(this); }
37723
37350
  static get watchers() { return {
@@ -38761,7 +38388,7 @@ class Select {
38761
38388
  const hasOutlineFill = mode === 'md' && fill === 'outline';
38762
38389
  renderHiddenInput(true, el, name, parseValue(value), disabled);
38763
38390
  const labelShouldFloat = labelPlacement === 'stacked' || (labelPlacement === 'floating' && (hasValue || hasFocus || isExpanded));
38764
- return (hAsync(Host, { key: 'b2f161e3706e139e61440cd13e162714b1b75d72', onClick: this.onClick, class: createColorClasses$1(this.color, {
38391
+ return (hAsync(Host, { key: '5d1e5bf46d0f204efdcb55cc42cfde52e6db304b', onClick: this.onClick, class: createColorClasses$1(this.color, {
38765
38392
  [mode]: true,
38766
38393
  'in-item': inItem,
38767
38394
  'in-item-color': hostContext('ion-item.ion-color', el),
@@ -38779,7 +38406,7 @@ class Select {
38779
38406
  [`select-justify-${justify}`]: justifyEnabled,
38780
38407
  [`select-shape-${shape}`]: shape !== undefined,
38781
38408
  [`select-label-placement-${labelPlacement}`]: true,
38782
- }) }, hAsync("label", { key: '944a2eb468154a21260d181fdaf67828a71eb902', class: "select-wrapper", id: "select-label", onClick: this.onLabelClick, part: "wrapper" }, hasOutlineFill && this.renderOutlineContainer(), hAsync("div", { key: '927200c53548b1bb4f52d6a167605b724a7b7d0d', class: "select-start", part: "start", ref: (el) => (this.startContainerEl = el) }, hAsync("slot", { key: '6e14b95e9b95c116b16744d630600e90977782bc', name: "start" })), hAsync("div", { key: '8451ed4300ac005963075be36a04ea8763bc0fdd', class: "select-control", part: "control" }, this.renderLabel(), hAsync("div", { key: '207e7b63f3224a4870579365ac992da6784fb31f', class: "native-wrapper", ref: (el) => (this.nativeWrapperEl = el), part: "container" }, this.renderSelectText(), this.renderListbox(), !hasFloatingOrStackedLabel && this.renderSelectIcon())), hAsync("div", { key: '5c17367d488db4d570f31b25e33560efa9011500', class: "select-end", part: "end" }, hasFloatingOrStackedLabel && this.renderSelectIcon(), hAsync("slot", { key: '21fd8c0d9bee8cffef9ef6984cacd31e8f38211c', name: "end" })), shouldRenderHighlight && hAsync("div", { key: '1fff767db9a1ec07b274ef65ff7ae8fb976e6ad2', class: "select-highlight" })), this.renderBottomContent()));
38409
+ }) }, hAsync("label", { key: '15fd1f8e06510ae8472c621cf8cf90e51172e0be', class: "select-wrapper", id: "select-label", onClick: this.onLabelClick, part: "wrapper" }, hasOutlineFill && this.renderOutlineContainer(), hAsync("div", { key: '7964e3d9351671899793b117896acdda25ec24c4', class: "select-start", part: "start", ref: (el) => (this.startContainerEl = el) }, hAsync("slot", { key: 'aa309ef155c4025acfd7ed5739b5221c85097b36', name: "start" })), hAsync("div", { key: '23d5a9dfea64a9d81b0b36d9426b15bed98901b9', class: "select-control", part: "control" }, this.renderLabel(), hAsync("div", { key: '810da9fbfa8771e09b5fb768d64e5f04858b5833', class: "native-wrapper", ref: (el) => (this.nativeWrapperEl = el), part: "container" }, this.renderSelectText(), this.renderListbox(), !hasFloatingOrStackedLabel && this.renderSelectIcon())), hAsync("div", { key: 'bf1c04704326ecfa14cf2e49bb76d3fb45beb08d', class: "select-end", part: "end" }, hasFloatingOrStackedLabel && this.renderSelectIcon(), hAsync("slot", { key: '76a8bcaeefdcaa908aebd820d93171b08165cee3', name: "end" })), shouldRenderHighlight && hAsync("div", { key: '55a9c417a82323a44e16328fd62a634d9d7c558b', class: "select-highlight" })), this.renderBottomContent()));
38783
38410
  }
38784
38411
  get el() { return getElement(this); }
38785
38412
  static get watchers() { return {
@@ -38888,14 +38515,29 @@ const textForValue = (opts, value, compareWith, useHTML = false) => {
38888
38515
  return getOptionContent(selectOpt, undefined, true);
38889
38516
  }
38890
38517
  /**
38891
- * Every text-only context reads only the default slot, so the start
38892
- * and end slots stay out of the `aria-label` and the overlay labels.
38893
- * Both config paths derive that text through the same helper, so they
38894
- * cannot disagree about what an option's text is. `null` marks an
38895
- * option with no text, which is dropped from the joined text of a
38896
- * `multiple` select rather than joined in as an empty entry.
38518
+ * When custom HTML is enabled, extract only the default slot content.
38519
+ * This ensures aria-label and other text-only contexts read only
38520
+ * the relevant option text.
38897
38521
  */
38898
- return getDefaultSlotPlainText(selectOpt) || null;
38522
+ if (customHTMLEnabled) {
38523
+ const content = getOptionContent(selectOpt);
38524
+ if (typeof content === 'string') {
38525
+ return content;
38526
+ }
38527
+ /**
38528
+ * Elements were found in the default slot, extract and concatenate
38529
+ * their text content while trimming whitespace.
38530
+ */
38531
+ if (content) {
38532
+ const texts = Array.from(content.childNodes)
38533
+ .map((n) => n.textContent?.trim())
38534
+ .filter((t) => t);
38535
+ return texts.join(' ') || null;
38536
+ }
38537
+ // Empty option
38538
+ return null;
38539
+ }
38540
+ return getDefaultSlotPlainText(selectOpt);
38899
38541
  };
38900
38542
  /**
38901
38543
  * Trims whitespace from all text nodes within a DOM tree.
@@ -38951,13 +38593,9 @@ const getOptionContent = (option, slotName, useHTML = false) => {
38951
38593
  if (nodes.length === 0) {
38952
38594
  return null;
38953
38595
  }
38954
- /**
38955
- * Return plain text if no elements are found. This reads the option the
38956
- * same way the non-custom-HTML path does, so the two do not disagree
38957
- * about what an option's text is.
38958
- */
38596
+ // Return plain text if no elements are found
38959
38597
  if (!slotName && nodes.every((n) => n.nodeType === Node.TEXT_NODE)) {
38960
- return getDefaultSlotPlainText(option) || null;
38598
+ return nodes.map((n) => n.textContent?.trim()).join(' ') || null;
38961
38599
  }
38962
38600
  /**
38963
38601
  * Mirror known custom-element properties (e.g. ion-icon's `icon`)
@@ -39013,43 +38651,22 @@ const getOptionDefaultSlot = (option) => {
39013
38651
  }
39014
38652
  return defaultSlotNodes;
39015
38653
  };
39016
- /**
39017
- * Concatenates the text a node renders, skipping the subtrees of tags
39018
- * whose contents the browser never paints (`script`, `style`, and the
39019
- * rest of `blockedTags`). `textContent` includes those, so reading it
39020
- * directly would put stylesheet or script source into the select text
39021
- * and the `aria-label`.
39022
- *
39023
- * @param node - The node to read text from.
39024
- * @returns The node's rendered text.
39025
- */
39026
- const getRenderedTextContent = (node) => {
39027
- if (node.nodeType === Node.TEXT_NODE) {
39028
- return node.textContent ?? '';
39029
- }
39030
- if (node.nodeType !== Node.ELEMENT_NODE) {
39031
- return '';
39032
- }
39033
- if (blockedTags.includes(node.tagName.toLowerCase())) {
39034
- return '';
39035
- }
39036
- return Array.from(node.childNodes)
39037
- .map((child) => getRenderedTextContent(child))
39038
- .join('');
39039
- };
39040
38654
  /**
39041
38655
  * Extracts plain text from only the default slot of an option,
39042
- * excluding content assigned to named slots (start/end). Text is
39043
- * concatenated with no separator and collapsible whitespace is
39044
- * collapsed, approximating how the browser renders the option.
39045
- * NBSP is not collapsible, so it is preserved.
39046
- *
39047
- * @param option - The `ion-select-option` element to read text from.
39048
- * @returns The option's default slot text.
38656
+ * excluding content assigned to named slots (start/end).
39049
38657
  */
39050
38658
  const getDefaultSlotPlainText = (option) => {
39051
- const text = (getOptionDefaultSlot(option) ?? []).map((node) => getRenderedTextContent(node)).join('');
39052
- return text.replace(/[ \t\n\r\f]+/g, ' ').replace(/^[ \t\n\r\f]+|[ \t\n\r\f]+$/g, '');
38659
+ const texts = Array.from(option.childNodes)
38660
+ .filter((node) => {
38661
+ if (node.nodeType === Node.ELEMENT_NODE) {
38662
+ return !node.hasAttribute('slot');
38663
+ }
38664
+ return node.nodeType === Node.TEXT_NODE;
38665
+ })
38666
+ .filter((node) => node.nodeType === Node.TEXT_NODE)
38667
+ .map((n) => n.textContent?.trim())
38668
+ .filter((t) => t);
38669
+ return texts.join(' ');
39053
38670
  };
39054
38671
  /**
39055
38672
  * Extracts the rich content from an `ion-select-option`.
@@ -43125,7 +42742,7 @@ var NAMESPACE = (
43125
42742
  );
43126
42743
 
43127
42744
  /*
43128
- Stencil Hydrate Runner v4.44.1 | MIT Licensed | https://stenciljs.com
42745
+ Stencil Hydrate Runner v4.43.5 | MIT Licensed | https://stenciljs.com
43129
42746
  */
43130
42747
  var __create = Object.create;
43131
42748
  var __defProp = Object.defineProperty;