@ionic/core 9.0.1-dev.11788285010.17561004 → 9.0.1-dev.11788375537.1f38f077

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 (426) 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-A8MJRBIY.js → p-C8mPeq0D.js} +1 -1
  111. package/components/{p-Bx2saTHs.js → p-CB06XtlF.js} +1 -1
  112. package/components/{p-BgUIV8NQ.js → p-CBhGZ6rF.js} +1 -1
  113. package/components/{p-B8MQjdvk.js → p-CDKY4TZ_.js} +1 -1
  114. package/components/{p-CWETxTjE.js → p-CEkamjav.js} +1 -1
  115. package/components/p-CFtAWaB6.js +4 -0
  116. package/components/{p-DEW7CnUc.js → p-CJTKYpZv.js} +1 -1
  117. package/components/{p-BA_4ZIEg.js → p-CLZPNP7x.js} +1 -1
  118. package/components/{p-tX3UxCnU.js → p-COxY7PLK.js} +1 -1
  119. package/components/p-CQxPXWNM.js +4 -0
  120. package/components/{p-DDdkefwf.js → p-CRcX0EGs.js} +1 -1
  121. package/components/{p-Bg4OwDwb.js → p-CXQzYyda.js} +1 -1
  122. package/components/p-CXpy69Ei.js +4 -0
  123. package/{dist/ionic/p-BZxjcGRP.js → components/p-CdSLe3Q3.js} +1 -1
  124. package/components/p-CoGD-oMG.js +4 -0
  125. package/components/p-CpYeYl3u.js +4 -0
  126. package/components/{p-BFtL8t1r.js → p-CyKlfXdt.js} +1 -1
  127. package/components/{p-CHswSpKy.js → p-D6PwfJ9F.js} +1 -1
  128. package/components/{p-Bnc0m4SW.js → p-D6dNJoqU.js} +1 -1
  129. package/components/{p-eFI3mtEX.js → p-D8BOfNYz.js} +1 -1
  130. package/{dist/ionic/p-D0dfUysx.js → components/p-DG-dUCKp.js} +1 -1
  131. package/{dist/ionic/p-DF_Uqql8.js → components/p-DH0rRXjx.js} +1 -1
  132. package/components/{p-D7ysFE2B.js → p-DMkSsriG.js} +1 -1
  133. package/components/{p-CaiZOhfC.js → p-Dcxr2vKX.js} +1 -1
  134. package/components/{p-B6x5_b9w.js → p-DkEb3SCT.js} +1 -1
  135. package/components/p-Dr-rBSUW.js +4 -0
  136. package/components/{p-DqAI6tg7.js → p-FQTgh7aH.js} +1 -1
  137. package/components/{p-DrehWDfv.js → p-KusMkAnB.js} +1 -1
  138. package/components/p-MHpJ2A_m.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-CQAjyETU.js → p-U1X_lw_6.js} +1 -1
  142. package/components/p-UKksD3f9.js +4 -0
  143. package/components/{p-v2NpoOHp.js → p-VTfnz_8u.js} +1 -1
  144. package/components/p-fP0QF3iG.js +4 -0
  145. package/components/{p-BPDxVIRr.js → p-l-zxxFre.js} +1 -1
  146. package/components/{p-BrFaQbGY.js → p-mXsQnyWB.js} +1 -1
  147. package/components/p-ntAkt4Ra.js +4 -0
  148. package/components/p-ufB0gCSU.js +4 -0
  149. package/dist/cjs/{animation-D-OqR4a4.js → animation-ihPP_z2n.js} +1 -1
  150. package/dist/cjs/{app-globals-BzgwARwJ.js → app-globals-BlkzA410.js} +1 -1
  151. package/dist/cjs/{button-active-BlWSD7uK.js → button-active-ItGBjzmO.js} +1 -1
  152. package/dist/cjs/{format-D7ig6Vm0.js → format-CPIqtp4x.js} +1 -1
  153. package/dist/cjs/{framework-delegate-BZUx4TnE.js → framework-delegate-DhyWUPGg.js} +1 -1
  154. package/dist/cjs/{hardware-back-button-JOAEFSzc.js → hardware-back-button-D5f_kASb.js} +1 -1
  155. package/dist/cjs/{helpers-Dj5o76mq.js → helpers-BCLkFTTd.js} +1 -1
  156. package/dist/cjs/{index-C8zH6b3d.js → index-49DTLc_Z.js} +2 -2
  157. package/dist/cjs/{index-CZ6vzt_q.js → index-BcyiqD6R.js} +5 -5
  158. package/dist/cjs/{index-BrVMoqUk.js → index-Bgz6BcKx.js} +50 -16
  159. package/dist/cjs/{index-EJLjthTK.js → index-BocV_y-c.js} +2 -1
  160. package/dist/cjs/{index-2sO-zkZ2.js → index-CldjPPyP.js} +4 -4
  161. package/dist/cjs/{index-Csue6G3m.js → index-xum7jdbq.js} +2 -2
  162. package/dist/cjs/index.cjs.js +12 -12
  163. package/dist/cjs/{input-shims-Bh7bnt2v.js → input-shims-Jisy7U7-.js} +3 -3
  164. package/dist/cjs/{input.utils-Cq3g9uHy.js → input.utils-BDTpGrfn.js} +1 -1
  165. package/dist/cjs/ion-accordion_2.cjs.entry.js +3 -3
  166. package/dist/cjs/ion-action-sheet.cjs.entry.js +10 -10
  167. package/dist/cjs/ion-alert.cjs.entry.js +10 -10
  168. package/dist/cjs/ion-app_8.cjs.entry.js +12 -12
  169. package/dist/cjs/ion-avatar_3.cjs.entry.js +2 -2
  170. package/dist/cjs/ion-back-button.cjs.entry.js +3 -3
  171. package/dist/cjs/ion-backdrop.cjs.entry.js +2 -2
  172. package/dist/cjs/ion-breadcrumb_2.cjs.entry.js +3 -3
  173. package/dist/cjs/ion-button_2.cjs.entry.js +3 -3
  174. package/dist/cjs/ion-card_5.cjs.entry.js +3 -3
  175. package/dist/cjs/ion-checkbox.cjs.entry.js +4 -4
  176. package/dist/cjs/ion-chip.cjs.entry.js +2 -2
  177. package/dist/cjs/ion-col_3.cjs.entry.js +2 -2
  178. package/dist/cjs/ion-datetime-button.cjs.entry.js +4 -4
  179. package/dist/cjs/ion-datetime.cjs.entry.js +32 -24
  180. package/dist/cjs/ion-fab_3.cjs.entry.js +3 -3
  181. package/dist/cjs/ion-img.cjs.entry.js +3 -3
  182. package/dist/cjs/ion-infinite-scroll_2.cjs.entry.js +5 -5
  183. package/dist/cjs/ion-input-otp.cjs.entry.js +3 -3
  184. package/dist/cjs/ion-input-password-toggle.cjs.entry.js +2 -2
  185. package/dist/cjs/ion-input.cjs.entry.js +5 -5
  186. package/dist/cjs/ion-item-option_3.cjs.entry.js +13 -15
  187. package/dist/cjs/ion-item_8.cjs.entry.js +3 -3
  188. package/dist/cjs/ion-loading.cjs.entry.js +8 -8
  189. package/dist/cjs/ion-menu_3.cjs.entry.js +8 -8
  190. package/dist/cjs/ion-modal.cjs.entry.js +9 -9
  191. package/dist/cjs/ion-nav_2.cjs.entry.js +6 -6
  192. package/dist/cjs/ion-picker-column-option.cjs.entry.js +3 -3
  193. package/dist/cjs/ion-picker-column.cjs.entry.js +210 -46
  194. package/dist/cjs/ion-picker.cjs.entry.js +2 -2
  195. package/dist/cjs/ion-popover.cjs.entry.js +8 -8
  196. package/dist/cjs/ion-progress-bar.cjs.entry.js +3 -3
  197. package/dist/cjs/ion-radio_2.cjs.entry.js +4 -4
  198. package/dist/cjs/ion-range.cjs.entry.js +4 -4
  199. package/dist/cjs/ion-refresher_2.cjs.entry.js +6 -6
  200. package/dist/cjs/ion-reorder_2.cjs.entry.js +4 -4
  201. package/dist/cjs/ion-ripple-effect.cjs.entry.js +2 -2
  202. package/dist/cjs/ion-route_4.cjs.entry.js +4 -4
  203. package/dist/cjs/ion-searchbar.cjs.entry.js +3 -3
  204. package/dist/cjs/ion-segment-content.cjs.entry.js +1 -1
  205. package/dist/cjs/ion-segment-view.cjs.entry.js +1 -1
  206. package/dist/cjs/ion-segment_2.cjs.entry.js +14 -10
  207. package/dist/cjs/ion-select-modal.cjs.entry.js +8 -8
  208. package/dist/cjs/ion-select_3.cjs.entry.js +57 -47
  209. package/dist/cjs/ion-spinner.cjs.entry.js +2 -2
  210. package/dist/cjs/ion-split-pane.cjs.entry.js +2 -2
  211. package/dist/cjs/ion-tab-bar_2.cjs.entry.js +3 -3
  212. package/dist/cjs/ion-tab_2.cjs.entry.js +3 -3
  213. package/dist/cjs/ion-text.cjs.entry.js +2 -2
  214. package/dist/cjs/ion-textarea.cjs.entry.js +5 -5
  215. package/dist/cjs/ion-toast.cjs.entry.js +8 -8
  216. package/dist/cjs/ion-toggle.cjs.entry.js +4 -4
  217. package/dist/cjs/{ionic-global-DvgIzM2F.js → ionic-global-BMU-Us1Q.js} +1 -1
  218. package/dist/cjs/ionic.cjs.js +4 -4
  219. package/dist/cjs/{ios.transition-zIgdoSYe.js → ios.transition-OCcCN--B.js} +4 -4
  220. package/dist/cjs/{item-multiple-inputs-DG-ZGm6j.js → item-multiple-inputs-BH9yPC66.js} +1 -1
  221. package/dist/cjs/loader.cjs.js +3 -3
  222. package/dist/cjs/{md.transition-CXeJ9rfh.js → md.transition-D0o2IIbo.js} +4 -4
  223. package/dist/cjs/{overlays-Bg0auTQa.js → overlays-hCtsdAvn.js} +5 -5
  224. package/dist/cjs/{select-option-render-7m1WdFzF.js → select-option-render-BPjGDlsG.js} +2 -2
  225. package/dist/cjs/{slot-mutation-controller-BJEJzx_e.js → slot-mutation-controller-IQ250LoG.js} +1 -1
  226. package/dist/cjs/{status-tap-DxbUM5XX.js → status-tap-Bakl9czs.js} +3 -3
  227. package/dist/cjs/{swipe-back-F_DBt-Aw.js → swipe-back-Cv4OZVJ5.js} +2 -2
  228. package/dist/collection/collection-manifest.json +1 -1
  229. package/dist/collection/components/datetime/datetime.js +25 -17
  230. package/dist/collection/components/item-sliding/item-sliding.js +10 -12
  231. package/dist/collection/components/picker-column/picker-column.js +207 -43
  232. package/dist/collection/components/segment-button/segment-button.js +11 -7
  233. package/dist/collection/components/select/select.js +49 -39
  234. package/dist/collection/utils/test/late-props/late-props.js +69 -0
  235. package/dist/docs.json +279 -48
  236. package/dist/esm/{animation-TxGPYeDn.js → animation-B6KGUJwl.js} +1 -1
  237. package/dist/esm/{app-globals-Do8rJest.js → app-globals-BvutUX8P.js} +1 -1
  238. package/dist/esm/{button-active-ChA4D-ml.js → button-active-DRNebs9r.js} +1 -1
  239. package/dist/esm/{format-CVk5e_GP.js → format-BF3btM7P.js} +1 -1
  240. package/dist/esm/{framework-delegate-DaLWnISz.js → framework-delegate-60cEIAgt.js} +1 -1
  241. package/dist/esm/{hardware-back-button-D8W4L0JP.js → hardware-back-button-rhkwRNk2.js} +1 -1
  242. package/dist/esm/{helpers-BIgoInJU.js → helpers-DLLANtRS.js} +1 -1
  243. package/dist/esm/{index-C8Dsa6li.js → index-BZHVn0iF.js} +4 -4
  244. package/dist/esm/{index-DHw2lZxe.js → index-Bl4BUvBL.js} +2 -2
  245. package/dist/esm/{index-BmOR8tCv.js → index-DOrtAUWV.js} +2 -2
  246. package/dist/esm/{index-C5ZdL0qp.js → index-D_7MeuVD.js} +5 -5
  247. package/dist/esm/{index-elneMH8y.js → index-JgU5uTSY.js} +2 -2
  248. package/dist/esm/{index-CKYcsw8f.js → index-h81G-QbJ.js} +50 -16
  249. package/dist/esm/index.js +12 -12
  250. package/dist/esm/{input-shims-09NN97kF.js → input-shims-C2ipc_XX.js} +3 -3
  251. package/dist/esm/{input.utils-BxyH9l1w.js → input.utils-D-qoPjqr.js} +1 -1
  252. package/dist/esm/ion-accordion_2.entry.js +3 -3
  253. package/dist/esm/ion-action-sheet.entry.js +10 -10
  254. package/dist/esm/ion-alert.entry.js +10 -10
  255. package/dist/esm/ion-app_8.entry.js +12 -12
  256. package/dist/esm/ion-avatar_3.entry.js +2 -2
  257. package/dist/esm/ion-back-button.entry.js +3 -3
  258. package/dist/esm/ion-backdrop.entry.js +2 -2
  259. package/dist/esm/ion-breadcrumb_2.entry.js +3 -3
  260. package/dist/esm/ion-button_2.entry.js +3 -3
  261. package/dist/esm/ion-card_5.entry.js +3 -3
  262. package/dist/esm/ion-checkbox.entry.js +4 -4
  263. package/dist/esm/ion-chip.entry.js +2 -2
  264. package/dist/esm/ion-col_3.entry.js +2 -2
  265. package/dist/esm/ion-datetime-button.entry.js +4 -4
  266. package/dist/esm/ion-datetime.entry.js +32 -24
  267. package/dist/esm/ion-fab_3.entry.js +3 -3
  268. package/dist/esm/ion-img.entry.js +3 -3
  269. package/dist/esm/ion-infinite-scroll_2.entry.js +5 -5
  270. package/dist/esm/ion-input-otp.entry.js +3 -3
  271. package/dist/esm/ion-input-password-toggle.entry.js +2 -2
  272. package/dist/esm/ion-input.entry.js +5 -5
  273. package/dist/esm/ion-item-option_3.entry.js +13 -15
  274. package/dist/esm/ion-item_8.entry.js +3 -3
  275. package/dist/esm/ion-loading.entry.js +8 -8
  276. package/dist/esm/ion-menu_3.entry.js +8 -8
  277. package/dist/esm/ion-modal.entry.js +9 -9
  278. package/dist/esm/ion-nav_2.entry.js +6 -6
  279. package/dist/esm/ion-picker-column-option.entry.js +3 -3
  280. package/dist/esm/ion-picker-column.entry.js +211 -47
  281. package/dist/esm/ion-picker.entry.js +2 -2
  282. package/dist/esm/ion-popover.entry.js +8 -8
  283. package/dist/esm/ion-progress-bar.entry.js +3 -3
  284. package/dist/esm/ion-radio_2.entry.js +4 -4
  285. package/dist/esm/ion-range.entry.js +4 -4
  286. package/dist/esm/ion-refresher_2.entry.js +6 -6
  287. package/dist/esm/ion-reorder_2.entry.js +4 -4
  288. package/dist/esm/ion-ripple-effect.entry.js +2 -2
  289. package/dist/esm/ion-route_4.entry.js +4 -4
  290. package/dist/esm/ion-searchbar.entry.js +3 -3
  291. package/dist/esm/ion-segment-content.entry.js +1 -1
  292. package/dist/esm/ion-segment-view.entry.js +1 -1
  293. package/dist/esm/ion-segment_2.entry.js +14 -10
  294. package/dist/esm/ion-select-modal.entry.js +8 -8
  295. package/dist/esm/ion-select_3.entry.js +57 -47
  296. package/dist/esm/ion-spinner.entry.js +2 -2
  297. package/dist/esm/ion-split-pane.entry.js +2 -2
  298. package/dist/esm/ion-tab-bar_2.entry.js +3 -3
  299. package/dist/esm/ion-tab_2.entry.js +3 -3
  300. package/dist/esm/ion-text.entry.js +2 -2
  301. package/dist/esm/ion-textarea.entry.js +5 -5
  302. package/dist/esm/ion-toast.entry.js +8 -8
  303. package/dist/esm/ion-toggle.entry.js +4 -4
  304. package/dist/esm/{ionic-global-lrowsHfi.js → ionic-global-B7I1sdvg.js} +1 -1
  305. package/dist/esm/ionic.js +5 -5
  306. package/dist/esm/{ios.transition-BQhADrk1.js → ios.transition-C-6IaIxe.js} +4 -4
  307. package/dist/esm/{item-multiple-inputs-D_N3fDkD.js → item-multiple-inputs-DI91syHS.js} +1 -1
  308. package/dist/esm/loader.js +4 -4
  309. package/dist/esm/{md.transition-D58NpmRa.js → md.transition-dyqt0t0d.js} +4 -4
  310. package/dist/esm/{overlays-BpnIFlXI.js → overlays-CiFoZEq1.js} +5 -5
  311. package/dist/esm/{select-option-render-lIuu64EV.js → select-option-render-CUJpruSC.js} +2 -2
  312. package/dist/esm/{slot-mutation-controller-rS_T3FDR.js → slot-mutation-controller-wFuztlVD.js} +1 -1
  313. package/dist/esm/{status-tap-CpFQMLl6.js → status-tap-Dn_42wiy.js} +3 -3
  314. package/dist/esm/{swipe-back-rmc7zeNW.js → swipe-back-CqOqrHW7.js} +2 -2
  315. package/dist/ionic/index.esm.js +1 -1
  316. package/dist/ionic/ionic.esm.js +1 -1
  317. package/dist/ionic/{p-d8deff43.entry.js → p-026e2e4c.entry.js} +1 -1
  318. package/dist/ionic/{p-RzUn7cKs.js → p-06ZcwRF5.js} +1 -1
  319. package/dist/ionic/{p-b62bfce8.entry.js → p-082b8125.entry.js} +1 -1
  320. package/dist/ionic/{p-16e9f542.entry.js → p-0b52d921.entry.js} +1 -1
  321. package/dist/ionic/{p-485fb218.entry.js → p-1a20571c.entry.js} +1 -1
  322. package/dist/ionic/{p-90ba736e.entry.js → p-1f66c230.entry.js} +1 -1
  323. package/dist/ionic/{p-a0fee899.entry.js → p-2aabd568.entry.js} +1 -1
  324. package/dist/ionic/{p-295ff427.entry.js → p-2ff12c8a.entry.js} +1 -1
  325. package/dist/ionic/p-326e0d05.entry.js +4 -0
  326. package/dist/ionic/p-392079fa.entry.js +4 -0
  327. package/dist/ionic/{p-48c859fe.entry.js → p-39415b06.entry.js} +1 -1
  328. package/dist/ionic/{p-886d9e66.entry.js → p-3bad6750.entry.js} +1 -1
  329. package/dist/ionic/{p-6f048604.entry.js → p-43bae3f5.entry.js} +1 -1
  330. package/dist/ionic/{p-d3384a40.entry.js → p-47b8b59a.entry.js} +1 -1
  331. package/dist/ionic/p-4dcd329a.entry.js +4 -0
  332. package/dist/ionic/{p-478035a7.entry.js → p-53ba5651.entry.js} +1 -1
  333. package/dist/ionic/{p-bbf6878c.entry.js → p-546b1109.entry.js} +1 -1
  334. package/dist/ionic/{p-8dd4c026.entry.js → p-5dc53bdf.entry.js} +1 -1
  335. package/dist/ionic/{p-1df75f9e.entry.js → p-5ed60413.entry.js} +1 -1
  336. package/dist/ionic/{p-05800a02.entry.js → p-5fce4bf4.entry.js} +1 -1
  337. package/dist/ionic/{p-ddfb7e5f.entry.js → p-6d84fa9f.entry.js} +1 -1
  338. package/dist/ionic/{p-68507e70.entry.js → p-70334101.entry.js} +1 -1
  339. package/dist/ionic/{p-72ad7c64.entry.js → p-7c859f42.entry.js} +1 -1
  340. package/dist/ionic/{p-f376876b.entry.js → p-83aa7d47.entry.js} +1 -1
  341. package/dist/ionic/{p-959df5f8.entry.js → p-8d72244b.entry.js} +1 -1
  342. package/dist/ionic/{p-34b9379b.entry.js → p-8db6e422.entry.js} +1 -1
  343. package/dist/ionic/{p-9e455875.entry.js → p-8e388a30.entry.js} +1 -1
  344. package/dist/ionic/{p-b5f37106.entry.js → p-9452849d.entry.js} +1 -1
  345. package/dist/ionic/{p-75887ee0.entry.js → p-986a1db8.entry.js} +1 -1
  346. package/dist/ionic/{p-a54bcd16.entry.js → p-9e688396.entry.js} +1 -1
  347. package/dist/ionic/{p-cad4eccf.entry.js → p-9eba0d8a.entry.js} +1 -1
  348. package/dist/ionic/{p-8e007f11.entry.js → p-9f2d3987.entry.js} +1 -1
  349. package/{components/p-BSARlp49.js → dist/ionic/p-BC17SPKH.js} +1 -1
  350. package/dist/ionic/p-BRa1Jjxr.js +4 -0
  351. package/dist/ionic/{p-De0eY881.js → p-BRc8gq5v.js} +1 -1
  352. package/{components/p-66ogmUZU.js → dist/ionic/p-BpG7jkT9.js} +1 -1
  353. package/dist/ionic/{p-B1Y7LZhV.js → p-C10K-FJg.js} +1 -1
  354. package/dist/ionic/{p-D9yvytgv.js → p-C2BY_4Wp.js} +1 -1
  355. package/dist/ionic/{p-BZVE25Gu.js → p-CH8tk7Pr.js} +1 -1
  356. package/dist/ionic/{p-CDBop-kz.js → p-CTBfxfjC.js} +1 -1
  357. package/dist/ionic/p-Cc-fFNy8.js +4 -0
  358. package/dist/ionic/p-Cc4w3fVf.js +4 -0
  359. package/{components/p-BuPAFTWI.js → dist/ionic/p-CoEa7CiN.js} +1 -1
  360. package/dist/ionic/p-CvRL-Eju.js +4 -0
  361. package/dist/ionic/{p-DdhHqKj-.js → p-DA52akcQ.js} +1 -1
  362. package/dist/ionic/p-DA88iqXQ.js +4 -0
  363. package/dist/ionic/{p-DXJgZWgi.js → p-DMj-M2c4.js} +1 -1
  364. package/dist/ionic/p-D_IgV7tz.js +4 -0
  365. package/dist/ionic/{p-VquyMbjp.js → p-DoUx_N0R.js} +1 -1
  366. package/dist/ionic/{p-C4IBDDj6.js → p-KJ5pLPiN.js} +1 -1
  367. package/dist/ionic/{p-ByLaqOPm.js → p-Q9w8L_Sw.js} +1 -1
  368. package/dist/ionic/{p-ClrlQU2y.js → p-S1shXW5M.js} +1 -1
  369. package/dist/ionic/{p-1db2afb4.entry.js → p-a2fccdaa.entry.js} +1 -1
  370. package/dist/ionic/{p-fbd83d4c.entry.js → p-ac71362a.entry.js} +1 -1
  371. package/dist/ionic/{p-b7a11b58.entry.js → p-b62c04b2.entry.js} +1 -1
  372. package/dist/ionic/p-b8cd338d.entry.js +4 -0
  373. package/dist/ionic/{p-5f216b79.entry.js → p-ca57763d.entry.js} +1 -1
  374. package/dist/ionic/{p-39a8d4e0.entry.js → p-cc749877.entry.js} +1 -1
  375. package/dist/ionic/{p-56307aea.entry.js → p-d1539609.entry.js} +1 -1
  376. package/dist/ionic/{p-cdc5115e.entry.js → p-d1b888de.entry.js} +1 -1
  377. package/dist/ionic/p-da5a7bcd.entry.js +4 -0
  378. package/dist/ionic/{p-70ee8888.entry.js → p-dadcb3d2.entry.js} +1 -1
  379. package/dist/ionic/{p-0eb50dca.entry.js → p-e090eca3.entry.js} +1 -1
  380. package/dist/ionic/{p-873a315a.entry.js → p-e5a54d99.entry.js} +1 -1
  381. package/dist/ionic/{p-c49165af.entry.js → p-e93cc1e1.entry.js} +1 -1
  382. package/dist/ionic/p-eab77a74.entry.js +4 -0
  383. package/dist/ionic/{p-aebc4d69.entry.js → p-eaeac54e.entry.js} +1 -1
  384. package/dist/ionic/{p-e538f18d.entry.js → p-ecfc9c71.entry.js} +1 -1
  385. package/dist/ionic/{p-5ee2d7b1.entry.js → p-eeb65463.entry.js} +1 -1
  386. package/dist/ionic/{p-881b6954.entry.js → p-f0645c98.entry.js} +1 -1
  387. package/dist/ionic/{p-d8bae128.entry.js → p-f607ad4f.entry.js} +1 -1
  388. package/dist/ionic/{p-61c799d1.entry.js → p-fb4dabbb.entry.js} +1 -1
  389. package/dist/ionic/{p-63bbba8d.entry.js → p-fe80ebb1.entry.js} +1 -1
  390. package/dist/ionic/p-h81G-QbJ.js +6 -0
  391. package/dist/ionic/p-w3KTiug9.js +4 -0
  392. package/{components/p-RFfE9hF6.js → dist/ionic/p-wdSUbx5C.js} +1 -1
  393. package/dist/types/components/picker-column/picker-column.d.ts +42 -0
  394. package/dist/types/components.d.ts +1 -1
  395. package/dist/types/stencil-public-runtime.d.ts +12 -0
  396. package/hydrate/index.js +328 -123
  397. package/hydrate/index.mjs +328 -123
  398. package/loader/index.d.ts +1 -1
  399. package/package.json +2 -2
  400. package/components/p-6Vp915Y7.js +0 -4
  401. package/components/p-AQcCdH2_.js +0 -4
  402. package/components/p-BdwCtX8Y.js +0 -4
  403. package/components/p-BxhE2W85.js +0 -4
  404. package/components/p-CR9OgE6N.js +0 -4
  405. package/components/p-CaZeZIL2.js +0 -4
  406. package/components/p-CqyGR9Aq.js +0 -4
  407. package/components/p-DCWfzDM8.js +0 -4
  408. package/components/p-DQ1IPvZO.js +0 -4
  409. package/components/p-DfdYCsov.js +0 -4
  410. package/components/p-DhOoEIAs.js +0 -4
  411. package/components/p-Dl_7b_UJ.js +0 -4
  412. package/components/p-HVYBAhFx.js +0 -4
  413. package/dist/ionic/p-18d532a3.entry.js +0 -4
  414. package/dist/ionic/p-4437015c.entry.js +0 -4
  415. package/dist/ionic/p-49b9d405.entry.js +0 -4
  416. package/dist/ionic/p-8f464a8f.entry.js +0 -4
  417. package/dist/ionic/p-8f51110d.entry.js +0 -4
  418. package/dist/ionic/p-B5RyLYvl.js +0 -4
  419. package/dist/ionic/p-BQv5i5Kf.js +0 -4
  420. package/dist/ionic/p-BnGA34Pd.js +0 -4
  421. package/dist/ionic/p-C06QNN45.js +0 -4
  422. package/dist/ionic/p-CCVlNZ__.js +0 -4
  423. package/dist/ionic/p-CKYcsw8f.js +0 -5
  424. package/dist/ionic/p-CazSodad.js +0 -4
  425. package/dist/ionic/p-DgUL3JbO.js +0 -4
  426. package/dist/ionic/p-f521b13c.entry.js +0 -4
@@ -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"; }
@@ -3,7 +3,7 @@
3
3
  */
4
4
  import { Host, h } from "@stencil/core";
5
5
  import { findClosestIonContent, disableContentScrollY, resetContentScrollY } from "../../utils/content/index";
6
- import { isEndSide } from "../../utils/helpers";
6
+ import { componentOnReady, isEndSide } from "../../utils/helpers";
7
7
  import { printIonWarning } from "../../utils/logging/index";
8
8
  import { watchForOptions } from "../../utils/watch-options";
9
9
  import { getIonMode } from "../../global/ionic-global";
@@ -178,19 +178,17 @@ export class ItemSliding {
178
178
  }
179
179
  }
180
180
  async updateOptions() {
181
- const options = this.el.querySelectorAll('ion-item-options');
181
+ const options = Array.from(this.el.querySelectorAll('ion-item-options'));
182
+ /**
183
+ * Frameworks that assign element props after inserting the element haven't set
184
+ * `side` while `connectedCallback` runs, so reading it any earlier reports every
185
+ * option as `end`.
186
+ */
187
+ await Promise.all(options.map((option) => new Promise((resolve) => componentOnReady(option, resolve))));
182
188
  let sides = 0;
183
189
  // Reset left and right options in case they were removed
184
190
  this.leftOptions = this.rightOptions = undefined;
185
- for (let i = 0; i < options.length; i++) {
186
- const item = options.item(i);
187
- /**
188
- * We cannot use the componentOnReady helper
189
- * util here since we need to wait for all of these items
190
- * to be ready before we set `this.sides` and `this.optsDirty`.
191
- */
192
- // eslint-disable-next-line custom-rules/no-component-on-ready-method
193
- const option = item.componentOnReady !== undefined ? await item.componentOnReady() : item;
191
+ for (const option of options) {
194
192
  const side = isEndSide(option.side ?? option.getAttribute('side')) ? 'end' : 'start';
195
193
  if (side === 'start') {
196
194
  this.leftOptions = option;
@@ -389,7 +387,7 @@ export class ItemSliding {
389
387
  }
390
388
  render() {
391
389
  const mode = getIonMode(this);
392
- return (h(Host, { key: '15f6a98f8c888e86c29827cdf55d98ace08699dd', class: {
390
+ return (h(Host, { key: '02174ca963753d3a51a4249068f3d436f8acb03d', class: {
393
391
  [mode]: true,
394
392
  'item-sliding-active-slide': this.state !== 2 /* SlidingState.Disabled */,
395
393
  'item-sliding-active-options-end': (this.state & 8 /* SlidingState.End */) !== 0,
@@ -20,6 +20,12 @@ export class PickerColumn {
20
20
  this.isColumnVisible = false;
21
21
  this.canExitInputMode = true;
22
22
  this.updateValueTextOnScroll = false;
23
+ this.isUserScroll = false;
24
+ /**
25
+ * The haptics for the wheel picker are an iOS-only feature. As a result,
26
+ * they should be disabled on Android.
27
+ */
28
+ this.enableHaptics = false;
23
29
  this.ariaLabel = null;
24
30
  this.isActive = false;
25
31
  /**
@@ -51,6 +57,12 @@ export class PickerColumn {
51
57
  */
52
58
  this.canExitInputMode = canExitInputMode;
53
59
  this.updateValueTextOnScroll = false;
60
+ /**
61
+ * This scroll takes over from whatever the user was doing, so an outside
62
+ * press must not commit an option the column is only passing through.
63
+ */
64
+ this.isUserScroll = false;
65
+ this.stopWatchingForOutsidePress();
54
66
  scrollEl.scroll({
55
67
  top,
56
68
  left: 0,
@@ -105,6 +117,117 @@ export class PickerColumn {
105
117
  }
106
118
  this.isActive = state;
107
119
  };
120
+ this.clearScrollEndTimeout = () => {
121
+ if (this.scrollEndTimeout) {
122
+ clearTimeout(this.scrollEndTimeout);
123
+ this.scrollEndTimeout = undefined;
124
+ }
125
+ };
126
+ /**
127
+ * Resets the idle timer that commits the centered option.
128
+ */
129
+ this.resetScrollEndTimeout = () => {
130
+ this.clearScrollEndTimeout();
131
+ this.scrollEndTimeout = setTimeout(this.settle, SCROLL_END_DELAY);
132
+ };
133
+ /**
134
+ * Capture so the column still commits if an application's own pointerdown
135
+ * handler stops the event before it reaches the document.
136
+ */
137
+ this.watchForOutsidePress = () => {
138
+ doc?.addEventListener('pointerdown', this.onPointerDownOutside, { capture: true });
139
+ };
140
+ this.stopWatchingForOutsidePress = () => {
141
+ doc?.removeEventListener('pointerdown', this.onPointerDownOutside, { capture: true });
142
+ };
143
+ /**
144
+ * Resets everything the current scroll interaction is holding, so nothing
145
+ * pending on it can commit later.
146
+ */
147
+ this.discardScroll = () => {
148
+ this.stopWatchingForOutsidePress();
149
+ this.clearScrollEndTimeout();
150
+ this.scrollEndCallback = undefined;
151
+ this.centeredOption = undefined;
152
+ this.haltedAtScrollTop = undefined;
153
+ this.isScrolling = false;
154
+ this.isUserScroll = false;
155
+ this.canExitInputMode = true;
156
+ };
157
+ /**
158
+ * Commits the option that is currently centered under the highlight and ends
159
+ * the scroll interaction.
160
+ */
161
+ this.settle = () => {
162
+ const { centeredOption } = this;
163
+ this.clearScrollEndTimeout();
164
+ this.stopWatchingForOutsidePress();
165
+ this.isUserScroll = false;
166
+ this.isScrolling = false;
167
+ this.updateValueTextOnScroll = true;
168
+ this.enableHaptics && hapticSelectionEnd();
169
+ /**
170
+ * Certain tasks (such as those that
171
+ * cause re-renders) should only be done
172
+ * once scrolling has finished, otherwise
173
+ * flickering may occur.
174
+ */
175
+ const { scrollEndCallback } = this;
176
+ if (scrollEndCallback) {
177
+ scrollEndCallback();
178
+ this.scrollEndCallback = undefined;
179
+ }
180
+ /**
181
+ * Reset this flag as the
182
+ * next scroll interaction could
183
+ * be a scroll from the user. In this
184
+ * case, we should exit input mode.
185
+ */
186
+ this.canExitInputMode = true;
187
+ if (centeredOption !== undefined) {
188
+ // Cleared here so a later scroll that centers nothing cannot fall back on it.
189
+ this.centeredOption = undefined;
190
+ if (centeredOption.isConnected) {
191
+ this.setValue(centeredOption.value);
192
+ }
193
+ }
194
+ };
195
+ /**
196
+ * Commits the option the user can see when they press anything outside of the
197
+ * column during a scroll they started. This runs on pointerdown rather than
198
+ * click so the value is up to date by the time an application's own click
199
+ * handler (a Save button, for example) reads it.
200
+ */
201
+ this.onPointerDownOutside = (ev) => {
202
+ const { centeredOption, parentEl, scrollEl } = this;
203
+ if (!this.isScrolling) {
204
+ return;
205
+ }
206
+ /**
207
+ * The column can live in another component's Shadow DOM, where a document
208
+ * listener sees the target retargeted to the outer host. The composed path
209
+ * is the only reliable way to tell a press on the column apart.
210
+ */
211
+ const path = ev.composedPath();
212
+ /**
213
+ * A press anywhere in the parent picker counts as inside, so reaching for a
214
+ * sibling wheel leaves this column coasting.
215
+ */
216
+ if (path.includes(this.el) || (parentEl != null && path.includes(parentEl))) {
217
+ return;
218
+ }
219
+ /**
220
+ * Landing on the centered option halts the in-flight momentum scroll, so the
221
+ * committed value and the option the user is left looking at agree. The
222
+ * option list can be replaced mid-scroll, and a detached option has no
223
+ * offset to center on.
224
+ */
225
+ if (centeredOption !== undefined && centeredOption.isConnected) {
226
+ this.centerPickerItemInView(centeredOption, false, false);
227
+ this.haltedAtScrollTop = scrollEl?.scrollTop;
228
+ }
229
+ this.settle();
230
+ };
108
231
  /**
109
232
  * When the column scrolls, the component
110
233
  * needs to determine which item is centered
@@ -112,27 +235,42 @@ export class PickerColumn {
112
235
  * the item object.
113
236
  */
114
237
  this.initializeScrollListener = () => {
115
- /**
116
- * The haptics for the wheel picker are
117
- * an iOS-only feature. As a result, they should
118
- * be disabled on Android.
119
- */
120
- const enableHaptics = isPlatform('ios');
238
+ this.enableHaptics = isPlatform('ios');
121
239
  const { el, scrollEl } = this;
122
- let timeout;
123
240
  let activeEl = this.activeItem;
124
241
  const scrollCallback = () => {
125
242
  raf(() => {
126
- if (!scrollEl)
243
+ /**
244
+ * This frame cannot be cancelled, and moving the column disconnects it
245
+ * without the observer reporting a change, so this checks live state.
246
+ */
247
+ if (!this.el.isConnected || !this.isColumnVisible || !scrollEl)
127
248
  return;
128
- if (timeout) {
129
- clearTimeout(timeout);
130
- timeout = undefined;
249
+ const { haltedAtScrollTop } = this;
250
+ if (haltedAtScrollTop !== undefined) {
251
+ /**
252
+ * Still at the halted position, so this frame is the halt landing
253
+ * rather than the wheel moving, and re-arming would start a second
254
+ * commit cycle.
255
+ */
256
+ if (Math.abs(scrollEl.scrollTop - haltedAtScrollTop) <= HALT_TOLERANCE)
257
+ return;
258
+ this.haltedAtScrollTop = undefined;
131
259
  }
260
+ // Armed before the early returns below, so a scroll never ends uncommitted.
261
+ this.resetScrollEndTimeout();
132
262
  if (!this.isScrolling) {
133
- enableHaptics && hapticSelectionStart();
263
+ this.enableHaptics && hapticSelectionStart();
134
264
  this.isScrolling = true;
135
265
  }
266
+ /**
267
+ * Only a user-driven scroll holds an uncommitted selection. Checked every
268
+ * frame because the user can take hold of the wheel mid-scroll, and
269
+ * re-adding the same listener is a no-op.
270
+ */
271
+ if (this.isUserScroll) {
272
+ this.watchForOutsidePress();
273
+ }
136
274
  /**
137
275
  * Select item in the center of the column
138
276
  * which is the month/year that we want to select
@@ -192,18 +330,23 @@ export class PickerColumn {
192
330
  newActiveElement = fallbackActiveElement;
193
331
  }
194
332
  }
195
- if (activeEl !== undefined) {
196
- this.setPickerItemActiveState(activeEl, false);
197
- }
333
+ /**
334
+ * A scroll can land with no selectable option centered, such as an
335
+ * overscroll bounce briefly centering the empty padding rows. Keep the
336
+ * current selection until an option is centered again.
337
+ */
198
338
  if (newActiveElement === undefined || newActiveElement.disabled) {
199
339
  return;
200
340
  }
341
+ if (activeEl !== undefined) {
342
+ this.setPickerItemActiveState(activeEl, false);
343
+ }
201
344
  /**
202
345
  * If we are selecting a new value,
203
346
  * we need to run haptics again.
204
347
  */
205
348
  if (newActiveElement !== activeEl) {
206
- enableHaptics && hapticSelectionChanged();
349
+ this.enableHaptics && hapticSelectionChanged();
207
350
  if (this.canExitInputMode) {
208
351
  /**
209
352
  * The native iOS wheel picker
@@ -235,32 +378,14 @@ export class PickerColumn {
235
378
  if (this.updateValueTextOnScroll) {
236
379
  this.assistiveFocusable?.setAttribute('aria-valuetext', this.getOptionValueText(newActiveElement));
237
380
  }
238
- timeout = setTimeout(() => {
239
- this.isScrolling = false;
240
- this.updateValueTextOnScroll = true;
241
- enableHaptics && hapticSelectionEnd();
242
- /**
243
- * Certain tasks (such as those that
244
- * cause re-renders) should only be done
245
- * once scrolling has finished, otherwise
246
- * flickering may occur.
247
- */
248
- const { scrollEndCallback } = this;
249
- if (scrollEndCallback) {
250
- scrollEndCallback();
251
- this.scrollEndCallback = undefined;
252
- }
253
- /**
254
- * Reset this flag as the
255
- * next scroll interaction could
256
- * be a scroll from the user. In this
257
- * case, we should exit input mode.
258
- */
259
- this.canExitInputMode = true;
260
- this.setValue(newActiveElement.value);
261
- }, 250);
381
+ this.centeredOption = newActiveElement;
262
382
  });
263
383
  };
384
+ const userScrollCallback = () => {
385
+ this.isUserScroll = true;
386
+ // Taking hold of the wheel ends the halt even if it has not moved yet.
387
+ this.haltedAtScrollTop = undefined;
388
+ };
264
389
  /**
265
390
  * Wrap this in an raf so that the scroll callback
266
391
  * does not fire when component is initially shown.
@@ -269,8 +394,19 @@ export class PickerColumn {
269
394
  if (!scrollEl)
270
395
  return;
271
396
  scrollEl.addEventListener('scroll', scrollCallback);
397
+ scrollEl.addEventListener('pointerdown', userScrollCallback);
398
+ scrollEl.addEventListener('wheel', userScrollCallback, { passive: true });
399
+ /**
400
+ * A `pointerdown` fires once per touch, so a drag that pauses long enough
401
+ * to commit would look like a scroll the column started. A `touchmove`
402
+ * keeps arriving while the finger moves.
403
+ */
404
+ scrollEl.addEventListener('touchmove', userScrollCallback, { passive: true });
272
405
  this.destroyScrollListener = () => {
273
406
  scrollEl.removeEventListener('scroll', scrollCallback);
407
+ scrollEl.removeEventListener('pointerdown', userScrollCallback);
408
+ scrollEl.removeEventListener('wheel', userScrollCallback);
409
+ scrollEl.removeEventListener('touchmove', userScrollCallback);
274
410
  };
275
411
  });
276
412
  };
@@ -455,6 +591,14 @@ export class PickerColumn {
455
591
  }
456
592
  else {
457
593
  this.isColumnVisible = false;
594
+ /**
595
+ * The pending timer still runs so it resets the scroll state, but the
596
+ * option it would have committed is dropped. A column the user cannot
597
+ * see should not change its value.
598
+ */
599
+ this.stopWatchingForOutsidePress();
600
+ this.centeredOption = undefined;
601
+ this.haltedAtScrollTop = undefined;
458
602
  if (this.destroyScrollListener) {
459
603
  this.destroyScrollListener();
460
604
  this.destroyScrollListener = undefined;
@@ -525,6 +669,13 @@ export class PickerColumn {
525
669
  connectedCallback() {
526
670
  this.ariaLabel = this.el.getAttribute('aria-label') ?? 'Select a value';
527
671
  }
672
+ disconnectedCallback() {
673
+ /**
674
+ * A pending settle would otherwise commit a value on a column that is no
675
+ * longer in the DOM.
676
+ */
677
+ this.discardScroll();
678
+ }
528
679
  get activeItem() {
529
680
  const { value } = this;
530
681
  const options = Array.from(this.el.querySelectorAll('ion-picker-column-option'));
@@ -542,14 +693,14 @@ export class PickerColumn {
542
693
  render() {
543
694
  const { color, disabled, isActive, numericInput } = this;
544
695
  const mode = getIonMode(this);
545
- return (h(Host, { key: '78b46ad10d88ea1bb43ca8c36748767912f03224', class: createColorClasses(color, {
696
+ return (h(Host, { key: '60a893619d0b01fba53fbccef67a10d533a22657', class: createColorClasses(color, {
546
697
  [mode]: true,
547
698
  ['picker-column-active']: isActive,
548
699
  ['picker-column-numeric-input']: numericInput,
549
700
  ['picker-column-disabled']: disabled,
550
- }) }, h("slot", { key: '761e501df77f7de896ffb3ebb99ebf88c5c3bf70', name: "prefix" }), h("div", { key: '9f4caaeef8ab704522a85f30876d371712f47c5c', class: "picker-opts", ref: (el) => {
701
+ }) }, h("slot", { key: '79f1e047f89c5ec916ed02efaac56ef3f73b8969', name: "prefix" }), h("div", { key: 'c45c86e88353a196ff38159f40f390bc27852c9e', class: "picker-opts", ref: (el) => {
551
702
  this.scrollEl = el;
552
- }, 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) }, h("div", { key: '9d3533436aba6c61c93f65f84a077fba832194a0', class: "picker-item-empty", "aria-hidden": "true" }, "\u00A0"), h("div", { key: '3f18d3a47361f06f55321b65fdf5742a61722b26', class: "picker-item-empty", "aria-hidden": "true" }, "\u00A0"), h("div", { key: 'eac0d20ab8c533ef829875e323e93e1ee2067d6d', class: "picker-item-empty", "aria-hidden": "true" }, "\u00A0"), h("slot", { key: '92e25989ef41cf6f910c73238e1a0a5ac03f1c1f' }), h("div", { key: '33a84644ebdc84108b44a8e3a129b54e824939c8', class: "picker-item-empty", "aria-hidden": "true" }, "\u00A0"), h("div", { key: '128ad61a3a68c7ff2d2e44a6e968424fcc608a15', class: "picker-item-empty", "aria-hidden": "true" }, "\u00A0"), h("div", { key: '6e4d59a4f75befcbbf47279a263f28a69b12dbbd', class: "picker-item-empty", "aria-hidden": "true" }, "\u00A0")), h("slot", { key: '3c6621b64438792a3024c90e3d9916a0a3614506', name: "suffix" })));
703
+ }, 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) }, h("div", { key: 'e02d76752f5d3dd4cd2846fbc28645f1508a4b49', class: "picker-item-empty", "aria-hidden": "true" }, "\u00A0"), h("div", { key: 'd577bcbadc530970b2781692b050811633625c5a', class: "picker-item-empty", "aria-hidden": "true" }, "\u00A0"), h("div", { key: 'c89e78c3a896bc1f55b922d01df16fdbb1259bdd', class: "picker-item-empty", "aria-hidden": "true" }, "\u00A0"), h("slot", { key: '6c597ff899692597432ee2aa0b42de53b86deed4' }), h("div", { key: '91686ed94f14c47647836ed4d63e54b5c54ee3b9', class: "picker-item-empty", "aria-hidden": "true" }, "\u00A0"), h("div", { key: '2ff058c6d0e8cef4e143c2d848f9a52684579af1', class: "picker-item-empty", "aria-hidden": "true" }, "\u00A0"), h("div", { key: 'bc7386bec6fced36e44084a7a137b3fe6506c996', class: "picker-item-empty", "aria-hidden": "true" }, "\u00A0")), h("slot", { key: '8835fd3f4e025bce964e6f05984c9aaadc20d7fb', name: "suffix" })));
553
704
  }
554
705
  static get is() { return "ion-picker-column"; }
555
706
  static get encapsulation() { return "shadow"; }
@@ -773,3 +924,16 @@ export class PickerColumn {
773
924
  }
774
925
  }
775
926
  const PICKER_ITEM_ACTIVE_CLASS = 'option-active';
927
+ /**
928
+ * How long the column must be idle before the centered option is treated as
929
+ * the user's selection. Replaceable by the `scrollend` event once that is
930
+ * supported everywhere (https://caniuse.com/?search=scrollend).
931
+ */
932
+ const SCROLL_END_DELAY = 250;
933
+ /**
934
+ * How far, in pixels, the column may report from where it was halted and still
935
+ * count as having stayed there. Centering targets a position between two snap
936
+ * points, so mandatory snapping corrects it by half the column height less
937
+ * three option heights: 2px at the default sizes.
938
+ */
939
+ const HALT_TOLERANCE = 2;
@@ -58,11 +58,6 @@ export class SegmentButton {
58
58
  addEventListener(segmentEl, 'ionSelect', this.updateState);
59
59
  addEventListener(segmentEl, 'ionStyle', this.updateStyle);
60
60
  }
61
- // Prevent buttons from being disabled when associated with segment content
62
- if (this.contentId && this.disabled) {
63
- printIonWarning(`[ion-segment-button] - Segment buttons cannot be disabled when associated with an <ion-segment-content>.`);
64
- this.disabled = false;
65
- }
66
61
  }
67
62
  disconnectedCallback() {
68
63
  const segmentEl = this.segmentEl;
@@ -79,6 +74,15 @@ export class SegmentButton {
79
74
  // Return if there is no contentId defined
80
75
  if (!this.contentId)
81
76
  return;
77
+ /**
78
+ * Checked here rather than in `connectedCallback` so frameworks that assign element
79
+ * props after inserting the element have set `disabled` by now. A disabled ion-segment
80
+ * pushes that onto its buttons too, which this guard should not undo.
81
+ */
82
+ if (this.disabled && this.segmentEl?.disabled !== true) {
83
+ printIonWarning(`[ion-segment-button] - Segment buttons cannot be disabled when associated with an <ion-segment-content>.`);
84
+ this.disabled = false;
85
+ }
82
86
  // Attempt to find the Segment Content by its contentId
83
87
  const segmentContent = document.getElementById(this.contentId);
84
88
  // If no associated Segment Content exists, log an error and return
@@ -113,7 +117,7 @@ export class SegmentButton {
113
117
  const { checked, type, disabled, hasIcon, hasLabel, layout, segmentEl } = this;
114
118
  const mode = getIonMode(this);
115
119
  const hasSegmentColor = () => segmentEl?.color !== undefined;
116
- return (h(Host, { key: '2b4b7ad8b981d2ee39aba5b9c734de8a5bd045ba', class: {
120
+ return (h(Host, { key: 'd8acc71d87e26b32f20b2d0f9a6acc9f0dab0dee', class: {
117
121
  [mode]: true,
118
122
  'in-toolbar': hostContext('ion-toolbar', this.el),
119
123
  'in-toolbar-color': hostContext('ion-toolbar[color]', this.el),
@@ -129,7 +133,7 @@ export class SegmentButton {
129
133
  'ion-activatable': true,
130
134
  'ion-activatable-instant': true,
131
135
  'ion-focusable': true,
132
- } }, h("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 }, h("span", { key: '6443551951ce589efdb2d0e1fd1a14e35b82ed19', class: "button-inner" }, h("slot", { key: 'c3548b469ae6e5477d8372cb28bc70dff3a24d18' })), mode === 'md' && h("ion-ripple-effect", { key: 'fb176415ca1702766c4d7a5964ec0bb467bdcb55' })), h("div", { key: 'aa22b4752f8336d0e232a1e0894e87023b284a08', part: "indicator", class: "segment-button-indicator segment-button-indicator-animated" }, h("div", { key: '61e29ea52048fa0583fce6c20c81614a4d0199cb', part: "indicator-background", class: "segment-button-indicator-background" }))));
136
+ } }, h("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 }, h("span", { key: '6c4b4dcd20e407e5dc31674bea23633d8a09187a', class: "button-inner" }, h("slot", { key: '817145ae77a3c5ada88ab95723d881f1bde96b2a' })), mode === 'md' && h("ion-ripple-effect", { key: '054d7e5e2a13013914fac6bbde8efdb28d9b459e' })), h("div", { key: 'c48074881a302510ad4752eeb9383222cd3a54cb', part: "indicator", class: "segment-button-indicator segment-button-indicator-animated" }, h("div", { key: '7672a6b10ee18ad026b798fbd8207dc3cd5683f9', part: "indicator-background", class: "segment-button-indicator-background" }))));
133
137
  }
134
138
  static get is() { return "ion-segment-button"; }
135
139
  static get encapsulation() { return "shadow"; }