@ionic/core 9.0.1-dev.11787248963.10a00c73 → 9.0.1-dev.11787949960.1e63841c

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 (456) hide show
  1. package/components/index.js +1 -1
  2. package/components/ion-accordion-group.js +1 -1
  3. package/components/ion-accordion.js +1 -1
  4. package/components/ion-action-sheet.js +1 -1
  5. package/components/ion-alert.js +1 -1
  6. package/components/ion-app.js +1 -1
  7. package/components/ion-avatar.js +1 -1
  8. package/components/ion-back-button.js +1 -1
  9. package/components/ion-backdrop.js +1 -1
  10. package/components/ion-badge.js +1 -1
  11. package/components/ion-breadcrumb.js +1 -1
  12. package/components/ion-breadcrumbs.js +1 -1
  13. package/components/ion-button.js +1 -1
  14. package/components/ion-buttons.js +1 -1
  15. package/components/ion-card-content.js +1 -1
  16. package/components/ion-card-header.js +1 -1
  17. package/components/ion-card-subtitle.js +1 -1
  18. package/components/ion-card-title.js +1 -1
  19. package/components/ion-card.js +1 -1
  20. package/components/ion-checkbox.js +1 -1
  21. package/components/ion-chip.js +1 -1
  22. package/components/ion-col.js +1 -1
  23. package/components/ion-content.js +1 -1
  24. package/components/ion-datetime-button.js +1 -1
  25. package/components/ion-datetime.js +1 -1
  26. package/components/ion-fab-button.js +1 -1
  27. package/components/ion-fab-list.js +1 -1
  28. package/components/ion-fab.js +1 -1
  29. package/components/ion-footer.js +1 -1
  30. package/components/ion-grid.js +1 -1
  31. package/components/ion-header.js +1 -1
  32. package/components/ion-icon.js +1 -1
  33. package/components/ion-img.js +1 -1
  34. package/components/ion-infinite-scroll-content.js +1 -1
  35. package/components/ion-infinite-scroll.js +1 -1
  36. package/components/ion-input-otp.js +1 -1
  37. package/components/ion-input-password-toggle.js +1 -1
  38. package/components/ion-input.js +1 -1
  39. package/components/ion-item-divider.js +1 -1
  40. package/components/ion-item-group.js +1 -1
  41. package/components/ion-item-option.js +1 -1
  42. package/components/ion-item-options.js +1 -1
  43. package/components/ion-item-sliding.js +1 -1
  44. package/components/ion-item.js +1 -1
  45. package/components/ion-label.js +1 -1
  46. package/components/ion-list-header.js +1 -1
  47. package/components/ion-list.js +1 -1
  48. package/components/ion-loading.js +1 -1
  49. package/components/ion-menu-button.js +1 -1
  50. package/components/ion-menu-toggle.js +1 -1
  51. package/components/ion-menu.js +1 -1
  52. package/components/ion-modal.js +1 -1
  53. package/components/ion-nav-link.js +1 -1
  54. package/components/ion-nav.js +1 -1
  55. package/components/ion-note.js +1 -1
  56. package/components/ion-picker-column-option.js +1 -1
  57. package/components/ion-picker-column.js +1 -1
  58. package/components/ion-picker.js +1 -1
  59. package/components/ion-popover.js +1 -1
  60. package/components/ion-progress-bar.js +1 -1
  61. package/components/ion-radio-group.js +1 -1
  62. package/components/ion-radio.js +1 -1
  63. package/components/ion-range.js +1 -1
  64. package/components/ion-refresher-content.js +1 -1
  65. package/components/ion-refresher.js +1 -1
  66. package/components/ion-reorder-group.js +1 -1
  67. package/components/ion-reorder.js +1 -1
  68. package/components/ion-ripple-effect.js +1 -1
  69. package/components/ion-route-redirect.js +1 -1
  70. package/components/ion-route.js +1 -1
  71. package/components/ion-router-link.js +1 -1
  72. package/components/ion-router-outlet.js +1 -1
  73. package/components/ion-router.js +1 -1
  74. package/components/ion-row.js +1 -1
  75. package/components/ion-searchbar.js +1 -1
  76. package/components/ion-segment-button.js +1 -1
  77. package/components/ion-segment-content.js +1 -1
  78. package/components/ion-segment-view.js +1 -1
  79. package/components/ion-segment.js +1 -1
  80. package/components/ion-select-modal.js +1 -1
  81. package/components/ion-select-option.js +1 -1
  82. package/components/ion-select-popover.js +1 -1
  83. package/components/ion-select.js +1 -1
  84. package/components/ion-skeleton-text.js +1 -1
  85. package/components/ion-spinner.js +1 -1
  86. package/components/ion-split-pane.js +1 -1
  87. package/components/ion-tab-bar.js +1 -1
  88. package/components/ion-tab-button.js +1 -1
  89. package/components/ion-tab.js +1 -1
  90. package/components/ion-tabs.js +1 -1
  91. package/components/ion-text.js +1 -1
  92. package/components/ion-textarea.js +1 -1
  93. package/components/ion-thumbnail.js +1 -1
  94. package/components/ion-title.js +1 -1
  95. package/components/ion-toast.js +1 -1
  96. package/components/ion-toggle.js +1 -1
  97. package/components/ion-toolbar.js +1 -1
  98. package/components/{p-gFwXiYC_.js → p-5rFO7X8J.js} +1 -1
  99. package/components/{p-BpLt_Ptn.js → p-7qDu1bID.js} +1 -1
  100. package/components/{p-7PNwKFZi.js → p-B2L09UOs.js} +1 -1
  101. package/components/{p-DcOH6-o5.js → p-BAJ7NctL.js} +1 -1
  102. package/components/{p-Kmrg3Fed.js → p-BE9noJ1O.js} +1 -1
  103. package/components/{p-CgvDC7hC.js → p-BFwL2yyK.js} +1 -1
  104. package/components/{p-DysqCsJu.js → p-BWHBdLfY.js} +1 -1
  105. package/components/{p-SR-LLqp_.js → p-Bcm-GVQM.js} +1 -1
  106. package/{dist/ionic/p-9wczfs_v.js → components/p-BcuLPPAE.js} +1 -1
  107. package/components/p-BhlP16sB.js +4 -0
  108. package/components/{p-H1f2qsk4.js → p-BqE7e5gH.js} +1 -1
  109. package/components/{p-BqBDq1Ma.js → p-C12SAK00.js} +1 -1
  110. package/components/p-C8Tp0cQy.js +4 -0
  111. package/components/{p-A8MJRBIY.js → p-C8mPeq0D.js} +1 -1
  112. package/components/{p-Bx2saTHs.js → p-CB06XtlF.js} +1 -1
  113. package/components/{p-BgUIV8NQ.js → p-CBhGZ6rF.js} +1 -1
  114. package/components/{p-B8MQjdvk.js → p-CDKY4TZ_.js} +1 -1
  115. package/components/{p-CWETxTjE.js → p-CEkamjav.js} +1 -1
  116. package/components/p-CFtAWaB6.js +4 -0
  117. package/components/{p-DEW7CnUc.js → p-CJTKYpZv.js} +1 -1
  118. package/components/{p-BA_4ZIEg.js → p-CLZPNP7x.js} +1 -1
  119. package/components/{p-tX3UxCnU.js → p-COxY7PLK.js} +1 -1
  120. package/components/p-CQxPXWNM.js +4 -0
  121. package/components/{p-DDdkefwf.js → p-CRcX0EGs.js} +1 -1
  122. package/components/p-CVNvmbDp.js +4 -0
  123. package/components/p-CXpy69Ei.js +4 -0
  124. package/{dist/ionic/p-BZxjcGRP.js → components/p-CdSLe3Q3.js} +1 -1
  125. package/components/p-CoGD-oMG.js +4 -0
  126. package/components/p-CpYeYl3u.js +4 -0
  127. package/components/{p-CaiZOhfC.js → p-CuS0-WwK.js} +1 -1
  128. package/components/{p-Bnc0m4SW.js → p-CxiXpCtB.js} +1 -1
  129. package/components/{p-BFtL8t1r.js → p-CyKlfXdt.js} +1 -1
  130. package/components/p-D2XJVty5.js +4 -0
  131. package/components/p-DALTMT_o.js +4 -0
  132. package/{dist/ionic/p-D0dfUysx.js → components/p-DG-dUCKp.js} +1 -1
  133. package/{dist/ionic/p-DF_Uqql8.js → components/p-DH0rRXjx.js} +1 -1
  134. package/components/{p-D7ysFE2B.js → p-DMkSsriG.js} +1 -1
  135. package/components/{p-B6x5_b9w.js → p-DkEb3SCT.js} +1 -1
  136. package/components/p-Dr-rBSUW.js +4 -0
  137. package/components/p-MHpJ2A_m.js +4 -0
  138. package/components/p-N6lZFXYR.js +4 -0
  139. package/components/p-QgdyH-Zs.js +4 -0
  140. package/components/{p-BMfgF-Tv.js → p-RRH-7cpd.js} +1 -1
  141. package/components/p-UKksD3f9.js +4 -0
  142. package/components/{p-v2NpoOHp.js → p-VTfnz_8u.js} +1 -1
  143. package/components/p-fP0QF3iG.js +4 -0
  144. package/components/{p-BPDxVIRr.js → p-l-zxxFre.js} +1 -1
  145. package/components/{p-BrFaQbGY.js → p-mXsQnyWB.js} +1 -1
  146. package/components/p-ntAkt4Ra.js +4 -0
  147. package/components/p-ufB0gCSU.js +4 -0
  148. package/components/p-z-BF3clL.js +4 -0
  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-D-OqR4a4.js → animation-ihPP_z2n.js} +1 -1
  154. package/dist/cjs/{app-globals-BzgwARwJ.js → app-globals-BlkzA410.js} +1 -1
  155. package/dist/cjs/{button-active-BlWSD7uK.js → button-active-ItGBjzmO.js} +1 -1
  156. package/dist/cjs/{format-D7ig6Vm0.js → format-CPIqtp4x.js} +1 -1
  157. package/dist/cjs/{framework-delegate-BZUx4TnE.js → framework-delegate-DhyWUPGg.js} +1 -1
  158. package/dist/cjs/{hardware-back-button-JOAEFSzc.js → hardware-back-button-D5f_kASb.js} +1 -1
  159. package/dist/cjs/{helpers-Dj5o76mq.js → helpers-BCLkFTTd.js} +1 -1
  160. package/dist/cjs/{index-C8zH6b3d.js → index-49DTLc_Z.js} +2 -2
  161. package/dist/cjs/{index-CZ6vzt_q.js → index-BcyiqD6R.js} +5 -5
  162. package/dist/cjs/{index-BrVMoqUk.js → index-Bgz6BcKx.js} +50 -16
  163. package/dist/cjs/{index-EJLjthTK.js → index-BocV_y-c.js} +2 -1
  164. package/dist/cjs/{index-2sO-zkZ2.js → index-CldjPPyP.js} +4 -4
  165. package/dist/cjs/{index-Csue6G3m.js → index-xum7jdbq.js} +2 -2
  166. package/dist/cjs/index.cjs.js +12 -12
  167. package/dist/cjs/{input-shims-Bh7bnt2v.js → input-shims-Jisy7U7-.js} +3 -3
  168. package/dist/cjs/{input.utils-Cq3g9uHy.js → input.utils-BDTpGrfn.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 +45 -29
  171. package/dist/cjs/ion-alert.cjs.entry.js +29 -21
  172. package/dist/cjs/ion-app_8.cjs.entry.js +38 -16
  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 +32 -24
  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 +4 -4
  191. package/dist/cjs/ion-item_8.cjs.entry.js +3 -3
  192. package/dist/cjs/ion-loading.cjs.entry.js +14 -10
  193. package/dist/cjs/ion-menu_3.cjs.entry.js +8 -8
  194. package/dist/cjs/ion-modal.cjs.entry.js +85 -32
  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 +210 -46
  198. package/dist/cjs/ion-picker.cjs.entry.js +2 -2
  199. package/dist/cjs/ion-popover.cjs.entry.js +23 -10
  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 +3 -3
  211. package/dist/cjs/ion-select-modal.cjs.entry.js +8 -8
  212. package/dist/cjs/ion-select_3.cjs.entry.js +57 -47
  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-DvgIzM2F.js → ionic-global-BMU-Us1Q.js} +1 -1
  222. package/dist/cjs/ionic.cjs.js +4 -4
  223. package/dist/cjs/{ios.transition-zIgdoSYe.js → ios.transition-OCcCN--B.js} +4 -4
  224. package/dist/cjs/{item-multiple-inputs-DG-ZGm6j.js → item-multiple-inputs-BH9yPC66.js} +1 -1
  225. package/dist/cjs/loader.cjs.js +3 -3
  226. package/dist/cjs/{md.transition-CXeJ9rfh.js → md.transition-D0o2IIbo.js} +4 -4
  227. package/dist/cjs/{overlays-Bg0auTQa.js → overlays-HN9joo1Z.js} +59 -34
  228. package/dist/cjs/{select-option-render-7m1WdFzF.js → select-option-render-BPjGDlsG.js} +2 -2
  229. package/dist/cjs/{slot-mutation-controller-BJEJzx_e.js → slot-mutation-controller-IQ250LoG.js} +1 -1
  230. package/dist/cjs/{status-tap-DxbUM5XX.js → status-tap-Bakl9czs.js} +3 -3
  231. package/dist/cjs/{swipe-back-F_DBt-Aw.js → swipe-back-Cv4OZVJ5.js} +2 -2
  232. package/dist/collection/collection-manifest.json +1 -1
  233. package/dist/collection/components/action-sheet/action-sheet.js +36 -20
  234. package/dist/collection/components/alert/alert.js +20 -12
  235. package/dist/collection/components/content/content.js +26 -4
  236. package/dist/collection/components/datetime/datetime.js +25 -17
  237. package/dist/collection/components/loading/loading.js +7 -3
  238. package/dist/collection/components/modal/modal.ios.css +12 -1
  239. package/dist/collection/components/modal/modal.js +75 -22
  240. package/dist/collection/components/modal/modal.md.css +12 -1
  241. package/dist/collection/components/picker-column/picker-column.js +207 -43
  242. package/dist/collection/components/popover/popover.js +16 -3
  243. package/dist/collection/components/select/select.js +49 -39
  244. package/dist/collection/utils/overlays.js +53 -29
  245. package/dist/collection/utils/test/playwright/detach-reattach.js +23 -0
  246. package/dist/collection/utils/test/playwright/index.js +1 -0
  247. package/dist/docs.json +279 -48
  248. package/dist/esm/{animation-TxGPYeDn.js → animation-B6KGUJwl.js} +1 -1
  249. package/dist/esm/{app-globals-Do8rJest.js → app-globals-BvutUX8P.js} +1 -1
  250. package/dist/esm/{button-active-ChA4D-ml.js → button-active-DRNebs9r.js} +1 -1
  251. package/dist/esm/{format-CVk5e_GP.js → format-BF3btM7P.js} +1 -1
  252. package/dist/esm/{framework-delegate-DaLWnISz.js → framework-delegate-60cEIAgt.js} +1 -1
  253. package/dist/esm/{hardware-back-button-D8W4L0JP.js → hardware-back-button-rhkwRNk2.js} +1 -1
  254. package/dist/esm/{helpers-BIgoInJU.js → helpers-DLLANtRS.js} +1 -1
  255. package/dist/esm/{index-C8Dsa6li.js → index-BZHVn0iF.js} +4 -4
  256. package/dist/esm/{index-DHw2lZxe.js → index-Bl4BUvBL.js} +2 -2
  257. package/dist/esm/{index-BmOR8tCv.js → index-DOrtAUWV.js} +2 -2
  258. package/dist/esm/{index-C5ZdL0qp.js → index-D_7MeuVD.js} +5 -5
  259. package/dist/esm/{index-elneMH8y.js → index-JgU5uTSY.js} +2 -2
  260. package/dist/esm/{index-CKYcsw8f.js → index-h81G-QbJ.js} +50 -16
  261. package/dist/esm/index.js +12 -12
  262. package/dist/esm/{input-shims-09NN97kF.js → input-shims-C2ipc_XX.js} +3 -3
  263. package/dist/esm/{input.utils-BxyH9l1w.js → input.utils-D-qoPjqr.js} +1 -1
  264. package/dist/esm/ion-accordion_2.entry.js +3 -3
  265. package/dist/esm/ion-action-sheet.entry.js +45 -29
  266. package/dist/esm/ion-alert.entry.js +29 -21
  267. package/dist/esm/ion-app_8.entry.js +38 -16
  268. package/dist/esm/ion-avatar_3.entry.js +2 -2
  269. package/dist/esm/ion-back-button.entry.js +3 -3
  270. package/dist/esm/ion-backdrop.entry.js +2 -2
  271. package/dist/esm/ion-breadcrumb_2.entry.js +3 -3
  272. package/dist/esm/ion-button_2.entry.js +3 -3
  273. package/dist/esm/ion-card_5.entry.js +3 -3
  274. package/dist/esm/ion-checkbox.entry.js +4 -4
  275. package/dist/esm/ion-chip.entry.js +2 -2
  276. package/dist/esm/ion-col_3.entry.js +2 -2
  277. package/dist/esm/ion-datetime-button.entry.js +4 -4
  278. package/dist/esm/ion-datetime.entry.js +32 -24
  279. package/dist/esm/ion-fab_3.entry.js +3 -3
  280. package/dist/esm/ion-img.entry.js +3 -3
  281. package/dist/esm/ion-infinite-scroll_2.entry.js +5 -5
  282. package/dist/esm/ion-input-otp.entry.js +3 -3
  283. package/dist/esm/ion-input-password-toggle.entry.js +2 -2
  284. package/dist/esm/ion-input.entry.js +5 -5
  285. package/dist/esm/ion-item-option_3.entry.js +4 -4
  286. package/dist/esm/ion-item_8.entry.js +3 -3
  287. package/dist/esm/ion-loading.entry.js +14 -10
  288. package/dist/esm/ion-menu_3.entry.js +8 -8
  289. package/dist/esm/ion-modal.entry.js +85 -32
  290. package/dist/esm/ion-nav_2.entry.js +6 -6
  291. package/dist/esm/ion-picker-column-option.entry.js +3 -3
  292. package/dist/esm/ion-picker-column.entry.js +211 -47
  293. package/dist/esm/ion-picker.entry.js +2 -2
  294. package/dist/esm/ion-popover.entry.js +23 -10
  295. package/dist/esm/ion-progress-bar.entry.js +3 -3
  296. package/dist/esm/ion-radio_2.entry.js +4 -4
  297. package/dist/esm/ion-range.entry.js +4 -4
  298. package/dist/esm/ion-refresher_2.entry.js +6 -6
  299. package/dist/esm/ion-reorder_2.entry.js +4 -4
  300. package/dist/esm/ion-ripple-effect.entry.js +2 -2
  301. package/dist/esm/ion-route_4.entry.js +4 -4
  302. package/dist/esm/ion-searchbar.entry.js +3 -3
  303. package/dist/esm/ion-segment-content.entry.js +1 -1
  304. package/dist/esm/ion-segment-view.entry.js +1 -1
  305. package/dist/esm/ion-segment_2.entry.js +3 -3
  306. package/dist/esm/ion-select-modal.entry.js +8 -8
  307. package/dist/esm/ion-select_3.entry.js +57 -47
  308. package/dist/esm/ion-spinner.entry.js +2 -2
  309. package/dist/esm/ion-split-pane.entry.js +2 -2
  310. package/dist/esm/ion-tab-bar_2.entry.js +3 -3
  311. package/dist/esm/ion-tab_2.entry.js +3 -3
  312. package/dist/esm/ion-text.entry.js +2 -2
  313. package/dist/esm/ion-textarea.entry.js +5 -5
  314. package/dist/esm/ion-toast.entry.js +8 -8
  315. package/dist/esm/ion-toggle.entry.js +4 -4
  316. package/dist/esm/{ionic-global-lrowsHfi.js → ionic-global-B7I1sdvg.js} +1 -1
  317. package/dist/esm/ionic.js +5 -5
  318. package/dist/esm/{ios.transition-BQhADrk1.js → ios.transition-C-6IaIxe.js} +4 -4
  319. package/dist/esm/{item-multiple-inputs-D_N3fDkD.js → item-multiple-inputs-DI91syHS.js} +1 -1
  320. package/dist/esm/loader.js +4 -4
  321. package/dist/esm/{md.transition-D58NpmRa.js → md.transition-dyqt0t0d.js} +4 -4
  322. package/dist/esm/{overlays-BpnIFlXI.js → overlays-Dz2cGX5q.js} +59 -35
  323. package/dist/esm/{select-option-render-lIuu64EV.js → select-option-render-CUJpruSC.js} +2 -2
  324. package/dist/esm/{slot-mutation-controller-rS_T3FDR.js → slot-mutation-controller-wFuztlVD.js} +1 -1
  325. package/dist/esm/{status-tap-CpFQMLl6.js → status-tap-Dn_42wiy.js} +3 -3
  326. package/dist/esm/{swipe-back-rmc7zeNW.js → swipe-back-CqOqrHW7.js} +2 -2
  327. package/dist/ionic/index.esm.js +1 -1
  328. package/dist/ionic/ionic.esm.js +1 -1
  329. package/dist/ionic/p-010601fe.entry.js +4 -0
  330. package/dist/ionic/{p-05800a02.entry.js → p-025763b2.entry.js} +1 -1
  331. package/dist/ionic/{p-d8deff43.entry.js → p-026e2e4c.entry.js} +1 -1
  332. package/dist/ionic/{p-RzUn7cKs.js → p-06ZcwRF5.js} +1 -1
  333. package/dist/ionic/{p-b62bfce8.entry.js → p-082b8125.entry.js} +1 -1
  334. package/dist/ionic/{p-16e9f542.entry.js → p-0b52d921.entry.js} +1 -1
  335. package/dist/ionic/p-0c2b3555.entry.js +4 -0
  336. package/dist/ionic/{p-485fb218.entry.js → p-1a20571c.entry.js} +1 -1
  337. package/dist/ionic/{p-90ba736e.entry.js → p-1f66c230.entry.js} +1 -1
  338. package/dist/ionic/{p-a0fee899.entry.js → p-2aabd568.entry.js} +1 -1
  339. package/dist/ionic/{p-295ff427.entry.js → p-2ff12c8a.entry.js} +1 -1
  340. package/dist/ionic/{p-5b906fd6.entry.js → p-326e0d05.entry.js} +1 -1
  341. package/dist/ionic/p-392079fa.entry.js +4 -0
  342. package/dist/ionic/{p-6f048604.entry.js → p-43bae3f5.entry.js} +1 -1
  343. package/dist/ionic/p-4778b90f.entry.js +4 -0
  344. package/dist/ionic/{p-d3384a40.entry.js → p-47b8b59a.entry.js} +1 -1
  345. package/dist/ionic/{p-478035a7.entry.js → p-53ba5651.entry.js} +1 -1
  346. package/dist/ionic/{p-bbf6878c.entry.js → p-546b1109.entry.js} +1 -1
  347. package/dist/ionic/{p-8dd4c026.entry.js → p-5dc53bdf.entry.js} +1 -1
  348. package/dist/ionic/{p-1df75f9e.entry.js → p-5ed60413.entry.js} +1 -1
  349. package/dist/ionic/p-639d3b55.entry.js +4 -0
  350. package/dist/ionic/{p-ddfb7e5f.entry.js → p-6d84fa9f.entry.js} +1 -1
  351. package/dist/ionic/{p-72ad7c64.entry.js → p-7c859f42.entry.js} +1 -1
  352. package/dist/ionic/p-7dec112e.entry.js +4 -0
  353. package/dist/ionic/{p-f376876b.entry.js → p-83aa7d47.entry.js} +1 -1
  354. package/dist/ionic/{p-959df5f8.entry.js → p-8d72244b.entry.js} +1 -1
  355. package/dist/ionic/{p-9e455875.entry.js → p-8e388a30.entry.js} +1 -1
  356. package/dist/ionic/{p-75887ee0.entry.js → p-90e06e60.entry.js} +1 -1
  357. package/dist/ionic/{p-b5f37106.entry.js → p-9452849d.entry.js} +1 -1
  358. package/dist/ionic/{p-a54bcd16.entry.js → p-9e688396.entry.js} +1 -1
  359. package/dist/ionic/{p-cad4eccf.entry.js → p-9eba0d8a.entry.js} +1 -1
  360. package/dist/ionic/{p-8e007f11.entry.js → p-9f2d3987.entry.js} +1 -1
  361. package/dist/ionic/p-9fef333a.entry.js +4 -0
  362. package/{components/p-BSARlp49.js → dist/ionic/p-BC17SPKH.js} +1 -1
  363. package/dist/ionic/p-BRa1Jjxr.js +4 -0
  364. package/dist/ionic/{p-De0eY881.js → p-BRc8gq5v.js} +1 -1
  365. package/{components/p-66ogmUZU.js → dist/ionic/p-BpG7jkT9.js} +1 -1
  366. package/dist/ionic/{p-B1Y7LZhV.js → p-C10K-FJg.js} +1 -1
  367. package/dist/ionic/{p-D9yvytgv.js → p-C2BY_4Wp.js} +1 -1
  368. package/dist/ionic/{p-BZVE25Gu.js → p-CH8tk7Pr.js} +1 -1
  369. package/dist/ionic/{p-CDBop-kz.js → p-CTBfxfjC.js} +1 -1
  370. package/dist/ionic/p-Cc-fFNy8.js +4 -0
  371. package/dist/ionic/p-Cc4w3fVf.js +4 -0
  372. package/{components/p-BuPAFTWI.js → dist/ionic/p-CoEa7CiN.js} +1 -1
  373. package/dist/ionic/p-CvRL-Eju.js +4 -0
  374. package/dist/ionic/p-DA88iqXQ.js +4 -0
  375. package/dist/ionic/{p-DXJgZWgi.js → p-DMj-M2c4.js} +1 -1
  376. package/dist/ionic/p-D_IgV7tz.js +4 -0
  377. package/dist/ionic/{p-VquyMbjp.js → p-DoUx_N0R.js} +1 -1
  378. package/dist/ionic/{p-C4IBDDj6.js → p-KJ5pLPiN.js} +1 -1
  379. package/dist/ionic/{p-ByLaqOPm.js → p-Q9w8L_Sw.js} +1 -1
  380. package/dist/ionic/{p-ClrlQU2y.js → p-S1shXW5M.js} +1 -1
  381. package/dist/ionic/{p-1db2afb4.entry.js → p-a2fccdaa.entry.js} +1 -1
  382. package/dist/ionic/{p-fbd83d4c.entry.js → p-ac71362a.entry.js} +1 -1
  383. package/dist/ionic/p-b8cd338d.entry.js +4 -0
  384. package/dist/ionic/{p-873a315a.entry.js → p-bdc01880.entry.js} +1 -1
  385. package/dist/ionic/{p-5f216b79.entry.js → p-ca57763d.entry.js} +1 -1
  386. package/dist/ionic/{p-39a8d4e0.entry.js → p-cc749877.entry.js} +1 -1
  387. package/dist/ionic/{p-56307aea.entry.js → p-d1539609.entry.js} +1 -1
  388. package/dist/ionic/{p-cdc5115e.entry.js → p-d1b888de.entry.js} +1 -1
  389. package/dist/ionic/p-d85e59b1.entry.js +4 -0
  390. package/dist/ionic/p-dad2f3e4.entry.js +4 -0
  391. package/dist/ionic/{p-70ee8888.entry.js → p-dadcb3d2.entry.js} +1 -1
  392. package/dist/ionic/{p-c49165af.entry.js → p-e93cc1e1.entry.js} +1 -1
  393. package/dist/ionic/{p-f7dd1ed9.entry.js → p-eab77a74.entry.js} +1 -1
  394. package/dist/ionic/{p-aebc4d69.entry.js → p-eaeac54e.entry.js} +1 -1
  395. package/dist/ionic/{p-e538f18d.entry.js → p-ecfc9c71.entry.js} +1 -1
  396. package/dist/ionic/{p-5ee2d7b1.entry.js → p-eeb65463.entry.js} +1 -1
  397. package/dist/ionic/{p-881b6954.entry.js → p-f0645c98.entry.js} +1 -1
  398. package/dist/ionic/{p-d8bae128.entry.js → p-f607ad4f.entry.js} +1 -1
  399. package/dist/ionic/{p-61c799d1.entry.js → p-fb4dabbb.entry.js} +1 -1
  400. package/dist/ionic/{p-63bbba8d.entry.js → p-fe80ebb1.entry.js} +1 -1
  401. package/dist/ionic/p-h81G-QbJ.js +6 -0
  402. package/dist/ionic/p-nxFQkv7U.js +4 -0
  403. package/dist/ionic/p-w3KTiug9.js +4 -0
  404. package/{components/p-RFfE9hF6.js → dist/ionic/p-wdSUbx5C.js} +1 -1
  405. package/dist/types/components/action-sheet/action-sheet.d.ts +10 -0
  406. package/dist/types/components/alert/alert.d.ts +7 -0
  407. package/dist/types/components/content/content.d.ts +7 -0
  408. package/dist/types/components/modal/modal.d.ts +8 -0
  409. package/dist/types/components/picker-column/picker-column.d.ts +42 -0
  410. package/dist/types/components.d.ts +1 -1
  411. package/dist/types/stencil-public-runtime.d.ts +12 -0
  412. package/dist/types/utils/overlays.d.ts +9 -0
  413. package/dist/types/utils/test/playwright/detach-reattach.d.ts +13 -0
  414. package/dist/types/utils/test/playwright/index.d.ts +1 -0
  415. package/hydrate/index.js +538 -195
  416. package/hydrate/index.mjs +538 -195
  417. package/loader/index.d.ts +1 -1
  418. package/package.json +2 -2
  419. package/components/p-6Vp915Y7.js +0 -4
  420. package/components/p-AQcCdH2_.js +0 -4
  421. package/components/p-BdwCtX8Y.js +0 -4
  422. package/components/p-Bg4OwDwb.js +0 -4
  423. package/components/p-BxhE2W85.js +0 -4
  424. package/components/p-CHswSpKy.js +0 -4
  425. package/components/p-CQAjyETU.js +0 -4
  426. package/components/p-CR9OgE6N.js +0 -4
  427. package/components/p-CaZeZIL2.js +0 -4
  428. package/components/p-CqyGR9Aq.js +0 -4
  429. package/components/p-DCWfzDM8.js +0 -4
  430. package/components/p-DQ1IPvZO.js +0 -4
  431. package/components/p-DfdYCsov.js +0 -4
  432. package/components/p-DhOoEIAs.js +0 -4
  433. package/components/p-Dl_7b_UJ.js +0 -4
  434. package/components/p-DqAI6tg7.js +0 -4
  435. package/components/p-DrehWDfv.js +0 -4
  436. package/components/p-HVYBAhFx.js +0 -4
  437. package/components/p-eFI3mtEX.js +0 -4
  438. package/dist/ionic/p-0eb50dca.entry.js +0 -4
  439. package/dist/ionic/p-18d532a3.entry.js +0 -4
  440. package/dist/ionic/p-34b9379b.entry.js +0 -4
  441. package/dist/ionic/p-4437015c.entry.js +0 -4
  442. package/dist/ionic/p-48c859fe.entry.js +0 -4
  443. package/dist/ionic/p-49b9d405.entry.js +0 -4
  444. package/dist/ionic/p-68507e70.entry.js +0 -4
  445. package/dist/ionic/p-886d9e66.entry.js +0 -4
  446. package/dist/ionic/p-8f51110d.entry.js +0 -4
  447. package/dist/ionic/p-B5RyLYvl.js +0 -4
  448. package/dist/ionic/p-BQv5i5Kf.js +0 -4
  449. package/dist/ionic/p-BnGA34Pd.js +0 -4
  450. package/dist/ionic/p-C06QNN45.js +0 -4
  451. package/dist/ionic/p-CCVlNZ__.js +0 -4
  452. package/dist/ionic/p-CKYcsw8f.js +0 -5
  453. package/dist/ionic/p-CazSodad.js +0 -4
  454. package/dist/ionic/p-DdhHqKj-.js +0 -4
  455. package/dist/ionic/p-DgUL3JbO.js +0 -4
  456. package/dist/ionic/p-b7a11b58.entry.js +0 -4
@@ -4,11 +4,11 @@
4
4
  'use strict';
5
5
 
6
6
  var index$1 = require('./index-DkNv4J_i.js');
7
- var helpers = require('./helpers-Dj5o76mq.js');
8
- var hardwareBackButton = require('./hardware-back-button-JOAEFSzc.js');
9
- var index = require('./index-BrVMoqUk.js');
10
- var ionicGlobal = require('./ionic-global-DvgIzM2F.js');
11
- var frameworkDelegate = require('./framework-delegate-BZUx4TnE.js');
7
+ var helpers = require('./helpers-BCLkFTTd.js');
8
+ var hardwareBackButton = require('./hardware-back-button-D5f_kASb.js');
9
+ var index = require('./index-Bgz6BcKx.js');
10
+ var ionicGlobal = require('./ionic-global-BMU-Us1Q.js');
11
+ var frameworkDelegate = require('./framework-delegate-DhyWUPGg.js');
12
12
  var gestureController = require('./gesture-controller-CeJslptU.js');
13
13
 
14
14
  /**
@@ -102,6 +102,15 @@ const activeAnimations = new WeakMap();
102
102
  const isBackdropAlwaysBlocking = (el) => {
103
103
  return el.showBackdrop !== false && !((el.backdropBreakpoint ?? 0) > 0);
104
104
  };
105
+ /**
106
+ * Whether the overlay takes the app root out of the accessibility tree and
107
+ * blocks body scroll while presented. Toasts never do, modal and popover can
108
+ * opt out with `focusTrap={false}`, and a backdrop that does not block
109
+ * (`showBackdrop={false}`, or a `backdropBreakpoint` above 0) is excluded.
110
+ */
111
+ const locksAppRoot = (el) => {
112
+ return el.tagName !== 'ION-TOAST' && el.focusTrap !== false && isBackdropAlwaysBlocking(el);
113
+ };
105
114
  const createController = (tagName) => {
106
115
  return {
107
116
  create(options) {
@@ -472,6 +481,13 @@ const getPresentedOverlay = (doc, overlayTag, id) => {
472
481
  // Otherwise, return the last overlay with the given id
473
482
  return (id === undefined ? overlays : overlays.filter((o) => o.id === id)).slice(-1)[0];
474
483
  };
484
+ /**
485
+ * The element an app nests its views under. Overlays hide this rather than the
486
+ * whole root, so the overlay itself (a sibling) stays reachable.
487
+ */
488
+ const getViewContainer = () => {
489
+ return getAppRoot(document).querySelector('ion-router-outlet, #ion-view-container-root');
490
+ };
475
491
  /**
476
492
  * When an overlay is presented, the main
477
493
  * focus is the overlay not the page content.
@@ -495,8 +511,7 @@ const getPresentedOverlay = (doc, overlayTag, id) => {
495
511
  * for main content.
496
512
  */
497
513
  const setRootAriaHidden = (hidden = false) => {
498
- const root = getAppRoot(document);
499
- const viewContainer = root.querySelector('ion-router-outlet, #ion-view-container-root');
514
+ const viewContainer = getViewContainer();
500
515
  if (!viewContainer) {
501
516
  return;
502
517
  }
@@ -521,15 +536,42 @@ const cleanupRootFocusTrapAccessibility = () => {
521
536
  return;
522
537
  }
523
538
  const remainingOverlays = getPresentedOverlays(document);
524
- const hasRemainingLocking = remainingOverlays.some((o) => {
525
- const el = o;
526
- return el.tagName !== 'ION-TOAST' && el.focusTrap !== false && isBackdropAlwaysBlocking(el);
527
- });
539
+ const hasRemainingLocking = remainingOverlays.some((o) => locksAppRoot(o));
528
540
  if (!hasRemainingLocking) {
529
541
  setRootAriaHidden(false);
530
542
  document.body.classList.remove(gestureController.BACKDROP_NO_SCROLL);
531
543
  }
532
544
  };
545
+ /**
546
+ * Applies the root lock itself: `aria-hidden` on the view container, and
547
+ * `backdrop-no-scroll` on the body. Shared by `present()` and the restore
548
+ * below, which have to stay in lockstep.
549
+ */
550
+ const applyRootLock = (el) => {
551
+ // Hiding the container the overlay now sits in would hide the overlay too.
552
+ if (!getViewContainer()?.contains(el)) {
553
+ setRootAriaHidden(true);
554
+ }
555
+ document.body.classList.add(gestureController.BACKDROP_NO_SCROLL);
556
+ };
557
+ /**
558
+ * Re-applies the root lock that `cleanupRootFocusTrapAccessibility()` released.
559
+ * Call from `connectedCallback` when the overlay is still presented.
560
+ *
561
+ * A synchronous move keeps the overlay connected, so the lock survives. A
562
+ * detach with a re-insert in a later task releases it, which is the shape a
563
+ * framework produces when it takes a subtree out and puts it back.
564
+ */
565
+ const restoreRootFocusTrapAccessibility = (overlayEl) => {
566
+ if (typeof document === 'undefined') {
567
+ return;
568
+ }
569
+ const el = overlayEl;
570
+ if (!locksAppRoot(el)) {
571
+ return;
572
+ }
573
+ applyRootLock(el);
574
+ };
533
575
  const present = async (overlay, name, iosEnterAnimation, mdEnterAnimation, opts) => {
534
576
  if (overlay.presented) {
535
577
  return;
@@ -546,15 +588,7 @@ const present = async (overlay, name, iosEnterAnimation, mdEnterAnimation, opts)
546
588
  restoreElementFocus(overlay.el);
547
589
  }
548
590
  /**
549
- * Due to accessibility guidelines, toasts do not have
550
- * focus traps.
551
- *
552
- * All other overlays should have focus traps to prevent
553
- * the keyboard focus from leaving the overlay unless
554
- * developers explicitly opt out (for example, sheet
555
- * modals that should permit background interaction).
556
- *
557
- * Note: Some apps move inline overlays to a specific container
591
+ * Some apps move inline overlays to a specific container
558
592
  * during the willPresent lifecycle (e.g., React portals via
559
593
  * onWillPresent). Defer applying aria-hidden/inert to the app
560
594
  * root until after willPresent so we can detect where the
@@ -563,18 +597,11 @@ const present = async (overlay, name, iosEnterAnimation, mdEnterAnimation, opts)
563
597
  * to avoid disabling the overlay.
564
598
  */
565
599
  const overlayEl = overlay.el;
566
- const shouldTrapFocus = overlayEl.tagName !== 'ION-TOAST' && overlayEl.focusTrap !== false;
567
- const shouldLockRoot = shouldTrapFocus && isBackdropAlwaysBlocking(overlayEl);
600
+ const shouldLockRoot = locksAppRoot(overlayEl);
568
601
  overlay.presented = true;
569
602
  overlay.willPresent.emit();
570
603
  if (shouldLockRoot) {
571
- const root = getAppRoot(document);
572
- const viewContainer = root.querySelector('ion-router-outlet, #ion-view-container-root');
573
- const overlayInsideViewContainer = viewContainer ? viewContainer.contains(overlayEl) : false;
574
- if (!overlayInsideViewContainer) {
575
- setRootAriaHidden(true);
576
- }
577
- document.body.classList.add(gestureController.BACKDROP_NO_SCROLL);
604
+ applyRootLock(overlayEl);
578
605
  }
579
606
  overlay.willPresentShorthand?.emit();
580
607
  const mode = ionicGlobal.getIonMode(overlay);
@@ -700,12 +727,9 @@ const dismiss = async (overlay, data, role, name, iosLeaveAnimation, mdLeaveAnim
700
727
  * from the root element when the last focus-trapping overlay
701
728
  * is dismissed.
702
729
  */
703
- const overlaysLockingRoot = presentedOverlays.filter((o) => {
704
- const el = o;
705
- return el.tagName !== 'ION-TOAST' && el.focusTrap !== false && isBackdropAlwaysBlocking(el);
706
- });
730
+ const overlaysLockingRoot = presentedOverlays.filter((o) => locksAppRoot(o));
707
731
  const overlayEl = overlay.el;
708
- const locksRoot = overlayEl.tagName !== 'ION-TOAST' && overlayEl.focusTrap !== false && isBackdropAlwaysBlocking(overlayEl);
732
+ const locksRoot = locksAppRoot(overlayEl);
709
733
  /**
710
734
  * If this is the last visible overlay that is trapping focus
711
735
  * then we want to re-add the root to the accessibility tree.
@@ -972,6 +996,7 @@ exports.modalController = modalController;
972
996
  exports.popoverController = popoverController;
973
997
  exports.prepareOverlay = prepareOverlay;
974
998
  exports.present = present;
999
+ exports.restoreRootFocusTrapAccessibility = restoreRootFocusTrapAccessibility;
975
1000
  exports.safeCall = safeCall;
976
1001
  exports.setOverlayId = setOverlayId;
977
1002
  exports.toastController = toastController;
@@ -3,8 +3,8 @@
3
3
  */
4
4
  'use strict';
5
5
 
6
- var index = require('./index-BrVMoqUk.js');
7
- var index$1 = require('./index-EJLjthTK.js');
6
+ var index = require('./index-Bgz6BcKx.js');
7
+ var index$1 = require('./index-BocV_y-c.js');
8
8
 
9
9
  /**
10
10
  * Converts a DOM node into a Stencil VNode (or text string) so the
@@ -4,7 +4,7 @@
4
4
  'use strict';
5
5
 
6
6
  var index = require('./index-DkNv4J_i.js');
7
- var helpers = require('./helpers-Dj5o76mq.js');
7
+ var helpers = require('./helpers-BCLkFTTd.js');
8
8
  var dir = require('./dir-zwDPRE5K.js');
9
9
 
10
10
  /**
@@ -3,9 +3,9 @@
3
3
  */
4
4
  'use strict';
5
5
 
6
- var index = require('./index-BrVMoqUk.js');
7
- var index$1 = require('./index-C8zH6b3d.js');
8
- var helpers = require('./helpers-Dj5o76mq.js');
6
+ var index = require('./index-Bgz6BcKx.js');
7
+ var index$1 = require('./index-49DTLc_Z.js');
8
+ var helpers = require('./helpers-BCLkFTTd.js');
9
9
  require('./dir-zwDPRE5K.js');
10
10
 
11
11
  const startStatusTap = () => {
@@ -3,10 +3,10 @@
3
3
  */
4
4
  'use strict';
5
5
 
6
- var helpers = require('./helpers-Dj5o76mq.js');
6
+ var helpers = require('./helpers-BCLkFTTd.js');
7
7
  var dir = require('./dir-zwDPRE5K.js');
8
8
  var index = require('./index-DRPqwSvU.js');
9
- require('./index-BrVMoqUk.js');
9
+ require('./index-Bgz6BcKx.js');
10
10
  require('./gesture-controller-CeJslptU.js');
11
11
 
12
12
  const createSwipeBackGesture = (el, canStartHandler, onStartHandler, onMoveHandler, onEndHandler) => {
@@ -99,7 +99,7 @@
99
99
  "mixins": [],
100
100
  "compiler": {
101
101
  "name": "@stencil/core",
102
- "version": "4.43.5",
102
+ "version": "4.44.1",
103
103
  "typescriptVersion": "5.8.3"
104
104
  },
105
105
  "collections": [
@@ -5,7 +5,7 @@ import { Host, h, readTask } from "@stencil/core";
5
5
  import { createButtonActiveGesture } from "../../utils/gesture/button-active";
6
6
  import { raf } from "../../utils/helpers";
7
7
  import { createLockController } from "../../utils/lock-controller";
8
- import { BACKDROP, cleanupRootFocusTrapAccessibility, createDelegateController, createTriggerController, dismiss, eventMethod, isCancel, prepareOverlay, present, safeCall, setOverlayId, } from "../../utils/overlays";
8
+ import { BACKDROP, cleanupRootFocusTrapAccessibility, createDelegateController, createTriggerController, dismiss, eventMethod, isCancel, prepareOverlay, present, restoreRootFocusTrapAccessibility, safeCall, setOverlayId, } from "../../utils/overlays";
9
9
  import { renderOptionLabel } from "../../utils/select-option-render";
10
10
  import { getClassMap } from "../../utils/theme";
11
11
  import { getIonMode } from "../../global/ionic-global";
@@ -277,6 +277,13 @@ export class ActionSheet {
277
277
  connectedCallback() {
278
278
  prepareOverlay(this.el);
279
279
  this.triggerChanged();
280
+ // `componentDidLoad` only fires once per instance, so a reconnect has to
281
+ // rebuild the gesture its disconnect destroyed.
282
+ this.setupButtonActiveGesture();
283
+ // Re-apply the root lock if moved without dismiss() being called
284
+ if (this.presented) {
285
+ restoreRootFocusTrapAccessibility(this.el);
286
+ }
280
287
  }
281
288
  disconnectedCallback() {
282
289
  if (this.gesture) {
@@ -296,24 +303,33 @@ export class ActionSheet {
296
303
  // Initialize activeRadioId for radio buttons
297
304
  this.buttonsChanged();
298
305
  }
299
- componentDidLoad() {
300
- /**
301
- * Only create gesture if:
302
- * 1. A gesture does not already exist
303
- * 2. App is running in iOS mode
304
- * 3. A wrapper ref exists
305
- * 4. A group ref exists
306
- */
306
+ /**
307
+ * Only create gesture if:
308
+ * 1. A gesture does not already exist
309
+ * 2. App is running in iOS mode
310
+ * 3. A wrapper ref exists
311
+ * 4. A group ref exists
312
+ * 5. The host is still connected, since a reconnect can schedule this and
313
+ * disconnect again before the task runs
314
+ */
315
+ setupButtonActiveGesture() {
307
316
  const { groupEl, wrapperEl } = this;
308
- if (!this.gesture && getIonMode(this) === 'ios' && wrapperEl && groupEl) {
309
- readTask(() => {
310
- const isScrollable = groupEl.scrollHeight > groupEl.clientHeight;
311
- if (!isScrollable) {
312
- this.gesture = createButtonActiveGesture(wrapperEl, (refEl) => refEl.classList.contains('action-sheet-button'));
313
- this.gesture.enable(true);
314
- }
315
- });
317
+ if (getIonMode(this) !== 'ios' || !wrapperEl || !groupEl) {
318
+ return;
316
319
  }
320
+ readTask(() => {
321
+ // Bail if a call queued ahead of this one already built the gesture
322
+ // (a second would orphan the first with its listeners still bound), if
323
+ // the host disconnected while this task waited, or if the group scrolls.
324
+ if (this.gesture || !this.el.isConnected || groupEl.scrollHeight > groupEl.clientHeight) {
325
+ return;
326
+ }
327
+ this.gesture = createButtonActiveGesture(wrapperEl, (refEl) => refEl.classList.contains('action-sheet-button'));
328
+ this.gesture.enable(true);
329
+ });
330
+ }
331
+ componentDidLoad() {
332
+ this.setupButtonActiveGesture();
317
333
  /**
318
334
  * If action sheet was rendered with isOpen="true"
319
335
  * then we should open action sheet immediately.
@@ -406,17 +422,17 @@ export class ActionSheet {
406
422
  const cancelButton = allButtons.find((b) => b.role === 'cancel');
407
423
  const buttons = allButtons.filter((b) => b.role !== 'cancel');
408
424
  const headerID = `action-sheet-${overlayIndex}-header`;
409
- return (h(Host, { key: '7685831da9a78b73473246a2cea95cefa79a53c3', role: "dialog", "aria-modal": "true", "aria-labelledby": header !== undefined ? headerID : null, tabindex: "-1", ...htmlAttributes, style: {
425
+ return (h(Host, { key: '83b47ea6b81d4eec6582c1dcaae6f267c78ba634', role: "dialog", "aria-modal": "true", "aria-labelledby": header !== undefined ? headerID : null, tabindex: "-1", ...htmlAttributes, style: {
410
426
  zIndex: `${20000 + this.overlayIndex}`,
411
427
  }, class: {
412
428
  [mode]: true,
413
429
  ...getClassMap(this.cssClass),
414
430
  'overlay-hidden': true,
415
431
  'action-sheet-translucent': this.translucent,
416
- }, onIonActionSheetWillDismiss: this.dispatchCancelHandler, onIonBackdropTap: this.onBackdropTap }, h("ion-backdrop", { key: 'c70f00e401cac99b89412d1adb867f35bc855d57', tappable: this.backdropDismiss }), h("div", { key: '3332893ce3098f1435875480b1269b2821d41660', tabindex: "0", "aria-hidden": "true" }), h("div", { key: 'eb406b0a9e303d6f94c5c7aa99c6f4c089bfbd41', class: "action-sheet-wrapper ion-overlay-wrapper", ref: (el) => (this.wrapperEl = el) }, h("div", { key: '92ec855379f10e1e0bfce6ff68b45d3cda0c137c', class: "action-sheet-container" }, h("div", { key: 'bc88a396d75396f574961471bf7e6c4edb513353', class: "action-sheet-group", ref: (el) => (this.groupEl = el), role: hasRadioButtons ? 'radiogroup' : undefined }, header !== undefined && (h("div", { key: '33329e0193818888bdcaa443ff5ea301802e0787', id: headerID, class: {
432
+ }, onIonActionSheetWillDismiss: this.dispatchCancelHandler, onIonBackdropTap: this.onBackdropTap }, h("ion-backdrop", { key: '3652793ec76adcfb87b814eb65d1260ae26f6910', tappable: this.backdropDismiss }), h("div", { key: '7de3a51daf95b50e02734a2cc8eec6f55b1473f3', tabindex: "0", "aria-hidden": "true" }), h("div", { key: '9b76bbf12901b956f7ee6d984f7f71e169bb5939', class: "action-sheet-wrapper ion-overlay-wrapper", ref: (el) => (this.wrapperEl = el) }, h("div", { key: 'cb52c905275a46ff27810fb1b4748ab533a78c45', class: "action-sheet-container" }, h("div", { key: '578c7194cfbcb65c1e41e15c390af41f179a2686', class: "action-sheet-group", ref: (el) => (this.groupEl = el), role: hasRadioButtons ? 'radiogroup' : undefined }, header !== undefined && (h("div", { key: 'ee961307c25cb1fcb0c6bbf667a8ed76ab717860', id: headerID, class: {
417
433
  'action-sheet-title': true,
418
434
  'action-sheet-has-sub-title': this.subHeader !== undefined,
419
- } }, header, this.subHeader && h("div", { key: '92ac5a9217a12b7417f7aca9c4fdb7bf6b051364', class: "action-sheet-sub-title" }, this.subHeader))), this.renderActionSheetButtons(buttons)), cancelButton && (h("div", { key: '020463b830fa48fc3ae647ea64f2aaa4d0969305', class: "action-sheet-group action-sheet-group-cancel" }, h("button", { key: 'cefa9c70a2233f6652a81b1a2eae6e717712144d', ...cancelButton.htmlAttributes, type: "button", class: buttonClass(cancelButton), onClick: () => this.buttonClick(cancelButton) }, h("span", { key: '56d7e2f8bfb3644e4476895164d334445fda9b2f', class: "action-sheet-button-inner" }, cancelButton.icon && (h("ion-icon", { key: '6a4a49254ec5cd96f4e0dce9447f90d8cac81913', icon: cancelButton.icon, "aria-hidden": "true", lazy: false, class: "action-sheet-icon" })), cancelButton.text), mode === 'md' && h("ion-ripple-effect", { key: '7d3c6e8d70b0922ea0f75520856285ce1005c891' })))))), h("div", { key: '958fc43e603c6a7f5d1e649d3326fce0f163b5d0', tabindex: "0", "aria-hidden": "true" })));
435
+ } }, header, this.subHeader && h("div", { key: '82d4016010db14d3f3b9911c276cb9a63b960ef4', class: "action-sheet-sub-title" }, this.subHeader))), this.renderActionSheetButtons(buttons)), cancelButton && (h("div", { key: 'a88fbfab194e13c6642a65f2e19a12299dd4ac23', class: "action-sheet-group action-sheet-group-cancel" }, h("button", { key: 'a232b8d23f1fc2efb7b37a605102b6994761a2f6', ...cancelButton.htmlAttributes, type: "button", class: buttonClass(cancelButton), onClick: () => this.buttonClick(cancelButton) }, h("span", { key: '19a7d95d3428d78a56b7dacabdec8fc0b722d8c2', class: "action-sheet-button-inner" }, cancelButton.icon && (h("ion-icon", { key: '5f3f3cb996a48e6365a3a09ea72ddc68ac9ccb78', icon: cancelButton.icon, "aria-hidden": "true", lazy: false, class: "action-sheet-icon" })), cancelButton.text), mode === 'md' && h("ion-ripple-effect", { key: '6e8fcb5f103ac19aa4b0682f19791cef0a147001' })))))), h("div", { key: '36f63ab77949c88f662e2cf6bb18510cb9de6a9f', tabindex: "0", "aria-hidden": "true" })));
420
436
  }
421
437
  static get is() { return "ion-action-sheet"; }
422
438
  static get encapsulation() { return "scoped"; }
@@ -8,7 +8,7 @@ import { raf } from "../../utils/helpers";
8
8
  import { createLockController } from "../../utils/lock-controller";
9
9
  import { printIonWarning } from "../../utils/logging/index";
10
10
  import { getOverlayLabelJustify, getOverlayLabelPlacement } from "../../utils/overlay-control-label";
11
- import { BACKDROP, cleanupRootFocusTrapAccessibility, createDelegateController, createTriggerController, dismiss, eventMethod, isCancel, prepareOverlay, present, safeCall, setOverlayId, } from "../../utils/overlays";
11
+ import { BACKDROP, cleanupRootFocusTrapAccessibility, createDelegateController, createTriggerController, dismiss, eventMethod, isCancel, prepareOverlay, present, restoreRootFocusTrapAccessibility, safeCall, setOverlayId, } from "../../utils/overlays";
12
12
  import { sanitizeDOMString } from "../../utils/sanitization/index";
13
13
  import { renderOptionLabel } from "../../utils/select-option-render";
14
14
  import { getClassMap } from "../../utils/theme";
@@ -198,10 +198,15 @@ export class Alert {
198
198
  this.triggerChanged();
199
199
  /**
200
200
  * If the alert was previously connected and is being reattached, the
201
- * ResizeObserver was disconnected. componentDidLoad only fires once per
202
- * instance, so re-establish the observer here on reconnect.
201
+ * `ResizeObserver` and the button gesture were torn down. `componentDidLoad`
202
+ * only fires once per instance, so re-establish both here on reconnect.
203
203
  */
204
204
  this.setupButtonGroupResizeObserver();
205
+ this.setupButtonActiveGesture();
206
+ // Re-apply the root lock if moved without dismiss() being called
207
+ if (this.presented) {
208
+ restoreRootFocusTrapAccessibility(this.el);
209
+ }
205
210
  }
206
211
  componentWillLoad() {
207
212
  if (!this.htmlAttributes?.id) {
@@ -223,17 +228,20 @@ export class Alert {
223
228
  this.buttonGroupResizeObserver?.disconnect();
224
229
  this.buttonGroupResizeObserver = undefined;
225
230
  }
226
- componentDidLoad() {
227
- /**
228
- * Only create gesture if:
229
- * 1. A gesture does not already exist
230
- * 2. App is running in iOS mode
231
- * 3. A wrapper ref exists
232
- */
231
+ /**
232
+ * Only create gesture if:
233
+ * 1. A gesture does not already exist
234
+ * 2. App is running in iOS mode
235
+ * 3. A wrapper ref exists
236
+ */
237
+ setupButtonActiveGesture() {
233
238
  if (!this.gesture && getIonMode(this) === 'ios' && this.wrapperEl) {
234
239
  this.gesture = createButtonActiveGesture(this.wrapperEl, (refEl) => refEl.classList.contains('alert-button'));
235
240
  this.gesture.enable(true);
236
241
  }
242
+ }
243
+ componentDidLoad() {
244
+ this.setupButtonActiveGesture();
237
245
  this.setupButtonGroupResizeObserver();
238
246
  /**
239
247
  * If alert was rendered with isOpen="true"
@@ -556,14 +564,14 @@ export class Alert {
556
564
  * If neither are defined, do not set aria-labelledby.
557
565
  */
558
566
  const ariaLabelledBy = header && subHeader ? `${hdrId} ${subHdrId}` : header ? hdrId : subHeader ? subHdrId : null;
559
- return (h(Host, { key: '022f3463b8e6c52064b90ec304c524847c3d5ad3', tabindex: "-1", style: {
567
+ return (h(Host, { key: '083b5250dc4c76e85240e0225abcb7ca2b66de2f', tabindex: "-1", style: {
560
568
  zIndex: `${20000 + overlayIndex}`,
561
569
  }, class: {
562
570
  ...getClassMap(this.cssClass),
563
571
  [mode]: true,
564
572
  'overlay-hidden': true,
565
573
  'alert-translucent': this.translucent,
566
- }, onIonAlertWillDismiss: this.dispatchCancelHandler, onIonBackdropTap: this.onBackdropTap }, h("ion-backdrop", { key: 'c3cd05738bc2834f54707edeb2fae06ec10d6fd2', tappable: this.backdropDismiss }), h("div", { key: 'b44fadd9ba7ddf073854c5035538d11ae8e66bc2', tabindex: "0", "aria-hidden": "true" }), h("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 }, h("div", { key: '3ad9d2d4b7cf425eab8293ddc12eff0fe8df1517', class: "alert-head" }, header && (h("h2", { key: '7d9154f5ee595b7e4da6ecf3a20871f104c1256e', id: hdrId, class: "alert-title" }, header)), subHeader && !header && (h("h2", { key: '1f891f38004be6964e9406b84dd580145c42516a', id: subHdrId, class: "alert-sub-title" }, subHeader)), subHeader && header && (h("h3", { key: '2ab4d344ecb7e384e8f6d3d3e59ee5a1bbcc832c', id: subHdrId, class: "alert-sub-title" }, subHeader))), this.renderAlertMessage(msgId), this.renderAlertInputs(), this.renderAlertButtons()), h("div", { key: '78a4ff09aa3aaafcd0dc2a42d036767d83b3cfa2', tabindex: "0", "aria-hidden": "true" })));
574
+ }, onIonAlertWillDismiss: this.dispatchCancelHandler, onIonBackdropTap: this.onBackdropTap }, h("ion-backdrop", { key: '65c92a956d998ae9016396dd2a29c42ab7376d0e', tappable: this.backdropDismiss }), h("div", { key: 'f2288fa0b7ef9d0bf031c168fe78c48422cf91c8', tabindex: "0", "aria-hidden": "true" }), h("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 }, h("div", { key: '075597f94719673cf1f894a8566e1036849afa75', class: "alert-head" }, header && (h("h2", { key: 'f96f4b1db8473c62040beed6e96108c733978d73', id: hdrId, class: "alert-title" }, header)), subHeader && !header && (h("h2", { key: 'dbd824ef19a07bddde4eb928f11de7c7cadf98b8', id: subHdrId, class: "alert-sub-title" }, subHeader)), subHeader && header && (h("h3", { key: '4774fa13700dd23aec7930492acae80de3bdf5d1', id: subHdrId, class: "alert-sub-title" }, subHeader))), this.renderAlertMessage(msgId), this.renderAlertInputs(), this.renderAlertButtons()), h("div", { key: '5c728b7457e231f64294bbec821bdb547c6437dd', tabindex: "0", "aria-hidden": "true" })));
567
575
  }
568
576
  static get is() { return "ion-alert"; }
569
577
  static get encapsulation() { return "scoped"; }
@@ -221,6 +221,23 @@ export class Content {
221
221
  const mode = getIonMode(this);
222
222
  return forceOverscroll === undefined ? mode === 'ios' && isPlatform('ios') : forceOverscroll;
223
223
  }
224
+ /**
225
+ * Whether this component should size itself to its contents height, which
226
+ * is the case inside any popover and inside a modal whose `--height` is a
227
+ * content-based value. Those overlays give the content no definite height
228
+ * to fill.
229
+ */
230
+ shouldSizeToContent() {
231
+ if (hostContext('ion-popover', this.el)) {
232
+ return true;
233
+ }
234
+ const modal = this.el.closest('ion-modal');
235
+ if (modal === null) {
236
+ return false;
237
+ }
238
+ const height = getComputedStyle(modal).getPropertyValue('--height').trim();
239
+ return CONTENT_SIZED_HEIGHTS.includes(height);
240
+ }
224
241
  resize() {
225
242
  /**
226
243
  * Only force update if the component is rendered in a browser context.
@@ -418,21 +435,21 @@ export class Content {
418
435
  const forceOverscroll = this.shouldForceOverscroll();
419
436
  const transitionShadow = mode === 'ios';
420
437
  this.resize();
421
- return (h(Host, { key: '9551c759df407b10d809171641fc6e8f14d92219', role: isMainContent ? 'main' : undefined, class: createColorClasses(this.color, {
438
+ return (h(Host, { key: 'd6ea57ec1f5def0bfd22f52ec5a5bbe6aa2f8e8e', role: isMainContent ? 'main' : undefined, class: createColorClasses(this.color, {
422
439
  [mode]: true,
423
440
  'content-fullscreen': this.fullscreen,
424
- 'content-sizing': hostContext('ion-popover', this.el),
441
+ 'content-sizing': this.shouldSizeToContent(),
425
442
  overscroll: forceOverscroll,
426
443
  [`content-${rtl}`]: true,
427
444
  }), style: {
428
445
  '--offset-top': `${this.cTop}px`,
429
446
  '--offset-bottom': `${this.cBottom}px`,
430
- }, ...inheritedAttributes }, h("div", { key: 'c6de8fd226f0d10a534eb107fe032ac155fbe68e', ref: (el) => (this.backgroundContentEl = el), id: "background-content", part: "background" }), fixedSlotPlacement === 'before' ? h("slot", { name: "fixed" }) : null, h("div", { key: '082fc2936061360060b48221ecb1c864a3711fa0', class: {
447
+ }, ...inheritedAttributes }, h("div", { key: '3ea7145f051ac3870ffb2b0c1fd83c20ce42d431', ref: (el) => (this.backgroundContentEl = el), id: "background-content", part: "background" }), fixedSlotPlacement === 'before' ? h("slot", { name: "fixed" }) : null, h("div", { key: 'af112b5f681fd40417c82bee085263c85755dad5', class: {
431
448
  'inner-scroll': true,
432
449
  'scroll-x': scrollX,
433
450
  'scroll-y': scrollY,
434
451
  overscroll: (scrollX || scrollY) && forceOverscroll,
435
- }, ref: (scrollEl) => (this.scrollEl = scrollEl), onScroll: this.scrollEvents ? (ev) => this.onScroll(ev) : undefined, part: "scroll" }, h("slot", { key: '0d2286206facb22696a9ca7e74a3f6b7d2397aab' })), transitionShadow ? (h("div", { class: "transition-effect" }, h("div", { class: "transition-cover" }), h("div", { class: "transition-shadow" }))) : null, fixedSlotPlacement === 'after' ? h("slot", { name: "fixed" }) : null));
452
+ }, ref: (scrollEl) => (this.scrollEl = scrollEl), onScroll: this.scrollEvents ? (ev) => this.onScroll(ev) : undefined, part: "scroll" }, h("slot", { key: '1b130c5713874fe457934359a1a1709a8cdb257a' })), transitionShadow ? (h("div", { class: "transition-effect" }, h("div", { class: "transition-cover" }), h("div", { class: "transition-shadow" }))) : null, fixedSlotPlacement === 'after' ? h("slot", { name: "fixed" }) : null));
436
453
  }
437
454
  static get is() { return "ion-content"; }
438
455
  static get encapsulation() { return "shadow"; }
@@ -874,6 +891,11 @@ export class Content {
874
891
  }];
875
892
  }
876
893
  }
894
+ /**
895
+ * `ion-modal` `--height` values that size the modal to its contents, leaving
896
+ * children an indefinite height to resolve against.
897
+ */
898
+ const CONTENT_SIZED_HEIGHTS = ['auto', 'fit-content', 'min-content', 'max-content'];
877
899
  const getParentElement = (el) => {
878
900
  if (el.parentElement) {
879
901
  // normal element with a parent element
@@ -1206,7 +1206,6 @@ export class Datetime {
1206
1206
  }
1207
1207
  renderCombinedDatePickerColumn() {
1208
1208
  const { defaultParts, disabled, workingParts, locale, minParts, maxParts, todayParts, isDateEnabled } = this;
1209
- const activePart = this.getActivePartsWithFallback();
1210
1209
  /**
1211
1210
  * By default, generate a range of 3 months:
1212
1211
  * Previous month, current month, and next month
@@ -1262,8 +1261,10 @@ export class Datetime {
1262
1261
  return (h("ion-picker-column", { part: WHEEL_PART, "aria-label": "Select a date", class: "date-column", color: this.color, disabled: disabled, value: todayString, onIonChange: (ev) => {
1263
1262
  const { value } = ev.detail;
1264
1263
  const findPart = parts.find(({ month, day, year }) => value === `${year}-${month}-${day}`);
1264
+ // Read live so parts a sibling column just committed are included.
1265
+ const activePart = this.getActivePartsWithFallback();
1265
1266
  this.setWorkingParts({
1266
- ...workingParts,
1267
+ ...this.workingParts,
1267
1268
  ...findPart,
1268
1269
  });
1269
1270
  this.setActiveParts({
@@ -1340,11 +1341,12 @@ export class Datetime {
1340
1341
  return [];
1341
1342
  }
1342
1343
  const { disabled, workingParts } = this;
1343
- const activePart = this.getActivePartsWithFallback();
1344
1344
  const pickerColumnValue = (workingParts.day !== null ? workingParts.day : this.defaultParts.day) ?? undefined;
1345
1345
  return (h("ion-picker-column", { part: WHEEL_PART, "aria-label": "Select a day", class: "day-column", color: this.color, disabled: disabled, value: pickerColumnValue, onIonChange: (ev) => {
1346
+ // Read live so parts a sibling column just committed are included.
1347
+ const activePart = this.getActivePartsWithFallback();
1346
1348
  this.setWorkingParts({
1347
- ...workingParts,
1349
+ ...this.workingParts,
1348
1350
  day: ev.detail.value,
1349
1351
  });
1350
1352
  this.setActiveParts({
@@ -1359,10 +1361,11 @@ export class Datetime {
1359
1361
  return [];
1360
1362
  }
1361
1363
  const { disabled, workingParts } = this;
1362
- const activePart = this.getActivePartsWithFallback();
1363
1364
  return (h("ion-picker-column", { part: WHEEL_PART, "aria-label": "Select a month", class: "month-column", color: this.color, disabled: disabled, value: workingParts.month, onIonChange: (ev) => {
1365
+ // Read live so parts a sibling column just committed are included.
1366
+ const activePart = this.getActivePartsWithFallback();
1364
1367
  this.setWorkingParts({
1365
- ...workingParts,
1368
+ ...this.workingParts,
1366
1369
  month: ev.detail.value,
1367
1370
  });
1368
1371
  // Month wheel is navigation-only in multi-select mode as a fix for https://github.com/ionic-team/ionic-framework/issues/29673
@@ -1380,10 +1383,11 @@ export class Datetime {
1380
1383
  return [];
1381
1384
  }
1382
1385
  const { disabled, workingParts } = this;
1383
- const activePart = this.getActivePartsWithFallback();
1384
1386
  return (h("ion-picker-column", { part: WHEEL_PART, "aria-label": "Select a year", class: "year-column", color: this.color, disabled: disabled, value: workingParts.year, onIonChange: (ev) => {
1387
+ // Read live so parts a sibling column just committed are included.
1388
+ const activePart = this.getActivePartsWithFallback();
1385
1389
  this.setWorkingParts({
1386
- ...workingParts,
1390
+ ...this.workingParts,
1387
1391
  year: ev.detail.value,
1388
1392
  });
1389
1393
  // Year wheel is navigation-only in multi-select mode as a fix for https://github.com/ionic-team/ionic-framework/issues/29673
@@ -1419,13 +1423,14 @@ export class Datetime {
1419
1423
  ];
1420
1424
  }
1421
1425
  renderHourPickerColumn(hoursData) {
1422
- const { disabled, workingParts } = this;
1426
+ const { disabled } = this;
1423
1427
  if (hoursData.length === 0)
1424
1428
  return [];
1425
1429
  const activePart = this.getActivePartsWithFallback();
1426
1430
  return (h("ion-picker-column", { part: WHEEL_PART, "aria-label": "Select an hour", color: this.color, disabled: disabled, value: activePart.hour, numericInput: true, onIonChange: (ev) => {
1431
+ // Read live so parts a sibling column just committed are included.
1427
1432
  this.setWorkingParts({
1428
- ...workingParts,
1433
+ ...this.workingParts,
1429
1434
  hour: ev.detail.value,
1430
1435
  });
1431
1436
  this.setActiveParts({
@@ -1436,13 +1441,14 @@ export class Datetime {
1436
1441
  } }, hoursData.map((hour) => (h("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)))));
1437
1442
  }
1438
1443
  renderMinutePickerColumn(minutesData) {
1439
- const { disabled, workingParts } = this;
1444
+ const { disabled } = this;
1440
1445
  if (minutesData.length === 0)
1441
1446
  return [];
1442
1447
  const activePart = this.getActivePartsWithFallback();
1443
1448
  return (h("ion-picker-column", { part: WHEEL_PART, "aria-label": "Select a minute", color: this.color, disabled: disabled, value: activePart.minute, numericInput: true, onIonChange: (ev) => {
1449
+ // Read live so parts a sibling column just committed are included.
1444
1450
  this.setWorkingParts({
1445
- ...workingParts,
1451
+ ...this.workingParts,
1446
1452
  minute: ev.detail.value,
1447
1453
  });
1448
1454
  this.setActiveParts({
@@ -1453,16 +1459,18 @@ export class Datetime {
1453
1459
  } }, minutesData.map((minute) => (h("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)))));
1454
1460
  }
1455
1461
  renderDayPeriodPickerColumn(dayPeriodData) {
1456
- const { disabled, workingParts } = this;
1462
+ const { disabled } = this;
1457
1463
  if (dayPeriodData.length === 0) {
1458
1464
  return [];
1459
1465
  }
1460
1466
  const activePart = this.getActivePartsWithFallback();
1461
1467
  const isDayPeriodRTL = isLocaleDayPeriodRTL(this.locale);
1462
1468
  return (h("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) => {
1463
- const hour = calculateHourFromAMPM(workingParts, ev.detail.value);
1469
+ // Read live so parts a sibling column just committed are included.
1470
+ const currentParts = this.workingParts;
1471
+ const hour = calculateHourFromAMPM(currentParts, ev.detail.value);
1464
1472
  this.setWorkingParts({
1465
- ...workingParts,
1473
+ ...currentParts,
1466
1474
  ampm: ev.detail.value,
1467
1475
  hour,
1468
1476
  });
@@ -1814,7 +1822,7 @@ export class Datetime {
1814
1822
  const hasDatePresentation = presentation === 'date' || presentation === 'date-time' || presentation === 'time-date';
1815
1823
  const hasWheelVariant = hasDatePresentation && preferWheel;
1816
1824
  renderHiddenInput(true, el, name, formatValue(value), disabled);
1817
- return (h(Host, { key: 'd8e6dfe5e3bffb1c38a3e37b63b3aec099f40d29', "aria-disabled": disabled ? 'true' : null, onFocus: this.onFocus, onBlur: this.onBlur, class: {
1825
+ return (h(Host, { key: '4e0b529a70924b065bcc6191e08550428b5a52a0', "aria-disabled": disabled ? 'true' : null, onFocus: this.onFocus, onBlur: this.onBlur, class: {
1818
1826
  ...createColorClasses(color, {
1819
1827
  [mode]: true,
1820
1828
  ['datetime-readonly']: readonly,
@@ -1826,7 +1834,7 @@ export class Datetime {
1826
1834
  [`datetime-prefer-wheel`]: hasWheelVariant,
1827
1835
  [`datetime-grid`]: isGridStyle,
1828
1836
  }),
1829
- } }, h("div", { key: '20889d3c68dd5109633c0e214411a63d6f3025bb', class: "intersection-tracker", ref: (el) => (this.intersectionTrackerRef = el) }), this.renderDatetime(mode)));
1837
+ } }, h("div", { key: 'cc9d1b92f960984cb0466d0003a240ace67da243', class: "intersection-tracker", ref: (el) => (this.intersectionTrackerRef = el) }), this.renderDatetime(mode)));
1830
1838
  }
1831
1839
  static get is() { return "ion-datetime"; }
1832
1840
  static get encapsulation() { return "shadow"; }