@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.js CHANGED
@@ -422,7 +422,7 @@ const appGlobalScript = initialize || (() => {});
422
422
  const globalScripts = appGlobalScript;
423
423
 
424
424
  /*
425
- Stencil Hydrate Platform v4.44.1 | MIT Licensed | https://stenciljs.com
425
+ Stencil Hydrate Platform v4.43.5 | MIT Licensed | https://stenciljs.com
426
426
  */
427
427
  var __create = Object.create;
428
428
  var __defProp = Object.defineProperty;
@@ -757,8 +757,6 @@ var DEFAULT_DOC_DATA = {
757
757
  };
758
758
  var SLOT_FB_CSS = "slot-fb{display:contents}slot-fb[hidden]{display:none}";
759
759
  var XLINK_NS = "http://www.w3.org/1999/xlink";
760
- var MAX_LAZY_LOAD_RETRIES = 3;
761
- var LAZY_LOAD_RETRY_INTERVAL_MS = 1e3;
762
760
 
763
761
  // src/utils/style.ts
764
762
  function createStyleSheetIfNeededAndSupported(styles2) {
@@ -822,7 +820,7 @@ function getHostSlotNodes(childNodes, hostName, slotName) {
822
820
  slottedNodes.push(childNode);
823
821
  if (typeof slotName !== "undefined") return slottedNodes;
824
822
  }
825
- slottedNodes = [...slottedNodes, ...getHostSlotNodes(internalCall(childNode, "childNodes"), hostName, slotName)];
823
+ slottedNodes = [...slottedNodes, ...getHostSlotNodes(childNode.childNodes, hostName, slotName)];
826
824
  }
827
825
  return slottedNodes;
828
826
  }
@@ -1066,11 +1064,6 @@ var h = (nodeName, vnodeData, ...children) => {
1066
1064
  } else if (child != null && typeof child !== "boolean") {
1067
1065
  if (simple = typeof nodeName !== "function" && !isComplexType(child)) {
1068
1066
  child = String(child);
1069
- } else if (typeof nodeName !== "function" && child.$flags$ === void 0) {
1070
- {
1071
- consoleError("Invalid vNode child");
1072
- }
1073
- continue;
1074
1067
  }
1075
1068
  if (simple && lastSimple) {
1076
1069
  vNodeChildren[vNodeChildren.length - 1].$text$ += child;
@@ -2306,7 +2299,7 @@ var setAccessor = (elm, memberName, oldValue, newValue, isSvg, flags, initialRen
2306
2299
  }
2307
2300
  }
2308
2301
  if (newValue == null || newValue === false) {
2309
- if (newValue !== false || elm.getAttribute(memberName) === "" || flags & 4 /* isHost */ && !isEnumeratedAttribute(memberName)) {
2302
+ if (newValue !== false || elm.getAttribute(memberName) === "") {
2310
2303
  if (xlink) {
2311
2304
  elm.removeAttributeNS(XLINK_NS, memberName);
2312
2305
  } else {
@@ -2323,8 +2316,6 @@ var setAccessor = (elm, memberName, oldValue, newValue, isSvg, flags, initialRen
2323
2316
  }
2324
2317
  }
2325
2318
  };
2326
- var ENUMERATED_ATTRIBUTES = /* @__PURE__ */ new Set(["draggable", "contenteditable", "spellcheck"]);
2327
- var isEnumeratedAttribute = (attrName) => ENUMERATED_ATTRIBUTES.has(attrName) || attrName.startsWith("aria-");
2328
2319
  var parseClassListRegex = /\s/;
2329
2320
  var parseClassList = (value) => {
2330
2321
  if (typeof value === "object" && value && "baseVal" in value) {
@@ -2727,10 +2718,7 @@ var markSlotContentForRelocation = (elm) => {
2727
2718
  const slotName = childNode["s-sn"];
2728
2719
  for (j = hostContentNodes.length - 1; j >= 0; j--) {
2729
2720
  node = hostContentNodes[j];
2730
- 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
2731
- // `slotName === ''` itself - a matched default node's cached `s-sn` is `''` too, which
2732
- // would trivially "match" on every re-render and force pointless re-insertion.
2733
- (!node["s-sh"] || node["s-sh"] !== childNode["s-hn"] || slotName !== "" && getSlotName(node) === slotName)) {
2721
+ if (!node["s-cn"] && !node["s-nr"] && node["s-hn"] !== childNode["s-hn"] && (!node["s-sh"] || node["s-sh"] !== childNode["s-hn"])) {
2734
2722
  if (isNodeLocatedInSlot(node, slotName)) {
2735
2723
  let relocateNodeData = relocateNodes.find((r) => r.$nodeToRelocate$ === node);
2736
2724
  checkSlotFallbackVisibility = true;
@@ -2800,7 +2788,7 @@ var insertBefore = (parent, newNode, reference, isInitialLoad) => {
2800
2788
  return newNode;
2801
2789
  }
2802
2790
  }
2803
- if ((parent == null ? void 0 : parent.__insertBefore)) {
2791
+ if (parent.__insertBefore) {
2804
2792
  return parent.__insertBefore(newNode, reference);
2805
2793
  } else {
2806
2794
  return parent == null ? void 0 : parent.insertBefore(newNode, reference);
@@ -3305,12 +3293,10 @@ var proxyComponent = (Cstr, cmpMeta, flags) => {
3305
3293
 
3306
3294
  // src/runtime/initialize-component.ts
3307
3295
  var initializeComponent = async (elm, hostRef, cmpMeta, hmrVersionId) => {
3308
- var _a2;
3309
3296
  let Cstr;
3310
3297
  try {
3311
3298
  if ((hostRef.$flags$ & 32 /* hasInitializedComponent */) === 0) {
3312
3299
  hostRef.$flags$ |= 32 /* hasInitializedComponent */;
3313
- hostRef.$flags$ &= -1025 /* hasFailedLoad */;
3314
3300
  const bundleId = cmpMeta.$lazyBundleId$;
3315
3301
  if (bundleId) {
3316
3302
  const CstrImport = loadModule(cmpMeta);
@@ -3322,11 +3308,6 @@ var initializeComponent = async (elm, hostRef, cmpMeta, hmrVersionId) => {
3322
3308
  Cstr = CstrImport;
3323
3309
  }
3324
3310
  if (!Cstr) {
3325
- hostRef.$flags$ &= -33 /* hasInitializedComponent */;
3326
- hostRef.$loadRetryCount$ = ((_a2 = hostRef.$loadRetryCount$) != null ? _a2 : 0) + 1;
3327
- if (hostRef.$loadRetryCount$ < MAX_LAZY_LOAD_RETRIES) {
3328
- hostRef.$flags$ |= 1024 /* hasFailedLoad */;
3329
- }
3330
3311
  throw new Error(`Constructor for "${cmpMeta.$tagName$}#${hostRef.$modeName$}" was not found`);
3331
3312
  }
3332
3313
  if (!Cstr.isProxied) {
@@ -3406,7 +3387,7 @@ var initializeComponent = async (elm, hostRef, cmpMeta, hmrVersionId) => {
3406
3387
  hostRef.$onRenderResolve$();
3407
3388
  hostRef.$onRenderResolve$ = void 0;
3408
3389
  }
3409
- if (hostRef.$onReadyResolve$ && !(hostRef.$flags$ & 1024 /* hasFailedLoad */)) {
3390
+ if (hostRef.$onReadyResolve$) {
3410
3391
  hostRef.$onReadyResolve$(elm);
3411
3392
  }
3412
3393
  }
@@ -3465,8 +3446,6 @@ var connectedCallback = (elm) => {
3465
3446
  addHostEventListeners(elm, hostRef, cmpMeta.$listeners$);
3466
3447
  if (hostRef == null ? void 0 : hostRef.$lazyInstance$) {
3467
3448
  fireConnectedCallback(hostRef.$lazyInstance$, elm);
3468
- } else if (hostRef.$flags$ & 1024 /* hasFailedLoad */) {
3469
- setTimeout(() => initializeComponent(elm, hostRef, cmpMeta), LAZY_LOAD_RETRY_INTERVAL_MS);
3470
3449
  } else if (hostRef == null ? void 0 : hostRef.$onReadyPromise$) {
3471
3450
  hostRef.$onReadyPromise$.then(() => fireConnectedCallback(hostRef.$lazyInstance$, elm));
3472
3451
  }
@@ -7982,15 +7961,6 @@ const activeAnimations = new WeakMap();
7982
7961
  const isBackdropAlwaysBlocking = (el) => {
7983
7962
  return el.showBackdrop !== false && !((el.backdropBreakpoint ?? 0) > 0);
7984
7963
  };
7985
- /**
7986
- * Whether the overlay takes the app root out of the accessibility tree and
7987
- * blocks body scroll while presented. Toasts never do, modal and popover can
7988
- * opt out with `focusTrap={false}`, and a backdrop that does not block
7989
- * (`showBackdrop={false}`, or a `backdropBreakpoint` above 0) is excluded.
7990
- */
7991
- const locksAppRoot = (el) => {
7992
- return el.tagName !== 'ION-TOAST' && el.focusTrap !== false && isBackdropAlwaysBlocking(el);
7993
- };
7994
7964
  const createController = (tagName) => {
7995
7965
  return {
7996
7966
  create(options) {
@@ -8359,13 +8329,6 @@ const getPresentedOverlay = (doc, overlayTag, id) => {
8359
8329
  // Otherwise, return the last overlay with the given id
8360
8330
  return (id === undefined ? overlays : overlays.filter((o) => o.id === id)).slice(-1)[0];
8361
8331
  };
8362
- /**
8363
- * The element an app nests its views under. Overlays hide this rather than the
8364
- * whole root, so the overlay itself (a sibling) stays reachable.
8365
- */
8366
- const getViewContainer = () => {
8367
- return getAppRoot(document).querySelector('ion-router-outlet, #ion-view-container-root');
8368
- };
8369
8332
  /**
8370
8333
  * When an overlay is presented, the main
8371
8334
  * focus is the overlay not the page content.
@@ -8389,7 +8352,8 @@ const getViewContainer = () => {
8389
8352
  * for main content.
8390
8353
  */
8391
8354
  const setRootAriaHidden = (hidden = false) => {
8392
- const viewContainer = getViewContainer();
8355
+ const root = getAppRoot(document);
8356
+ const viewContainer = root.querySelector('ion-router-outlet, #ion-view-container-root');
8393
8357
  if (!viewContainer) {
8394
8358
  return;
8395
8359
  }
@@ -8414,42 +8378,15 @@ const cleanupRootFocusTrapAccessibility = () => {
8414
8378
  return;
8415
8379
  }
8416
8380
  const remainingOverlays = getPresentedOverlays(document);
8417
- const hasRemainingLocking = remainingOverlays.some((o) => locksAppRoot(o));
8381
+ const hasRemainingLocking = remainingOverlays.some((o) => {
8382
+ const el = o;
8383
+ return el.tagName !== 'ION-TOAST' && el.focusTrap !== false && isBackdropAlwaysBlocking(el);
8384
+ });
8418
8385
  if (!hasRemainingLocking) {
8419
8386
  setRootAriaHidden(false);
8420
8387
  document.body.classList.remove(BACKDROP_NO_SCROLL);
8421
8388
  }
8422
8389
  };
8423
- /**
8424
- * Applies the root lock itself: `aria-hidden` on the view container, and
8425
- * `backdrop-no-scroll` on the body. Shared by `present()` and the restore
8426
- * below, which have to stay in lockstep.
8427
- */
8428
- const applyRootLock = (el) => {
8429
- // Hiding the container the overlay now sits in would hide the overlay too.
8430
- if (!getViewContainer()?.contains(el)) {
8431
- setRootAriaHidden(true);
8432
- }
8433
- document.body.classList.add(BACKDROP_NO_SCROLL);
8434
- };
8435
- /**
8436
- * Re-applies the root lock that `cleanupRootFocusTrapAccessibility()` released.
8437
- * Call from `connectedCallback` when the overlay is still presented.
8438
- *
8439
- * A synchronous move keeps the overlay connected, so the lock survives. A
8440
- * detach with a re-insert in a later task releases it, which is the shape a
8441
- * framework produces when it takes a subtree out and puts it back.
8442
- */
8443
- const restoreRootFocusTrapAccessibility = (overlayEl) => {
8444
- if (typeof document === 'undefined') {
8445
- return;
8446
- }
8447
- const el = overlayEl;
8448
- if (!locksAppRoot(el)) {
8449
- return;
8450
- }
8451
- applyRootLock(el);
8452
- };
8453
8390
  const present = async (overlay, name, iosEnterAnimation, mdEnterAnimation, opts) => {
8454
8391
  if (overlay.presented) {
8455
8392
  return;
@@ -8466,7 +8403,15 @@ const present = async (overlay, name, iosEnterAnimation, mdEnterAnimation, opts)
8466
8403
  restoreElementFocus(overlay.el);
8467
8404
  }
8468
8405
  /**
8469
- * Some apps move inline overlays to a specific container
8406
+ * Due to accessibility guidelines, toasts do not have
8407
+ * focus traps.
8408
+ *
8409
+ * All other overlays should have focus traps to prevent
8410
+ * the keyboard focus from leaving the overlay unless
8411
+ * developers explicitly opt out (for example, sheet
8412
+ * modals that should permit background interaction).
8413
+ *
8414
+ * Note: Some apps move inline overlays to a specific container
8470
8415
  * during the willPresent lifecycle (e.g., React portals via
8471
8416
  * onWillPresent). Defer applying aria-hidden/inert to the app
8472
8417
  * root until after willPresent so we can detect where the
@@ -8475,11 +8420,18 @@ const present = async (overlay, name, iosEnterAnimation, mdEnterAnimation, opts)
8475
8420
  * to avoid disabling the overlay.
8476
8421
  */
8477
8422
  const overlayEl = overlay.el;
8478
- const shouldLockRoot = locksAppRoot(overlayEl);
8423
+ const shouldTrapFocus = overlayEl.tagName !== 'ION-TOAST' && overlayEl.focusTrap !== false;
8424
+ const shouldLockRoot = shouldTrapFocus && isBackdropAlwaysBlocking(overlayEl);
8479
8425
  overlay.presented = true;
8480
8426
  overlay.willPresent.emit();
8481
8427
  if (shouldLockRoot) {
8482
- applyRootLock(overlayEl);
8428
+ const root = getAppRoot(document);
8429
+ const viewContainer = root.querySelector('ion-router-outlet, #ion-view-container-root');
8430
+ const overlayInsideViewContainer = viewContainer ? viewContainer.contains(overlayEl) : false;
8431
+ if (!overlayInsideViewContainer) {
8432
+ setRootAriaHidden(true);
8433
+ }
8434
+ document.body.classList.add(BACKDROP_NO_SCROLL);
8483
8435
  }
8484
8436
  overlay.willPresentShorthand?.emit();
8485
8437
  const mode = getIonMode$1(overlay);
@@ -8605,9 +8557,12 @@ const dismiss = async (overlay, data, role, name, iosLeaveAnimation, mdLeaveAnim
8605
8557
  * from the root element when the last focus-trapping overlay
8606
8558
  * is dismissed.
8607
8559
  */
8608
- const overlaysLockingRoot = presentedOverlays.filter((o) => locksAppRoot(o));
8560
+ const overlaysLockingRoot = presentedOverlays.filter((o) => {
8561
+ const el = o;
8562
+ return el.tagName !== 'ION-TOAST' && el.focusTrap !== false && isBackdropAlwaysBlocking(el);
8563
+ });
8609
8564
  const overlayEl = overlay.el;
8610
- const locksRoot = locksAppRoot(overlayEl);
8565
+ const locksRoot = overlayEl.tagName !== 'ION-TOAST' && overlayEl.focusTrap !== false && isBackdropAlwaysBlocking(overlayEl);
8611
8566
  /**
8612
8567
  * If this is the last visible overlay that is trapping focus
8613
8568
  * then we want to re-add the root to the accessibility tree.
@@ -10603,13 +10558,6 @@ class ActionSheet {
10603
10558
  connectedCallback() {
10604
10559
  prepareOverlay(this.el);
10605
10560
  this.triggerChanged();
10606
- // `componentDidLoad` only fires once per instance, so a reconnect has to
10607
- // rebuild the gesture its disconnect destroyed.
10608
- this.setupButtonActiveGesture();
10609
- // Re-apply the root lock if moved without dismiss() being called
10610
- if (this.presented) {
10611
- restoreRootFocusTrapAccessibility(this.el);
10612
- }
10613
10561
  }
10614
10562
  disconnectedCallback() {
10615
10563
  if (this.gesture) {
@@ -10629,33 +10577,24 @@ class ActionSheet {
10629
10577
  // Initialize activeRadioId for radio buttons
10630
10578
  this.buttonsChanged();
10631
10579
  }
10632
- /**
10633
- * Only create gesture if:
10634
- * 1. A gesture does not already exist
10635
- * 2. App is running in iOS mode
10636
- * 3. A wrapper ref exists
10637
- * 4. A group ref exists
10638
- * 5. The host is still connected, since a reconnect can schedule this and
10639
- * disconnect again before the task runs
10640
- */
10641
- setupButtonActiveGesture() {
10580
+ componentDidLoad() {
10581
+ /**
10582
+ * Only create gesture if:
10583
+ * 1. A gesture does not already exist
10584
+ * 2. App is running in iOS mode
10585
+ * 3. A wrapper ref exists
10586
+ * 4. A group ref exists
10587
+ */
10642
10588
  const { groupEl, wrapperEl } = this;
10643
- if (getIonMode$1(this) !== 'ios' || !wrapperEl || !groupEl) {
10644
- return;
10589
+ if (!this.gesture && getIonMode$1(this) === 'ios' && wrapperEl && groupEl) {
10590
+ readTask(() => {
10591
+ const isScrollable = groupEl.scrollHeight > groupEl.clientHeight;
10592
+ if (!isScrollable) {
10593
+ this.gesture = createButtonActiveGesture(wrapperEl, (refEl) => refEl.classList.contains('action-sheet-button'));
10594
+ this.gesture.enable(true);
10595
+ }
10596
+ });
10645
10597
  }
10646
- readTask(() => {
10647
- // Bail if a call queued ahead of this one already built the gesture
10648
- // (a second would orphan the first with its listeners still bound), if
10649
- // the host disconnected while this task waited, or if the group scrolls.
10650
- if (this.gesture || !this.el.isConnected || groupEl.scrollHeight > groupEl.clientHeight) {
10651
- return;
10652
- }
10653
- this.gesture = createButtonActiveGesture(wrapperEl, (refEl) => refEl.classList.contains('action-sheet-button'));
10654
- this.gesture.enable(true);
10655
- });
10656
- }
10657
- componentDidLoad() {
10658
- this.setupButtonActiveGesture();
10659
10598
  /**
10660
10599
  * If action sheet was rendered with isOpen="true"
10661
10600
  * then we should open action sheet immediately.
@@ -10748,17 +10687,17 @@ class ActionSheet {
10748
10687
  const cancelButton = allButtons.find((b) => b.role === 'cancel');
10749
10688
  const buttons = allButtons.filter((b) => b.role !== 'cancel');
10750
10689
  const headerID = `action-sheet-${overlayIndex}-header`;
10751
- return (hAsync(Host, { key: '83b47ea6b81d4eec6582c1dcaae6f267c78ba634', role: "dialog", "aria-modal": "true", "aria-labelledby": header !== undefined ? headerID : null, tabindex: "-1", ...htmlAttributes, style: {
10690
+ return (hAsync(Host, { key: '7685831da9a78b73473246a2cea95cefa79a53c3', role: "dialog", "aria-modal": "true", "aria-labelledby": header !== undefined ? headerID : null, tabindex: "-1", ...htmlAttributes, style: {
10752
10691
  zIndex: `${20000 + this.overlayIndex}`,
10753
10692
  }, class: {
10754
10693
  [mode]: true,
10755
10694
  ...getClassMap(this.cssClass),
10756
10695
  'overlay-hidden': true,
10757
10696
  'action-sheet-translucent': this.translucent,
10758
- }, 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: {
10697
+ }, 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: {
10759
10698
  'action-sheet-title': true,
10760
10699
  'action-sheet-has-sub-title': this.subHeader !== undefined,
10761
- } }, 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" })));
10700
+ } }, 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" })));
10762
10701
  }
10763
10702
  get el() { return getElement(this); }
10764
10703
  static get watchers() { return {
@@ -11140,15 +11079,10 @@ class Alert {
11140
11079
  this.triggerChanged();
11141
11080
  /**
11142
11081
  * If the alert was previously connected and is being reattached, the
11143
- * `ResizeObserver` and the button gesture were torn down. `componentDidLoad`
11144
- * only fires once per instance, so re-establish both here on reconnect.
11082
+ * ResizeObserver was disconnected. componentDidLoad only fires once per
11083
+ * instance, so re-establish the observer here on reconnect.
11145
11084
  */
11146
11085
  this.setupButtonGroupResizeObserver();
11147
- this.setupButtonActiveGesture();
11148
- // Re-apply the root lock if moved without dismiss() being called
11149
- if (this.presented) {
11150
- restoreRootFocusTrapAccessibility(this.el);
11151
- }
11152
11086
  }
11153
11087
  componentWillLoad() {
11154
11088
  if (!this.htmlAttributes?.id) {
@@ -11170,20 +11104,17 @@ class Alert {
11170
11104
  this.buttonGroupResizeObserver?.disconnect();
11171
11105
  this.buttonGroupResizeObserver = undefined;
11172
11106
  }
11173
- /**
11174
- * Only create gesture if:
11175
- * 1. A gesture does not already exist
11176
- * 2. App is running in iOS mode
11177
- * 3. A wrapper ref exists
11178
- */
11179
- setupButtonActiveGesture() {
11107
+ componentDidLoad() {
11108
+ /**
11109
+ * Only create gesture if:
11110
+ * 1. A gesture does not already exist
11111
+ * 2. App is running in iOS mode
11112
+ * 3. A wrapper ref exists
11113
+ */
11180
11114
  if (!this.gesture && getIonMode$1(this) === 'ios' && this.wrapperEl) {
11181
11115
  this.gesture = createButtonActiveGesture(this.wrapperEl, (refEl) => refEl.classList.contains('alert-button'));
11182
11116
  this.gesture.enable(true);
11183
11117
  }
11184
- }
11185
- componentDidLoad() {
11186
- this.setupButtonActiveGesture();
11187
11118
  this.setupButtonGroupResizeObserver();
11188
11119
  /**
11189
11120
  * If alert was rendered with isOpen="true"
@@ -11504,14 +11435,14 @@ class Alert {
11504
11435
  * If neither are defined, do not set aria-labelledby.
11505
11436
  */
11506
11437
  const ariaLabelledBy = header && subHeader ? `${hdrId} ${subHdrId}` : header ? hdrId : subHeader ? subHdrId : null;
11507
- return (hAsync(Host, { key: '083b5250dc4c76e85240e0225abcb7ca2b66de2f', tabindex: "-1", style: {
11438
+ return (hAsync(Host, { key: '022f3463b8e6c52064b90ec304c524847c3d5ad3', tabindex: "-1", style: {
11508
11439
  zIndex: `${20000 + overlayIndex}`,
11509
11440
  }, class: {
11510
11441
  ...getClassMap(this.cssClass),
11511
11442
  [mode]: true,
11512
11443
  'overlay-hidden': true,
11513
11444
  'alert-translucent': this.translucent,
11514
- }, 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" })));
11445
+ }, 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" })));
11515
11446
  }
11516
11447
  get el() { return getElement(this); }
11517
11448
  static get watchers() { return {
@@ -13509,7 +13440,6 @@ class Content {
13509
13440
  this.cTop = -1;
13510
13441
  this.cBottom = -1;
13511
13442
  this.isMainContent = true;
13512
- this.sizeToContent = false;
13513
13443
  this.resizeTimeout = null;
13514
13444
  this.inheritedAttributes = {};
13515
13445
  this.tabsElement = null;
@@ -13606,7 +13536,6 @@ class Content {
13606
13536
  }
13607
13537
  // Re-observe on reattach, since componentDidLoad only fires once.
13608
13538
  this.setupFullscreenResizeObserver();
13609
- this.setupSizeToContentObserver();
13610
13539
  }
13611
13540
  componentDidLoad() {
13612
13541
  // The custom elements build assigns fullscreen after connectedCallback.
@@ -13633,7 +13562,6 @@ class Content {
13633
13562
  this.resizeTimeout = null;
13634
13563
  }
13635
13564
  this.destroyFullscreenResizeObserver();
13636
- this.destroySizeToContentObserver();
13637
13565
  }
13638
13566
  /**
13639
13567
  * Header and footer sizes can change after load without a window resize
@@ -13647,34 +13575,6 @@ class Content {
13647
13575
  return;
13648
13576
  }
13649
13577
  }
13650
- /**
13651
- * A modal's `--height` can be changed at runtime with no event to react to,
13652
- * either by setting the property directly or by toggling a class that changes
13653
- * which rule wins. Both of those mutate an attribute on the modal, so watch
13654
- * for that and re-evaluate. Viewport driven changes are already covered by
13655
- * the `resize` listener.
13656
- */
13657
- setupSizeToContentObserver() {
13658
- {
13659
- return;
13660
- }
13661
- }
13662
- destroySizeToContentObserver() {
13663
- if (this.sizeToContentObserver !== undefined) {
13664
- this.sizeToContentObserver.disconnect();
13665
- this.sizeToContentObserver = undefined;
13666
- }
13667
- }
13668
- /**
13669
- * Re-renders when the overlay is no longer sized the way the last render
13670
- * assumed. Read in a `readTask` because resolving the custom property forces
13671
- * a style recalculation.
13672
- */
13673
- updateSizeToContent() {
13674
- readTask(() => {
13675
- if (this.shouldSizeToContent() !== this.sizeToContent) ;
13676
- });
13677
- }
13678
13578
  destroyFullscreenResizeObserver() {
13679
13579
  if (this.fullscreenResizeObserver !== undefined) {
13680
13580
  this.fullscreenResizeObserver.disconnect();
@@ -13721,30 +13621,6 @@ class Content {
13721
13621
  const mode = getIonMode$1(this);
13722
13622
  return forceOverscroll === undefined ? mode === 'ios' && isPlatform('ios') : forceOverscroll;
13723
13623
  }
13724
- /**
13725
- * Whether this component should size itself to its contents height, which
13726
- * is the case inside any popover and inside a modal whose `--height` is a
13727
- * content-based value. Those overlays give the content no definite height
13728
- * to fill.
13729
- */
13730
- shouldSizeToContent() {
13731
- if (hostContext('ion-popover', this.el)) {
13732
- return true;
13733
- }
13734
- const modal = this.el.closest('ion-modal');
13735
- if (modal === null) {
13736
- return false;
13737
- }
13738
- const height = getComputedStyle(modal).getPropertyValue('--height').trim();
13739
- /**
13740
- * Compared as a suffix so a value carrying only a vendor prefix is still
13741
- * recognized, such as the `-moz-fit-content` that Firefox needs before 94.
13742
- *
13743
- * TODO: replace with `CONTENT_SIZED_HEIGHTS.includes(height)` once the
13744
- * oldest supported Firefox is 94 or higher.
13745
- */
13746
- return CONTENT_SIZED_HEIGHTS.some((value) => height.endsWith(value));
13747
- }
13748
13624
  resize() {
13749
13625
  }
13750
13626
  /**
@@ -13924,21 +13800,21 @@ class Content {
13924
13800
  const forceOverscroll = this.shouldForceOverscroll();
13925
13801
  const transitionShadow = mode === 'ios';
13926
13802
  this.resize();
13927
- return (hAsync(Host, { key: '3985c7121dd5183fef892c2ab20935419bca3ad5', role: isMainContent ? 'main' : undefined, class: createColorClasses$1(this.color, {
13803
+ return (hAsync(Host, { key: '9551c759df407b10d809171641fc6e8f14d92219', role: isMainContent ? 'main' : undefined, class: createColorClasses$1(this.color, {
13928
13804
  [mode]: true,
13929
13805
  'content-fullscreen': this.fullscreen,
13930
- 'content-sizing': (this.sizeToContent = this.shouldSizeToContent()),
13806
+ 'content-sizing': hostContext('ion-popover', this.el),
13931
13807
  overscroll: forceOverscroll,
13932
13808
  [`content-${rtl}`]: true,
13933
13809
  }), style: {
13934
13810
  '--offset-top': `${this.cTop}px`,
13935
13811
  '--offset-bottom': `${this.cBottom}px`,
13936
- }, ...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: {
13812
+ }, ...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: {
13937
13813
  'inner-scroll': true,
13938
13814
  'scroll-x': scrollX,
13939
13815
  'scroll-y': scrollY,
13940
13816
  overscroll: (scrollX || scrollY) && forceOverscroll,
13941
- }, 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));
13817
+ }, 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));
13942
13818
  }
13943
13819
  get el() { return getElement(this); }
13944
13820
  static get watchers() { return {
@@ -13971,11 +13847,6 @@ class Content {
13971
13847
  "$attrsToReflect$": [["color", "color"]]
13972
13848
  }; }
13973
13849
  }
13974
- /**
13975
- * `ion-modal` `--height` values that size the modal to its contents, leaving
13976
- * children an indefinite height to resolve against.
13977
- */
13978
- const CONTENT_SIZED_HEIGHTS = ['auto', 'fit-content', 'min-content', 'max-content'];
13979
13850
  const getParentElement = (el) => {
13980
13851
  if (el.parentElement) {
13981
13852
  // normal element with a parent element
@@ -17157,6 +17028,7 @@ class Datetime {
17157
17028
  }
17158
17029
  renderCombinedDatePickerColumn() {
17159
17030
  const { defaultParts, disabled, workingParts, locale, minParts, maxParts, todayParts, isDateEnabled } = this;
17031
+ const activePart = this.getActivePartsWithFallback();
17160
17032
  /**
17161
17033
  * By default, generate a range of 3 months:
17162
17034
  * Previous month, current month, and next month
@@ -17212,10 +17084,8 @@ class Datetime {
17212
17084
  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) => {
17213
17085
  const { value } = ev.detail;
17214
17086
  const findPart = parts.find(({ month, day, year }) => value === `${year}-${month}-${day}`);
17215
- // Read live so parts a sibling column just committed are included.
17216
- const activePart = this.getActivePartsWithFallback();
17217
17087
  this.setWorkingParts({
17218
- ...this.workingParts,
17088
+ ...workingParts,
17219
17089
  ...findPart,
17220
17090
  });
17221
17091
  this.setActiveParts({
@@ -17292,12 +17162,11 @@ class Datetime {
17292
17162
  return [];
17293
17163
  }
17294
17164
  const { disabled, workingParts } = this;
17165
+ const activePart = this.getActivePartsWithFallback();
17295
17166
  const pickerColumnValue = (workingParts.day !== null ? workingParts.day : this.defaultParts.day) ?? undefined;
17296
17167
  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) => {
17297
- // Read live so parts a sibling column just committed are included.
17298
- const activePart = this.getActivePartsWithFallback();
17299
17168
  this.setWorkingParts({
17300
- ...this.workingParts,
17169
+ ...workingParts,
17301
17170
  day: ev.detail.value,
17302
17171
  });
17303
17172
  this.setActiveParts({
@@ -17312,11 +17181,10 @@ class Datetime {
17312
17181
  return [];
17313
17182
  }
17314
17183
  const { disabled, workingParts } = this;
17184
+ const activePart = this.getActivePartsWithFallback();
17315
17185
  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) => {
17316
- // Read live so parts a sibling column just committed are included.
17317
- const activePart = this.getActivePartsWithFallback();
17318
17186
  this.setWorkingParts({
17319
- ...this.workingParts,
17187
+ ...workingParts,
17320
17188
  month: ev.detail.value,
17321
17189
  });
17322
17190
  // Month wheel is navigation-only in multi-select mode as a fix for https://github.com/ionic-team/ionic-framework/issues/29673
@@ -17334,11 +17202,10 @@ class Datetime {
17334
17202
  return [];
17335
17203
  }
17336
17204
  const { disabled, workingParts } = this;
17205
+ const activePart = this.getActivePartsWithFallback();
17337
17206
  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) => {
17338
- // Read live so parts a sibling column just committed are included.
17339
- const activePart = this.getActivePartsWithFallback();
17340
17207
  this.setWorkingParts({
17341
- ...this.workingParts,
17208
+ ...workingParts,
17342
17209
  year: ev.detail.value,
17343
17210
  });
17344
17211
  // Year wheel is navigation-only in multi-select mode as a fix for https://github.com/ionic-team/ionic-framework/issues/29673
@@ -17374,14 +17241,13 @@ class Datetime {
17374
17241
  ];
17375
17242
  }
17376
17243
  renderHourPickerColumn(hoursData) {
17377
- const { disabled } = this;
17244
+ const { disabled, workingParts } = this;
17378
17245
  if (hoursData.length === 0)
17379
17246
  return [];
17380
17247
  const activePart = this.getActivePartsWithFallback();
17381
17248
  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) => {
17382
- // Read live so parts a sibling column just committed are included.
17383
17249
  this.setWorkingParts({
17384
- ...this.workingParts,
17250
+ ...workingParts,
17385
17251
  hour: ev.detail.value,
17386
17252
  });
17387
17253
  this.setActiveParts({
@@ -17392,14 +17258,13 @@ class Datetime {
17392
17258
  } }, 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)))));
17393
17259
  }
17394
17260
  renderMinutePickerColumn(minutesData) {
17395
- const { disabled } = this;
17261
+ const { disabled, workingParts } = this;
17396
17262
  if (minutesData.length === 0)
17397
17263
  return [];
17398
17264
  const activePart = this.getActivePartsWithFallback();
17399
17265
  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) => {
17400
- // Read live so parts a sibling column just committed are included.
17401
17266
  this.setWorkingParts({
17402
- ...this.workingParts,
17267
+ ...workingParts,
17403
17268
  minute: ev.detail.value,
17404
17269
  });
17405
17270
  this.setActiveParts({
@@ -17410,18 +17275,16 @@ class Datetime {
17410
17275
  } }, 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)))));
17411
17276
  }
17412
17277
  renderDayPeriodPickerColumn(dayPeriodData) {
17413
- const { disabled } = this;
17278
+ const { disabled, workingParts } = this;
17414
17279
  if (dayPeriodData.length === 0) {
17415
17280
  return [];
17416
17281
  }
17417
17282
  const activePart = this.getActivePartsWithFallback();
17418
17283
  const isDayPeriodRTL = isLocaleDayPeriodRTL(this.locale);
17419
17284
  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) => {
17420
- // Read live so parts a sibling column just committed are included.
17421
- const currentParts = this.workingParts;
17422
- const hour = calculateHourFromAMPM(currentParts, ev.detail.value);
17285
+ const hour = calculateHourFromAMPM(workingParts, ev.detail.value);
17423
17286
  this.setWorkingParts({
17424
- ...currentParts,
17287
+ ...workingParts,
17425
17288
  ampm: ev.detail.value,
17426
17289
  hour,
17427
17290
  });
@@ -17773,7 +17636,7 @@ class Datetime {
17773
17636
  const hasDatePresentation = presentation === 'date' || presentation === 'date-time' || presentation === 'time-date';
17774
17637
  const hasWheelVariant = hasDatePresentation && preferWheel;
17775
17638
  renderHiddenInput(true, el, name, formatValue(value), disabled);
17776
- return (hAsync(Host, { key: '4e0b529a70924b065bcc6191e08550428b5a52a0', "aria-disabled": disabled ? 'true' : null, onFocus: this.onFocus, onBlur: this.onBlur, class: {
17639
+ return (hAsync(Host, { key: 'd8e6dfe5e3bffb1c38a3e37b63b3aec099f40d29', "aria-disabled": disabled ? 'true' : null, onFocus: this.onFocus, onBlur: this.onBlur, class: {
17777
17640
  ...createColorClasses$1(color, {
17778
17641
  [mode]: true,
17779
17642
  ['datetime-readonly']: readonly,
@@ -17785,7 +17648,7 @@ class Datetime {
17785
17648
  [`datetime-prefer-wheel`]: hasWheelVariant,
17786
17649
  [`datetime-grid`]: isGridStyle,
17787
17650
  }),
17788
- } }, hAsync("div", { key: 'cc9d1b92f960984cb0466d0003a240ace67da243', class: "intersection-tracker", ref: (el) => (this.intersectionTrackerRef = el) }), this.renderDatetime(mode)));
17651
+ } }, hAsync("div", { key: '20889d3c68dd5109633c0e214411a63d6f3025bb', class: "intersection-tracker", ref: (el) => (this.intersectionTrackerRef = el) }), this.renderDatetime(mode)));
17789
17652
  }
17790
17653
  get el() { return getElement(this); }
17791
17654
  static get watchers() { return {
@@ -22467,17 +22330,19 @@ class ItemSliding {
22467
22330
  }
22468
22331
  }
22469
22332
  async updateOptions() {
22470
- const options = Array.from(this.el.querySelectorAll('ion-item-options'));
22471
- /**
22472
- * Frameworks that assign element props after inserting the element haven't set
22473
- * `side` while `connectedCallback` runs, so reading it any earlier reports every
22474
- * option as `end`.
22475
- */
22476
- await Promise.all(options.map((option) => new Promise((resolve) => componentOnReady(option, resolve))));
22333
+ const options = this.el.querySelectorAll('ion-item-options');
22477
22334
  let sides = 0;
22478
22335
  // Reset left and right options in case they were removed
22479
22336
  this.leftOptions = this.rightOptions = undefined;
22480
- for (const option of options) {
22337
+ for (let i = 0; i < options.length; i++) {
22338
+ const item = options.item(i);
22339
+ /**
22340
+ * We cannot use the componentOnReady helper
22341
+ * util here since we need to wait for all of these items
22342
+ * to be ready before we set `this.sides` and `this.optsDirty`.
22343
+ */
22344
+ // eslint-disable-next-line custom-rules/no-component-on-ready-method
22345
+ const option = item.componentOnReady !== undefined ? await item.componentOnReady() : item;
22481
22346
  const side = isEndSide(option.side ?? option.getAttribute('side')) ? 'end' : 'start';
22482
22347
  if (side === 'start') {
22483
22348
  this.leftOptions = option;
@@ -22676,7 +22541,7 @@ class ItemSliding {
22676
22541
  }
22677
22542
  render() {
22678
22543
  const mode = getIonMode$1(this);
22679
- return (hAsync(Host, { key: '02174ca963753d3a51a4249068f3d436f8acb03d', class: {
22544
+ return (hAsync(Host, { key: '15f6a98f8c888e86c29827cdf55d98ace08699dd', class: {
22680
22545
  [mode]: true,
22681
22546
  'item-sliding-active-slide': this.state !== 2 /* SlidingState.Disabled */,
22682
22547
  'item-sliding-active-options-end': (this.state & 8 /* SlidingState.End */) !== 0,
@@ -23089,10 +22954,6 @@ class Loading {
23089
22954
  connectedCallback() {
23090
22955
  prepareOverlay(this.el);
23091
22956
  this.triggerChanged();
23092
- // Re-apply the root lock if moved without dismiss() being called
23093
- if (this.presented) {
23094
- restoreRootFocusTrapAccessibility(this.el);
23095
- }
23096
22957
  }
23097
22958
  componentWillLoad() {
23098
22959
  if (this.spinner === undefined) {
@@ -23193,14 +23054,14 @@ class Loading {
23193
23054
  * Otherwise, don't set aria-labelledby.
23194
23055
  */
23195
23056
  const ariaLabelledBy = message !== undefined ? msgId : null;
23196
- return (hAsync(Host, { key: 'b4430bc66aedeca19d5645667cba73c169c4bd76', role: "dialog", "aria-modal": "true", "aria-labelledby": ariaLabelledBy, tabindex: "-1", ...htmlAttributes, style: {
23057
+ return (hAsync(Host, { key: '2d14122ff3081de73631a7fdd4affdd5c73b8618', role: "dialog", "aria-modal": "true", "aria-labelledby": ariaLabelledBy, tabindex: "-1", ...htmlAttributes, style: {
23197
23058
  zIndex: `${40000 + this.overlayIndex}`,
23198
23059
  }, onIonBackdropTap: this.onBackdropTap, class: {
23199
23060
  ...getClassMap(this.cssClass),
23200
23061
  [mode]: true,
23201
23062
  'overlay-hidden': true,
23202
23063
  'loading-translucent': this.translucent,
23203
- } }, 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" })));
23064
+ } }, 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" })));
23204
23065
  }
23205
23066
  get el() { return getElement(this); }
23206
23067
  static get watchers() { return {
@@ -26721,9 +26582,9 @@ const clearSafeAreaOverrides = (hostEl) => {
26721
26582
  hostEl.style.removeProperty('--ion-safe-area-right');
26722
26583
  };
26723
26584
 
26724
- 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}`;
26585
+ 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}`;
26725
26586
 
26726
- 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}`;
26587
+ 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}`;
26727
26588
 
26728
26589
  // TODO(FW-2832): types
26729
26590
  /**
@@ -26759,9 +26620,6 @@ class Modal {
26759
26620
  this.inline = false;
26760
26621
  // Whether or not modal is being dismissed via gesture
26761
26622
  this.gestureAnimationDismissing = false;
26762
- // True from the first safe-area write in `present()` until the enter
26763
- // animation settles. A position-based read in that window is not the rest position.
26764
- this.isPresenting = false;
26765
26623
  this.presented = false;
26766
26624
  /** @internal */
26767
26625
  this.hasController = false;
@@ -26998,17 +26856,6 @@ class Modal {
26998
26856
  const { el } = this;
26999
26857
  prepareOverlay(el);
27000
26858
  this.triggerChanged();
27001
- // A disconnect tears down state this presentation still needs and cannot
27002
- // tell a re-insert from a removal, so put it back.
27003
- if (this.presented || this.isPresenting) {
27004
- this.restoreSafeAreaOverrides();
27005
- }
27006
- // A relocation from `willPresent` reaches these before `present()` has
27007
- // applied the lock, so they apply it instead. Both are idempotent.
27008
- if (this.presented) {
27009
- restoreRootFocusTrapAccessibility(el);
27010
- this.initParentRemovalObserver();
27011
- }
27012
26859
  }
27013
26860
  disconnectedCallback() {
27014
26861
  this.triggerController.removeClickListener();
@@ -27186,33 +27033,25 @@ class Modal {
27186
27033
  // Recalculate isSheetModal before safe-area setup because framework
27187
27034
  // bindings (e.g., Angular) may not have been applied when componentWillLoad ran.
27188
27035
  this.isSheetModal = this.breakpoints !== undefined && this.initialBreakpoint !== undefined;
27189
- this.isPresenting = true;
27036
+ // Set initial safe-area overrides before animation
27037
+ this.setInitialSafeAreaOverrides();
27190
27038
  const hasCardModal = presentingElement !== undefined;
27191
- // Wrapped so a throw cannot strand `isPresenting`, which would suppress
27192
- // the position-based correction for the life of this instance.
27193
- try {
27194
- // Set initial safe-area overrides before animation
27195
- this.setInitialSafeAreaOverrides();
27196
- /**
27197
- * We need to change the status bar at the
27198
- * start of the animation so that it completes
27199
- * by the time the card animation is done.
27200
- */
27201
- if (hasCardModal && getIonMode$1(this) === 'ios') {
27202
- // Cache the original status bar color before the modal is presented
27203
- this.statusBarStyle = await StatusBar.getStyle();
27204
- setCardStatusBarDark();
27205
- }
27206
- await present(this, 'modalEnter', iosEnterAnimation$2, mdEnterAnimation$2, {
27207
- presentingEl: presentingElement,
27208
- currentBreakpoint: this.initialBreakpoint,
27209
- backdropBreakpoint: this.backdropBreakpoint,
27210
- expandToScroll: this.expandToScroll,
27211
- });
27212
- }
27213
- finally {
27214
- this.isPresenting = false;
27039
+ /**
27040
+ * We need to change the status bar at the
27041
+ * start of the animation so that it completes
27042
+ * by the time the card animation is done.
27043
+ */
27044
+ if (hasCardModal && getIonMode$1(this) === 'ios') {
27045
+ // Cache the original status bar color before the modal is presented
27046
+ this.statusBarStyle = await StatusBar.getStyle();
27047
+ setCardStatusBarDark();
27215
27048
  }
27049
+ await present(this, 'modalEnter', iosEnterAnimation$2, mdEnterAnimation$2, {
27050
+ presentingEl: presentingElement,
27051
+ currentBreakpoint: this.initialBreakpoint,
27052
+ backdropBreakpoint: this.backdropBreakpoint,
27053
+ expandToScroll: this.expandToScroll,
27054
+ });
27216
27055
  // Update safe-area based on actual position after animation
27217
27056
  this.updateSafeAreaOverrides();
27218
27057
  // Apply fullscreen safe-area padding if needed
@@ -27714,9 +27553,6 @@ class Modal {
27714
27553
  this.cachedOriginalParent.tagName === 'ION-APP') {
27715
27554
  return;
27716
27555
  }
27717
- // Both `present()` and a reconnect call this, so drop any existing
27718
- // observer. Below the guards, so a call that bails cannot leave none.
27719
- this.cleanupParentRemovalObserver();
27720
27556
  this.parentRemovalObserver = new MutationObserver((mutations) => {
27721
27557
  mutations.forEach((mutation) => {
27722
27558
  if (mutation.type === 'childList' && mutation.removedNodes.length > 0) {
@@ -27795,9 +27631,6 @@ class Modal {
27795
27631
  // Set the internal offset property with the resolved root safe-area-top value
27796
27632
  if (context.isSheetModal) {
27797
27633
  this.updateSheetOffsetTop();
27798
- // A restore after a DOM move runs this a second time for the same
27799
- // modal, so drop the previous subscription rather than stacking one.
27800
- this.unsubscribeRootSafeAreaTop?.();
27801
27634
  this.unsubscribeRootSafeAreaTop = onRootSafeAreaTopChange((safeAreaTop) => this.updateSheetOffsetTop(safeAreaTop));
27802
27635
  }
27803
27636
  }
@@ -27916,31 +27749,6 @@ class Modal {
27916
27749
  const { contentEl } = this.findContentAndFooter();
27917
27750
  this.clearContentSafeAreaPadding(contentEl);
27918
27751
  }
27919
- /**
27920
- * Re-applies what `cleanupSafeAreaOverrides()` removed for a modal moved
27921
- * while presented. Anything needing no measurement goes on synchronously so
27922
- * the modal is never painted without safe-area. The position-based
27923
- * correction waits a frame for the layout pass it reads.
27924
- */
27925
- restoreSafeAreaOverrides() {
27926
- this.setInitialSafeAreaOverrides();
27927
- this.applyFullscreenSafeArea();
27928
- raf(() => {
27929
- // A dismiss or another move can land first, and a read before the enter
27930
- // animation settles is not the rest position. `present()` redoes it.
27931
- if (!this.presented || !this.el.isConnected || this.isPresenting) {
27932
- return;
27933
- }
27934
- // A hidden subtree carries `display: none`, so there is no box and the
27935
- // read would write the safe-area for a modal touching no edge. The
27936
- // prediction applied above holds until the modal is shown again.
27937
- const { width, height } = this.el.getBoundingClientRect();
27938
- if (width === 0 && height === 0) {
27939
- return;
27940
- }
27941
- this.updateSafeAreaOverrides();
27942
- });
27943
- }
27944
27752
  render() {
27945
27753
  const { handle, isSheetModal, presentingElement, htmlAttributes, handleBehavior, inheritedAttributes, focusTrap, expandToScroll, } = this;
27946
27754
  const showHandle = handle !== false && isSheetModal;
@@ -27948,7 +27756,7 @@ class Modal {
27948
27756
  const isCardModal = presentingElement !== undefined && mode === 'ios';
27949
27757
  const isHandleCycle = handleBehavior === 'cycle';
27950
27758
  const isSheetModalWithHandle = isSheetModal && showHandle;
27951
- return (hAsync(Host, { key: '7c9c736052c5a788cf31040b6b2386dd9ea7454b', "no-router": true,
27759
+ return (hAsync(Host, { key: 'a471c293319cb6ee5ffb7ffafec0b8413e4289de', "no-router": true,
27952
27760
  // Allow the modal to be navigable when the handle is focusable
27953
27761
  tabIndex: isHandleCycle && isSheetModalWithHandle ? 0 : -1, ...htmlAttributes, style: {
27954
27762
  zIndex: `${20000 + this.overlayIndex}`,
@@ -27961,7 +27769,7 @@ class Modal {
27961
27769
  'overlay-hidden': true,
27962
27770
  [FOCUS_TRAP_DISABLE_CLASS]: focusTrap === false,
27963
27771
  ...getClassMap(this.cssClass),
27964
- }, 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',
27772
+ }, 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',
27965
27773
  /*
27966
27774
  role and aria-modal must be used on the
27967
27775
  same element. They must also be set inside the
@@ -27974,9 +27782,9 @@ class Modal {
27974
27782
  without the tabindex focus() would be a no-op and screen readers
27975
27783
  may not properly announce the dialog and its content when it opens.
27976
27784
  */
27977
- 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",
27785
+ 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",
27978
27786
  // Prevents the handle from receiving keyboard focus when it does not cycle
27979
- 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 }))));
27787
+ 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 }))));
27980
27788
  }
27981
27789
  get el() { return getElement(this); }
27982
27790
  static get watchers() { return {
@@ -29451,12 +29259,6 @@ class PickerColumn {
29451
29259
  this.isColumnVisible = false;
29452
29260
  this.canExitInputMode = true;
29453
29261
  this.updateValueTextOnScroll = false;
29454
- this.isUserScroll = false;
29455
- /**
29456
- * The haptics for the wheel picker are an iOS-only feature. As a result,
29457
- * they should be disabled on Android.
29458
- */
29459
- this.enableHaptics = false;
29460
29262
  this.ariaLabel = null;
29461
29263
  this.isActive = false;
29462
29264
  /**
@@ -29488,12 +29290,6 @@ class PickerColumn {
29488
29290
  */
29489
29291
  this.canExitInputMode = canExitInputMode;
29490
29292
  this.updateValueTextOnScroll = false;
29491
- /**
29492
- * This scroll takes over from whatever the user was doing, so an outside
29493
- * press must not commit an option the column is only passing through.
29494
- */
29495
- this.isUserScroll = false;
29496
- this.stopWatchingForOutsidePress();
29497
29293
  scrollEl.scroll({
29498
29294
  top,
29499
29295
  left: 0,
@@ -29548,117 +29344,6 @@ class PickerColumn {
29548
29344
  }
29549
29345
  this.isActive = state;
29550
29346
  };
29551
- this.clearScrollEndTimeout = () => {
29552
- if (this.scrollEndTimeout) {
29553
- clearTimeout(this.scrollEndTimeout);
29554
- this.scrollEndTimeout = undefined;
29555
- }
29556
- };
29557
- /**
29558
- * Resets the idle timer that commits the centered option.
29559
- */
29560
- this.resetScrollEndTimeout = () => {
29561
- this.clearScrollEndTimeout();
29562
- this.scrollEndTimeout = setTimeout(this.settle, SCROLL_END_DELAY);
29563
- };
29564
- /**
29565
- * Capture so the column still commits if an application's own pointerdown
29566
- * handler stops the event before it reaches the document.
29567
- */
29568
- this.watchForOutsidePress = () => {
29569
- doc?.addEventListener('pointerdown', this.onPointerDownOutside, { capture: true });
29570
- };
29571
- this.stopWatchingForOutsidePress = () => {
29572
- doc?.removeEventListener('pointerdown', this.onPointerDownOutside, { capture: true });
29573
- };
29574
- /**
29575
- * Resets everything the current scroll interaction is holding, so nothing
29576
- * pending on it can commit later.
29577
- */
29578
- this.discardScroll = () => {
29579
- this.stopWatchingForOutsidePress();
29580
- this.clearScrollEndTimeout();
29581
- this.scrollEndCallback = undefined;
29582
- this.centeredOption = undefined;
29583
- this.haltedAtScrollTop = undefined;
29584
- this.isScrolling = false;
29585
- this.isUserScroll = false;
29586
- this.canExitInputMode = true;
29587
- };
29588
- /**
29589
- * Commits the option that is currently centered under the highlight and ends
29590
- * the scroll interaction.
29591
- */
29592
- this.settle = () => {
29593
- const { centeredOption } = this;
29594
- this.clearScrollEndTimeout();
29595
- this.stopWatchingForOutsidePress();
29596
- this.isUserScroll = false;
29597
- this.isScrolling = false;
29598
- this.updateValueTextOnScroll = true;
29599
- this.enableHaptics && hapticSelectionEnd();
29600
- /**
29601
- * Certain tasks (such as those that
29602
- * cause re-renders) should only be done
29603
- * once scrolling has finished, otherwise
29604
- * flickering may occur.
29605
- */
29606
- const { scrollEndCallback } = this;
29607
- if (scrollEndCallback) {
29608
- scrollEndCallback();
29609
- this.scrollEndCallback = undefined;
29610
- }
29611
- /**
29612
- * Reset this flag as the
29613
- * next scroll interaction could
29614
- * be a scroll from the user. In this
29615
- * case, we should exit input mode.
29616
- */
29617
- this.canExitInputMode = true;
29618
- if (centeredOption !== undefined) {
29619
- // Cleared here so a later scroll that centers nothing cannot fall back on it.
29620
- this.centeredOption = undefined;
29621
- if (centeredOption.isConnected) {
29622
- this.setValue(centeredOption.value);
29623
- }
29624
- }
29625
- };
29626
- /**
29627
- * Commits the option the user can see when they press anything outside of the
29628
- * column during a scroll they started. This runs on pointerdown rather than
29629
- * click so the value is up to date by the time an application's own click
29630
- * handler (a Save button, for example) reads it.
29631
- */
29632
- this.onPointerDownOutside = (ev) => {
29633
- const { centeredOption, parentEl, scrollEl } = this;
29634
- if (!this.isScrolling) {
29635
- return;
29636
- }
29637
- /**
29638
- * The column can live in another component's Shadow DOM, where a document
29639
- * listener sees the target retargeted to the outer host. The composed path
29640
- * is the only reliable way to tell a press on the column apart.
29641
- */
29642
- const path = ev.composedPath();
29643
- /**
29644
- * A press anywhere in the parent picker counts as inside, so reaching for a
29645
- * sibling wheel leaves this column coasting.
29646
- */
29647
- if (path.includes(this.el) || (parentEl != null && path.includes(parentEl))) {
29648
- return;
29649
- }
29650
- /**
29651
- * Landing on the centered option halts the in-flight momentum scroll, so the
29652
- * committed value and the option the user is left looking at agree. The
29653
- * option list can be replaced mid-scroll, and a detached option has no
29654
- * offset to center on.
29655
- */
29656
- if (centeredOption !== undefined && centeredOption.isConnected) {
29657
- this.centerPickerItemInView(centeredOption, false, false);
29658
- this.haltedAtScrollTop = scrollEl?.scrollTop;
29659
- }
29660
- this.settle();
29661
- };
29662
29347
  /**
29663
29348
  * When the column scrolls, the component
29664
29349
  * needs to determine which item is centered
@@ -29666,42 +29351,27 @@ class PickerColumn {
29666
29351
  * the item object.
29667
29352
  */
29668
29353
  this.initializeScrollListener = () => {
29669
- this.enableHaptics = isPlatform('ios');
29354
+ /**
29355
+ * The haptics for the wheel picker are
29356
+ * an iOS-only feature. As a result, they should
29357
+ * be disabled on Android.
29358
+ */
29359
+ const enableHaptics = isPlatform('ios');
29670
29360
  const { el, scrollEl } = this;
29361
+ let timeout;
29671
29362
  let activeEl = this.activeItem;
29672
29363
  const scrollCallback = () => {
29673
29364
  raf(() => {
29674
- /**
29675
- * This frame cannot be cancelled, and moving the column disconnects it
29676
- * without the observer reporting a change, so this checks live state.
29677
- */
29678
- if (!this.el.isConnected || !this.isColumnVisible || !scrollEl)
29365
+ if (!scrollEl)
29679
29366
  return;
29680
- const { haltedAtScrollTop } = this;
29681
- if (haltedAtScrollTop !== undefined) {
29682
- /**
29683
- * Still at the halted position, so this frame is the halt landing
29684
- * rather than the wheel moving, and re-arming would start a second
29685
- * commit cycle.
29686
- */
29687
- if (Math.abs(scrollEl.scrollTop - haltedAtScrollTop) <= HALT_TOLERANCE)
29688
- return;
29689
- this.haltedAtScrollTop = undefined;
29367
+ if (timeout) {
29368
+ clearTimeout(timeout);
29369
+ timeout = undefined;
29690
29370
  }
29691
- // Armed before the early returns below, so a scroll never ends uncommitted.
29692
- this.resetScrollEndTimeout();
29693
29371
  if (!this.isScrolling) {
29694
- this.enableHaptics && hapticSelectionStart();
29372
+ enableHaptics && hapticSelectionStart();
29695
29373
  this.isScrolling = true;
29696
29374
  }
29697
- /**
29698
- * Only a user-driven scroll holds an uncommitted selection. Checked every
29699
- * frame because the user can take hold of the wheel mid-scroll, and
29700
- * re-adding the same listener is a no-op.
29701
- */
29702
- if (this.isUserScroll) {
29703
- this.watchForOutsidePress();
29704
- }
29705
29375
  /**
29706
29376
  * Select item in the center of the column
29707
29377
  * which is the month/year that we want to select
@@ -29761,23 +29431,18 @@ class PickerColumn {
29761
29431
  newActiveElement = fallbackActiveElement;
29762
29432
  }
29763
29433
  }
29764
- /**
29765
- * A scroll can land with no selectable option centered, such as an
29766
- * overscroll bounce briefly centering the empty padding rows. Keep the
29767
- * current selection until an option is centered again.
29768
- */
29769
- if (newActiveElement === undefined || newActiveElement.disabled) {
29770
- return;
29771
- }
29772
29434
  if (activeEl !== undefined) {
29773
29435
  this.setPickerItemActiveState(activeEl, false);
29774
29436
  }
29437
+ if (newActiveElement === undefined || newActiveElement.disabled) {
29438
+ return;
29439
+ }
29775
29440
  /**
29776
29441
  * If we are selecting a new value,
29777
29442
  * we need to run haptics again.
29778
29443
  */
29779
29444
  if (newActiveElement !== activeEl) {
29780
- this.enableHaptics && hapticSelectionChanged();
29445
+ enableHaptics && hapticSelectionChanged();
29781
29446
  if (this.canExitInputMode) {
29782
29447
  /**
29783
29448
  * The native iOS wheel picker
@@ -29809,14 +29474,32 @@ class PickerColumn {
29809
29474
  if (this.updateValueTextOnScroll) {
29810
29475
  this.assistiveFocusable?.setAttribute('aria-valuetext', this.getOptionValueText(newActiveElement));
29811
29476
  }
29812
- this.centeredOption = newActiveElement;
29477
+ timeout = setTimeout(() => {
29478
+ this.isScrolling = false;
29479
+ this.updateValueTextOnScroll = true;
29480
+ enableHaptics && hapticSelectionEnd();
29481
+ /**
29482
+ * Certain tasks (such as those that
29483
+ * cause re-renders) should only be done
29484
+ * once scrolling has finished, otherwise
29485
+ * flickering may occur.
29486
+ */
29487
+ const { scrollEndCallback } = this;
29488
+ if (scrollEndCallback) {
29489
+ scrollEndCallback();
29490
+ this.scrollEndCallback = undefined;
29491
+ }
29492
+ /**
29493
+ * Reset this flag as the
29494
+ * next scroll interaction could
29495
+ * be a scroll from the user. In this
29496
+ * case, we should exit input mode.
29497
+ */
29498
+ this.canExitInputMode = true;
29499
+ this.setValue(newActiveElement.value);
29500
+ }, 250);
29813
29501
  });
29814
29502
  };
29815
- const userScrollCallback = () => {
29816
- this.isUserScroll = true;
29817
- // Taking hold of the wheel ends the halt even if it has not moved yet.
29818
- this.haltedAtScrollTop = undefined;
29819
- };
29820
29503
  /**
29821
29504
  * Wrap this in an raf so that the scroll callback
29822
29505
  * does not fire when component is initially shown.
@@ -29825,19 +29508,8 @@ class PickerColumn {
29825
29508
  if (!scrollEl)
29826
29509
  return;
29827
29510
  scrollEl.addEventListener('scroll', scrollCallback);
29828
- scrollEl.addEventListener('pointerdown', userScrollCallback);
29829
- scrollEl.addEventListener('wheel', userScrollCallback, { passive: true });
29830
- /**
29831
- * A `pointerdown` fires once per touch, so a drag that pauses long enough
29832
- * to commit would look like a scroll the column started. A `touchmove`
29833
- * keeps arriving while the finger moves.
29834
- */
29835
- scrollEl.addEventListener('touchmove', userScrollCallback, { passive: true });
29836
29511
  this.destroyScrollListener = () => {
29837
29512
  scrollEl.removeEventListener('scroll', scrollCallback);
29838
- scrollEl.removeEventListener('pointerdown', userScrollCallback);
29839
- scrollEl.removeEventListener('wheel', userScrollCallback);
29840
- scrollEl.removeEventListener('touchmove', userScrollCallback);
29841
29513
  };
29842
29514
  });
29843
29515
  };
@@ -30020,14 +29692,6 @@ class PickerColumn {
30020
29692
  }
30021
29693
  else {
30022
29694
  this.isColumnVisible = false;
30023
- /**
30024
- * The pending timer still runs so it resets the scroll state, but the
30025
- * option it would have committed is dropped. A column the user cannot
30026
- * see should not change its value.
30027
- */
30028
- this.stopWatchingForOutsidePress();
30029
- this.centeredOption = undefined;
30030
- this.haltedAtScrollTop = undefined;
30031
29695
  if (this.destroyScrollListener) {
30032
29696
  this.destroyScrollListener();
30033
29697
  this.destroyScrollListener = undefined;
@@ -30098,13 +29762,6 @@ class PickerColumn {
30098
29762
  connectedCallback() {
30099
29763
  this.ariaLabel = this.el.getAttribute('aria-label') ?? 'Select a value';
30100
29764
  }
30101
- disconnectedCallback() {
30102
- /**
30103
- * A pending settle would otherwise commit a value on a column that is no
30104
- * longer in the DOM.
30105
- */
30106
- this.discardScroll();
30107
- }
30108
29765
  get activeItem() {
30109
29766
  const { value } = this;
30110
29767
  const options = Array.from(this.el.querySelectorAll('ion-picker-column-option'));
@@ -30122,14 +29779,14 @@ class PickerColumn {
30122
29779
  render() {
30123
29780
  const { color, disabled, isActive, numericInput } = this;
30124
29781
  const mode = getIonMode$1(this);
30125
- return (hAsync(Host, { key: '60a893619d0b01fba53fbccef67a10d533a22657', class: createColorClasses$1(color, {
29782
+ return (hAsync(Host, { key: '78b46ad10d88ea1bb43ca8c36748767912f03224', class: createColorClasses$1(color, {
30126
29783
  [mode]: true,
30127
29784
  ['picker-column-active']: isActive,
30128
29785
  ['picker-column-numeric-input']: numericInput,
30129
29786
  ['picker-column-disabled']: disabled,
30130
- }) }, hAsync("slot", { key: '79f1e047f89c5ec916ed02efaac56ef3f73b8969', name: "prefix" }), hAsync("div", { key: 'c45c86e88353a196ff38159f40f390bc27852c9e', class: "picker-opts", ref: (el) => {
29787
+ }) }, hAsync("slot", { key: '761e501df77f7de896ffb3ebb99ebf88c5c3bf70', name: "prefix" }), hAsync("div", { key: '9f4caaeef8ab704522a85f30876d371712f47c5c', class: "picker-opts", ref: (el) => {
30131
29788
  this.scrollEl = el;
30132
- }, 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" })));
29789
+ }, 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" })));
30133
29790
  }
30134
29791
  get el() { return getElement(this); }
30135
29792
  static get watchers() { return {
@@ -30161,19 +29818,6 @@ class PickerColumn {
30161
29818
  }; }
30162
29819
  }
30163
29820
  const PICKER_ITEM_ACTIVE_CLASS = 'option-active';
30164
- /**
30165
- * How long the column must be idle before the centered option is treated as
30166
- * the user's selection. Replaceable by the `scrollend` event once that is
30167
- * supported everywhere (https://caniuse.com/?search=scrollend).
30168
- */
30169
- const SCROLL_END_DELAY = 250;
30170
- /**
30171
- * How far, in pixels, the column may report from where it was halted and still
30172
- * count as having stayed there. Centering targets a position between two snap
30173
- * points, so mandatory snapping corrects it by half the column height less
30174
- * three option heights: 2px at the default sizes.
30175
- */
30176
- const HALT_TOLERANCE = 2;
30177
29821
 
30178
29822
  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}`;
30179
29823
 
@@ -31576,13 +31220,6 @@ class Popover {
31576
31220
  const { configureTriggerInteraction, el } = this;
31577
31221
  prepareOverlay(el);
31578
31222
  configureTriggerInteraction();
31579
- // Re-apply the root lock if moved without dismiss() being called
31580
- if (this.presented) {
31581
- restoreRootFocusTrapAccessibility(el);
31582
- // The disconnect tore down the header observer, and `present()` is its
31583
- // only other caller, so a move mid-layout would lose the recalculation.
31584
- this.recalculateContentOnHeaderReady();
31585
- }
31586
31223
  }
31587
31224
  disconnectedCallback() {
31588
31225
  const { destroyTriggerInteraction } = this;
@@ -31760,12 +31397,6 @@ class Popover {
31760
31397
  if (!header || contentElements.length === 0) {
31761
31398
  return;
31762
31399
  }
31763
- // Both `present()` and a reconnect call this, so drop any existing
31764
- // observer. Below the guards, so a call that bails cannot leave none.
31765
- if (this.headerResizeObserver) {
31766
- this.headerResizeObserver.disconnect();
31767
- this.headerResizeObserver = undefined;
31768
- }
31769
31400
  this.headerResizeObserver = new ResizeObserver(async () => {
31770
31401
  if (header.offsetHeight > 0) {
31771
31402
  this.headerResizeObserver?.disconnect();
@@ -31838,7 +31469,7 @@ class Popover {
31838
31469
  const { onLifecycle, parentPopover, dismissOnSelect, side, arrow, htmlAttributes, focusTrap } = this;
31839
31470
  const desktop = isPlatform('desktop');
31840
31471
  const enableArrow = arrow && !parentPopover;
31841
- return (hAsync(Host, { key: 'b5e9c788f58397203976d5f8302dfb89e916efe1', "aria-modal": "true", "no-router": true, tabindex: "-1", ...htmlAttributes, style: {
31472
+ return (hAsync(Host, { key: '52ffc7116969ae1b8b927e67f2acbfe5f5434f70', "aria-modal": "true", "no-router": true, tabindex: "-1", ...htmlAttributes, style: {
31842
31473
  zIndex: `${20000 + this.overlayIndex}`,
31843
31474
  }, class: {
31844
31475
  ...getClassMap(this.cssClass),
@@ -31849,7 +31480,7 @@ class Popover {
31849
31480
  [`popover-side-${side}`]: true,
31850
31481
  [FOCUS_TRAP_DISABLE_CLASS]: focusTrap === false,
31851
31482
  'popover-nested': !!parentPopover,
31852
- }, 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' })))));
31483
+ }, 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' })))));
31853
31484
  }
31854
31485
  get el() { return getElement(this); }
31855
31486
  static get watchers() { return {
@@ -37644,6 +37275,11 @@ class SegmentButton {
37644
37275
  addEventListener$1(segmentEl, 'ionSelect', this.updateState);
37645
37276
  addEventListener$1(segmentEl, 'ionStyle', this.updateStyle);
37646
37277
  }
37278
+ // Prevent buttons from being disabled when associated with segment content
37279
+ if (this.contentId && this.disabled) {
37280
+ printIonWarning(`[ion-segment-button] - Segment buttons cannot be disabled when associated with an <ion-segment-content>.`);
37281
+ this.disabled = false;
37282
+ }
37647
37283
  }
37648
37284
  disconnectedCallback() {
37649
37285
  const segmentEl = this.segmentEl;
@@ -37660,15 +37296,6 @@ class SegmentButton {
37660
37296
  // Return if there is no contentId defined
37661
37297
  if (!this.contentId)
37662
37298
  return;
37663
- /**
37664
- * Checked here rather than in `connectedCallback` so frameworks that assign element
37665
- * props after inserting the element have set `disabled` by now. A disabled ion-segment
37666
- * pushes that onto its buttons too, which this guard should not undo.
37667
- */
37668
- if (this.disabled && this.segmentEl?.disabled !== true) {
37669
- printIonWarning(`[ion-segment-button] - Segment buttons cannot be disabled when associated with an <ion-segment-content>.`);
37670
- this.disabled = false;
37671
- }
37672
37299
  // Attempt to find the Segment Content by its contentId
37673
37300
  const segmentContent = document.getElementById(this.contentId);
37674
37301
  // If no associated Segment Content exists, log an error and return
@@ -37703,7 +37330,7 @@ class SegmentButton {
37703
37330
  const { checked, type, disabled, hasIcon, hasLabel, layout, segmentEl } = this;
37704
37331
  const mode = getIonMode$1(this);
37705
37332
  const hasSegmentColor = () => segmentEl?.color !== undefined;
37706
- return (hAsync(Host, { key: 'd8acc71d87e26b32f20b2d0f9a6acc9f0dab0dee', class: {
37333
+ return (hAsync(Host, { key: '2b4b7ad8b981d2ee39aba5b9c734de8a5bd045ba', class: {
37707
37334
  [mode]: true,
37708
37335
  'in-toolbar': hostContext('ion-toolbar', this.el),
37709
37336
  'in-toolbar-color': hostContext('ion-toolbar[color]', this.el),
@@ -37719,7 +37346,7 @@ class SegmentButton {
37719
37346
  'ion-activatable': true,
37720
37347
  'ion-activatable-instant': true,
37721
37348
  'ion-focusable': true,
37722
- } }, 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" }))));
37349
+ } }, 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" }))));
37723
37350
  }
37724
37351
  get el() { return getElement(this); }
37725
37352
  static get watchers() { return {
@@ -38763,7 +38390,7 @@ class Select {
38763
38390
  const hasOutlineFill = mode === 'md' && fill === 'outline';
38764
38391
  renderHiddenInput(true, el, name, parseValue(value), disabled);
38765
38392
  const labelShouldFloat = labelPlacement === 'stacked' || (labelPlacement === 'floating' && (hasValue || hasFocus || isExpanded));
38766
- return (hAsync(Host, { key: 'b2f161e3706e139e61440cd13e162714b1b75d72', onClick: this.onClick, class: createColorClasses$1(this.color, {
38393
+ return (hAsync(Host, { key: '5d1e5bf46d0f204efdcb55cc42cfde52e6db304b', onClick: this.onClick, class: createColorClasses$1(this.color, {
38767
38394
  [mode]: true,
38768
38395
  'in-item': inItem,
38769
38396
  'in-item-color': hostContext('ion-item.ion-color', el),
@@ -38781,7 +38408,7 @@ class Select {
38781
38408
  [`select-justify-${justify}`]: justifyEnabled,
38782
38409
  [`select-shape-${shape}`]: shape !== undefined,
38783
38410
  [`select-label-placement-${labelPlacement}`]: true,
38784
- }) }, 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()));
38411
+ }) }, 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()));
38785
38412
  }
38786
38413
  get el() { return getElement(this); }
38787
38414
  static get watchers() { return {
@@ -38890,14 +38517,29 @@ const textForValue = (opts, value, compareWith, useHTML = false) => {
38890
38517
  return getOptionContent(selectOpt, undefined, true);
38891
38518
  }
38892
38519
  /**
38893
- * Every text-only context reads only the default slot, so the start
38894
- * and end slots stay out of the `aria-label` and the overlay labels.
38895
- * Both config paths derive that text through the same helper, so they
38896
- * cannot disagree about what an option's text is. `null` marks an
38897
- * option with no text, which is dropped from the joined text of a
38898
- * `multiple` select rather than joined in as an empty entry.
38520
+ * When custom HTML is enabled, extract only the default slot content.
38521
+ * This ensures aria-label and other text-only contexts read only
38522
+ * the relevant option text.
38899
38523
  */
38900
- return getDefaultSlotPlainText(selectOpt) || null;
38524
+ if (customHTMLEnabled) {
38525
+ const content = getOptionContent(selectOpt);
38526
+ if (typeof content === 'string') {
38527
+ return content;
38528
+ }
38529
+ /**
38530
+ * Elements were found in the default slot, extract and concatenate
38531
+ * their text content while trimming whitespace.
38532
+ */
38533
+ if (content) {
38534
+ const texts = Array.from(content.childNodes)
38535
+ .map((n) => n.textContent?.trim())
38536
+ .filter((t) => t);
38537
+ return texts.join(' ') || null;
38538
+ }
38539
+ // Empty option
38540
+ return null;
38541
+ }
38542
+ return getDefaultSlotPlainText(selectOpt);
38901
38543
  };
38902
38544
  /**
38903
38545
  * Trims whitespace from all text nodes within a DOM tree.
@@ -38953,13 +38595,9 @@ const getOptionContent = (option, slotName, useHTML = false) => {
38953
38595
  if (nodes.length === 0) {
38954
38596
  return null;
38955
38597
  }
38956
- /**
38957
- * Return plain text if no elements are found. This reads the option the
38958
- * same way the non-custom-HTML path does, so the two do not disagree
38959
- * about what an option's text is.
38960
- */
38598
+ // Return plain text if no elements are found
38961
38599
  if (!slotName && nodes.every((n) => n.nodeType === Node.TEXT_NODE)) {
38962
- return getDefaultSlotPlainText(option) || null;
38600
+ return nodes.map((n) => n.textContent?.trim()).join(' ') || null;
38963
38601
  }
38964
38602
  /**
38965
38603
  * Mirror known custom-element properties (e.g. ion-icon's `icon`)
@@ -39015,43 +38653,22 @@ const getOptionDefaultSlot = (option) => {
39015
38653
  }
39016
38654
  return defaultSlotNodes;
39017
38655
  };
39018
- /**
39019
- * Concatenates the text a node renders, skipping the subtrees of tags
39020
- * whose contents the browser never paints (`script`, `style`, and the
39021
- * rest of `blockedTags`). `textContent` includes those, so reading it
39022
- * directly would put stylesheet or script source into the select text
39023
- * and the `aria-label`.
39024
- *
39025
- * @param node - The node to read text from.
39026
- * @returns The node's rendered text.
39027
- */
39028
- const getRenderedTextContent = (node) => {
39029
- if (node.nodeType === Node.TEXT_NODE) {
39030
- return node.textContent ?? '';
39031
- }
39032
- if (node.nodeType !== Node.ELEMENT_NODE) {
39033
- return '';
39034
- }
39035
- if (blockedTags.includes(node.tagName.toLowerCase())) {
39036
- return '';
39037
- }
39038
- return Array.from(node.childNodes)
39039
- .map((child) => getRenderedTextContent(child))
39040
- .join('');
39041
- };
39042
38656
  /**
39043
38657
  * Extracts plain text from only the default slot of an option,
39044
- * excluding content assigned to named slots (start/end). Text is
39045
- * concatenated with no separator and collapsible whitespace is
39046
- * collapsed, approximating how the browser renders the option.
39047
- * NBSP is not collapsible, so it is preserved.
39048
- *
39049
- * @param option - The `ion-select-option` element to read text from.
39050
- * @returns The option's default slot text.
38658
+ * excluding content assigned to named slots (start/end).
39051
38659
  */
39052
38660
  const getDefaultSlotPlainText = (option) => {
39053
- const text = (getOptionDefaultSlot(option) ?? []).map((node) => getRenderedTextContent(node)).join('');
39054
- return text.replace(/[ \t\n\r\f]+/g, ' ').replace(/^[ \t\n\r\f]+|[ \t\n\r\f]+$/g, '');
38661
+ const texts = Array.from(option.childNodes)
38662
+ .filter((node) => {
38663
+ if (node.nodeType === Node.ELEMENT_NODE) {
38664
+ return !node.hasAttribute('slot');
38665
+ }
38666
+ return node.nodeType === Node.TEXT_NODE;
38667
+ })
38668
+ .filter((node) => node.nodeType === Node.TEXT_NODE)
38669
+ .map((n) => n.textContent?.trim())
38670
+ .filter((t) => t);
38671
+ return texts.join(' ');
39055
38672
  };
39056
38673
  /**
39057
38674
  * Extracts the rich content from an `ion-select-option`.
@@ -43127,7 +42744,7 @@ var NAMESPACE = (
43127
42744
  );
43128
42745
 
43129
42746
  /*
43130
- Stencil Hydrate Runner v4.44.1 | MIT Licensed | https://stenciljs.com
42747
+ Stencil Hydrate Runner v4.43.5 | MIT Licensed | https://stenciljs.com
43131
42748
  */
43132
42749
  var __create = Object.create;
43133
42750
  var __defProp = Object.defineProperty;