@ionic/core 9.0.0 → 9.0.1-dev.11787248963.10a00c73

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 (596) 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-63OhffQv.js → p-66ogmUZU.js} +1 -1
  99. package/components/p-6Vp915Y7.js +4 -0
  100. package/components/p-7PNwKFZi.js +4 -0
  101. package/components/{p-G0TxqHfe.js → p-A8MJRBIY.js} +1 -1
  102. package/components/p-AQcCdH2_.js +4 -0
  103. package/{dist/ionic/p-Dn0mqQ_R.js → components/p-B6x5_b9w.js} +1 -1
  104. package/components/p-B8MQjdvk.js +4 -0
  105. package/components/p-BA_4ZIEg.js +4 -0
  106. package/components/p-BFtL8t1r.js +4 -0
  107. package/components/{p-DaA_8eqt.js → p-BMfgF-Tv.js} +1 -1
  108. package/components/p-BPDxVIRr.js +4 -0
  109. package/components/p-BSARlp49.js +4 -0
  110. package/components/p-B_gJaBk0.js +4 -0
  111. package/components/p-BdwCtX8Y.js +4 -0
  112. package/components/p-Bg4OwDwb.js +4 -0
  113. package/components/{p-DV85C0e0.js → p-BgUIV8NQ.js} +1 -1
  114. package/components/p-Bnc0m4SW.js +4 -0
  115. package/components/p-BpLt_Ptn.js +4 -0
  116. package/components/p-BqBDq1Ma.js +4 -0
  117. package/components/{p-C_phlPMC.js → p-BrFaQbGY.js} +1 -1
  118. package/{dist/ionic/p-Cdjxf_yg.js → components/p-BuPAFTWI.js} +1 -1
  119. package/components/p-Bx2saTHs.js +4 -0
  120. package/components/p-BxhE2W85.js +4 -0
  121. package/components/p-CHswSpKy.js +4 -0
  122. package/components/{p-fruGqVHh.js → p-CQAjyETU.js} +1 -1
  123. package/components/{p-1jI5oW-W.js → p-CR9OgE6N.js} +1 -1
  124. package/components/p-CWETxTjE.js +4 -0
  125. package/components/p-CaZeZIL2.js +4 -0
  126. package/components/p-CaiZOhfC.js +4 -0
  127. package/components/p-CgvDC7hC.js +4 -0
  128. package/components/{p-BqPNzJf6.js → p-CqyGR9Aq.js} +1 -1
  129. package/components/{p-UIBJkZf8.js → p-D0YpjgON.js} +1 -1
  130. package/components/p-D7ysFE2B.js +4 -0
  131. package/{dist/ionic/p-4eOQC00Z.js → components/p-DCWfzDM8.js} +1 -1
  132. package/components/{p-DwpKZ6rl.js → p-DDdkefwf.js} +1 -1
  133. package/components/{p-DzRT60Tw.js → p-DEW7CnUc.js} +1 -1
  134. package/components/p-DQ1IPvZO.js +4 -0
  135. package/components/p-DcOH6-o5.js +4 -0
  136. package/components/{p-DD5fQ4EQ.js → p-DfdYCsov.js} +1 -1
  137. package/components/{p-DSzSbVP2.js → p-DhOoEIAs.js} +1 -1
  138. package/components/{p-DM-PrAoh.js → p-Dl_7b_UJ.js} +1 -1
  139. package/components/p-DqAI6tg7.js +4 -0
  140. package/components/p-DrehWDfv.js +4 -0
  141. package/components/{p-ryyf_ItD.js → p-DysqCsJu.js} +1 -1
  142. package/components/p-H1f2qsk4.js +4 -0
  143. package/components/p-HVYBAhFx.js +4 -0
  144. package/components/{p-CbhUdtjf.js → p-Kmrg3Fed.js} +1 -1
  145. package/components/{p-Bjig0DJK.js → p-RFfE9hF6.js} +1 -1
  146. package/{dist/ionic/p-CBWAXjA5.js → components/p-SR-LLqp_.js} +1 -1
  147. package/components/p-eFI3mtEX.js +4 -0
  148. package/components/p-gFwXiYC_.js +4 -0
  149. package/components/p-tX3UxCnU.js +4 -0
  150. package/components/p-v2NpoOHp.js +4 -0
  151. package/dist/cjs/{animation-C0mOHzej.js → animation-D-OqR4a4.js} +1 -1
  152. package/dist/cjs/{app-globals-BREG4twP.js → app-globals-BzgwARwJ.js} +1 -1
  153. package/dist/cjs/{button-active-CVMevT9a.js → button-active-BlWSD7uK.js} +2 -2
  154. package/dist/cjs/{format-pp0Du3K-.js → format-D7ig6Vm0.js} +1 -1
  155. package/dist/cjs/{framework-delegate-Dfo5XsGv.js → framework-delegate-BZUx4TnE.js} +1 -1
  156. package/dist/cjs/{gesture-controller-BDUH7687.js → gesture-controller-CeJslptU.js} +6 -14
  157. package/dist/cjs/{hardware-back-button-fqpYh-kd.js → hardware-back-button-JOAEFSzc.js} +1 -1
  158. package/dist/cjs/{helpers-YPQybDph.js → helpers-Dj5o76mq.js} +1 -1
  159. package/dist/cjs/{index-BLdJCcJY.js → index-2sO-zkZ2.js} +4 -4
  160. package/dist/cjs/{index-uvry__L4.js → index-BrVMoqUk.js} +3 -1
  161. package/dist/cjs/{index-zVCah4Uz.js → index-C8zH6b3d.js} +2 -2
  162. package/dist/cjs/{index-DXsPSne6.js → index-CZ6vzt_q.js} +5 -5
  163. package/dist/cjs/{index-DDg31ZF5.js → index-Csue6G3m.js} +2 -2
  164. package/dist/cjs/{index-DwlRtFZe.js → index-DRPqwSvU.js} +1 -1
  165. package/dist/cjs/{index-B7zJsYWS.js → index-EJLjthTK.js} +1 -2
  166. package/dist/cjs/index.cjs.js +14 -14
  167. package/dist/cjs/{input-shims-Cbu1fcye.js → input-shims-Bh7bnt2v.js} +3 -3
  168. package/dist/cjs/{input.utils-BZdMWVrt.js → input.utils-Cq3g9uHy.js} +1 -1
  169. package/dist/cjs/ion-accordion_2.cjs.entry.js +335 -364
  170. package/dist/cjs/ion-action-sheet.cjs.entry.js +60 -140
  171. package/dist/cjs/ion-alert.cjs.entry.js +67 -159
  172. package/dist/cjs/ion-app_8.cjs.entry.js +163 -258
  173. package/dist/cjs/ion-avatar_3.cjs.entry.js +2 -8
  174. package/dist/cjs/ion-back-button.cjs.entry.js +21 -45
  175. package/dist/cjs/ion-backdrop.cjs.entry.js +14 -18
  176. package/dist/cjs/ion-breadcrumb_2.cjs.entry.js +117 -195
  177. package/dist/cjs/ion-button_2.cjs.entry.js +61 -130
  178. package/dist/cjs/ion-card_5.cjs.entry.js +28 -80
  179. package/dist/cjs/ion-checkbox.cjs.entry.js +98 -147
  180. package/dist/cjs/ion-chip.cjs.entry.js +10 -16
  181. package/dist/cjs/ion-col_3.cjs.entry.js +6 -126
  182. package/dist/cjs/ion-datetime-button.cjs.entry.js +232 -248
  183. package/dist/cjs/ion-datetime.cjs.entry.js +775 -953
  184. package/dist/cjs/ion-fab_3.cjs.entry.js +78 -136
  185. package/dist/cjs/ion-img.cjs.entry.js +11 -31
  186. package/dist/cjs/ion-infinite-scroll_2.cjs.entry.js +71 -98
  187. package/dist/cjs/ion-input-otp.cjs.entry.js +352 -424
  188. package/dist/cjs/ion-input-password-toggle.cjs.entry.js +14 -29
  189. package/dist/cjs/ion-input.cjs.entry.js +158 -302
  190. package/dist/cjs/ion-item-option_3.cjs.entry.js +54 -98
  191. package/dist/cjs/ion-item_8.cjs.entry.js +61 -157
  192. package/dist/cjs/ion-loading.cjs.entry.js +54 -131
  193. package/dist/cjs/ion-menu_3.cjs.entry.js +94 -158
  194. package/dist/cjs/ion-modal.cjs.entry.js +206 -362
  195. package/dist/cjs/ion-nav_2.cjs.entry.js +26 -78
  196. package/dist/cjs/ion-picker-column-option.cjs.entry.js +23 -33
  197. package/dist/cjs/ion-picker-column.cjs.entry.js +389 -410
  198. package/dist/cjs/ion-picker.cjs.entry.js +390 -400
  199. package/dist/cjs/ion-popover.cjs.entry.js +184 -292
  200. package/dist/cjs/ion-progress-bar.cjs.entry.js +23 -29
  201. package/dist/cjs/ion-radio_2.cjs.entry.js +128 -201
  202. package/dist/cjs/ion-range.cjs.entry.js +223 -293
  203. package/dist/cjs/ion-refresher_2.cjs.entry.js +89 -154
  204. package/dist/cjs/ion-reorder_2.cjs.entry.js +19 -49
  205. package/dist/cjs/ion-ripple-effect.cjs.entry.js +13 -13
  206. package/dist/cjs/ion-route_4.cjs.entry.js +45 -144
  207. package/dist/cjs/ion-searchbar.cjs.entry.js +182 -268
  208. package/dist/cjs/ion-segment-content.cjs.entry.js +1 -1
  209. package/dist/cjs/ion-segment-view.cjs.entry.js +12 -24
  210. package/dist/cjs/ion-segment_2.cjs.entry.js +122 -161
  211. package/dist/cjs/ion-select-modal.cjs.entry.js +19 -21
  212. package/dist/cjs/ion-select_3.cjs.entry.js +151 -319
  213. package/dist/cjs/ion-spinner.cjs.entry.js +6 -21
  214. package/dist/cjs/ion-split-pane.cjs.entry.js +14 -27
  215. package/dist/cjs/ion-tab-bar_2.cjs.entry.js +32 -89
  216. package/dist/cjs/ion-tab_2.cjs.entry.js +22 -49
  217. package/dist/cjs/ion-text.cjs.entry.js +2 -8
  218. package/dist/cjs/ion-textarea.cjs.entry.js +139 -256
  219. package/dist/cjs/ion-toast.cjs.entry.js +106 -221
  220. package/dist/cjs/ion-toggle.cjs.entry.js +114 -165
  221. package/dist/cjs/{ionic-global-k6hOWWpn.js → ionic-global-DvgIzM2F.js} +1 -1
  222. package/dist/cjs/ionic.cjs.js +4 -4
  223. package/dist/cjs/{ios.transition-zTmJz8T-.js → ios.transition-zIgdoSYe.js} +4 -4
  224. package/dist/cjs/{item-multiple-inputs-BdYSbfKN.js → item-multiple-inputs-DG-ZGm6j.js} +1 -1
  225. package/dist/cjs/loader.cjs.js +4 -4
  226. package/dist/cjs/{md.transition-nb_4pUXu.js → md.transition-CXeJ9rfh.js} +4 -4
  227. package/dist/cjs/{overlays-KaNVDNqC.js → overlays-Bg0auTQa.js} +6 -6
  228. package/dist/cjs/{select-option-render-pULCGldr.js → select-option-render-7m1WdFzF.js} +2 -2
  229. package/dist/cjs/{slot-mutation-controller-DPHmqXdV.js → slot-mutation-controller-BJEJzx_e.js} +1 -1
  230. package/dist/cjs/{status-tap-o9IIymsP.js → status-tap-DxbUM5XX.js} +3 -3
  231. package/dist/cjs/{swipe-back-B7X9VOlH.js → swipe-back-F_DBt-Aw.js} +4 -4
  232. package/dist/collection/components/accordion/accordion.js +310 -314
  233. package/dist/collection/components/accordion-group/accordion-group.js +23 -46
  234. package/dist/collection/components/action-sheet/action-sheet.js +49 -128
  235. package/dist/collection/components/action-sheet/test/basic/fixture.js +0 -3
  236. package/dist/collection/components/alert/alert.js +56 -147
  237. package/dist/collection/components/app/app.js +0 -3
  238. package/dist/collection/components/back-button/back-button.js +19 -42
  239. package/dist/collection/components/backdrop/backdrop.js +14 -16
  240. package/dist/collection/components/badge/badge.js +0 -6
  241. package/dist/collection/components/breadcrumb/breadcrumb.js +29 -90
  242. package/dist/collection/components/breadcrumbs/breadcrumbs.js +87 -102
  243. package/dist/collection/components/button/button.js +59 -127
  244. package/dist/collection/components/buttons/buttons.js +15 -13
  245. package/dist/collection/components/card/card.js +20 -53
  246. package/dist/collection/components/card-header/card-header.js +8 -12
  247. package/dist/collection/components/card-subtitle/card-subtitle.js +0 -6
  248. package/dist/collection/components/card-title/card-title.js +0 -6
  249. package/dist/collection/components/checkbox/checkbox.js +95 -143
  250. package/dist/collection/components/chip/chip.js +10 -14
  251. package/dist/collection/components/col/col.js +0 -120
  252. package/dist/collection/components/content/content.js +60 -90
  253. package/dist/collection/components/datetime/datetime.js +762 -939
  254. package/dist/collection/components/datetime-button/datetime-button.js +229 -244
  255. package/dist/collection/components/fab/fab.js +13 -20
  256. package/dist/collection/components/fab-button/fab-button.js +54 -103
  257. package/dist/collection/components/fab-list/fab-list.js +11 -10
  258. package/dist/collection/components/footer/footer.js +43 -49
  259. package/dist/collection/components/grid/grid.js +6 -4
  260. package/dist/collection/components/header/header.js +23 -33
  261. package/dist/collection/components/img/img.js +9 -28
  262. package/dist/collection/components/infinite-scroll/infinite-scroll.js +66 -73
  263. package/dist/collection/components/infinite-scroll-content/infinite-scroll-content.js +3 -20
  264. package/dist/collection/components/input/input.js +154 -297
  265. package/dist/collection/components/input-otp/input-otp.js +350 -421
  266. package/dist/collection/components/input-password-toggle/input-password-toggle.js +13 -27
  267. package/dist/collection/components/item/item.js +37 -80
  268. package/dist/collection/components/item-divider/item-divider.js +10 -15
  269. package/dist/collection/components/item-option/item-option.js +20 -48
  270. package/dist/collection/components/item-options/item-options.js +7 -10
  271. package/dist/collection/components/item-sliding/item-sliding.js +26 -36
  272. package/dist/collection/components/label/label.js +4 -24
  273. package/dist/collection/components/list/list.js +6 -9
  274. package/dist/collection/components/list-header/list-header.js +0 -10
  275. package/dist/collection/components/loading/loading.js +46 -122
  276. package/dist/collection/components/menu/menu.js +55 -99
  277. package/dist/collection/components/menu-button/menu-button.js +19 -28
  278. package/dist/collection/components/menu-toggle/menu-toggle.js +13 -20
  279. package/dist/collection/components/modal/modal.js +196 -351
  280. package/dist/collection/components/modal/test/fixtures.js +0 -3
  281. package/dist/collection/components/nav/nav.js +12 -45
  282. package/dist/collection/components/nav/view-controller.js +1 -7
  283. package/dist/collection/components/nav-link/nav-link.js +9 -20
  284. package/dist/collection/components/note/note.js +0 -6
  285. package/dist/collection/components/picker/picker.js +388 -397
  286. package/dist/collection/components/picker-column/picker-column.js +389 -409
  287. package/dist/collection/components/picker-column-option/picker-column-option.js +21 -30
  288. package/dist/collection/components/popover/popover.js +176 -283
  289. package/dist/collection/components/popover/test/fixture.js +0 -1
  290. package/dist/collection/components/progress-bar/progress-bar.js +22 -26
  291. package/dist/collection/components/radio/radio.js +62 -98
  292. package/dist/collection/components/radio-group/radio-group.js +64 -99
  293. package/dist/collection/components/radio-group/test/fixtures.js +0 -2
  294. package/dist/collection/components/range/range.js +220 -289
  295. package/dist/collection/components/refresher/refresher.js +79 -105
  296. package/dist/collection/components/refresher-content/refresher-content.js +3 -40
  297. package/dist/collection/components/reorder/reorder.js +0 -1
  298. package/dist/collection/components/reorder-group/reorder-group.js +14 -43
  299. package/dist/collection/components/ripple-effect/ripple-effect.js +12 -11
  300. package/dist/collection/components/route/route.js +9 -38
  301. package/dist/collection/components/route-redirect/route-redirect.js +0 -31
  302. package/dist/collection/components/router/router.js +27 -35
  303. package/dist/collection/components/router/utils/matching.js +0 -1
  304. package/dist/collection/components/router-link/router-link.js +10 -35
  305. package/dist/collection/components/router-outlet/router-outlet.js +12 -34
  306. package/dist/collection/components/searchbar/searchbar.js +180 -265
  307. package/dist/collection/components/segment/segment.js +76 -113
  308. package/dist/collection/components/segment-button/segment-button.js +44 -44
  309. package/dist/collection/components/segment-view/segment-view.js +12 -23
  310. package/dist/collection/components/select/select.js +127 -240
  311. package/dist/collection/components/select-modal/select-modal.js +11 -12
  312. package/dist/collection/components/select-modal/test/fixtures.js +1 -8
  313. package/dist/collection/components/select-option/select-option.js +7 -44
  314. package/dist/collection/components/select-popover/select-popover.js +10 -25
  315. package/dist/collection/components/select-popover/test/fixtures.js +1 -8
  316. package/dist/collection/components/skeleton-text/skeleton-text.js +6 -10
  317. package/dist/collection/components/spinner/spinner.js +6 -19
  318. package/dist/collection/components/split-pane/split-pane.js +13 -25
  319. package/dist/collection/components/tab/tab.js +4 -15
  320. package/dist/collection/components/tab-bar/tab-bar.js +12 -30
  321. package/dist/collection/components/tab-button/tab-button.js +19 -56
  322. package/dist/collection/components/tabs/tabs.js +17 -31
  323. package/dist/collection/components/text/text.js +0 -6
  324. package/dist/collection/components/textarea/textarea.js +135 -251
  325. package/dist/collection/components/title/title.js +0 -16
  326. package/dist/collection/components/toast/toast.js +97 -211
  327. package/dist/collection/components/toggle/toggle.js +111 -161
  328. package/dist/collection/components/toolbar/toolbar.js +3 -8
  329. package/dist/collection/global/config.js +3 -1
  330. package/dist/collection/utils/gesture/gesture-controller.js +6 -14
  331. package/dist/collection/utils/sanitization/index.js +0 -1
  332. package/dist/collection/utils/test/late-props/late-props.js +69 -0
  333. package/dist/collection/utils/test/playwright/page/event-spy.js +8 -9
  334. package/dist/collection/utils/test/press-keys.js +1 -4
  335. package/dist/docs.json +1 -1
  336. package/dist/esm/{animation-CGFdmGk9.js → animation-TxGPYeDn.js} +1 -1
  337. package/dist/esm/{app-globals-CYmMeGdU.js → app-globals-Do8rJest.js} +1 -1
  338. package/dist/esm/{button-active-BDOsVAiZ.js → button-active-ChA4D-ml.js} +2 -2
  339. package/dist/esm/{format-Dcwga61t.js → format-CVk5e_GP.js} +2 -2
  340. package/dist/esm/{framework-delegate-BHTU2Ip9.js → framework-delegate-DaLWnISz.js} +1 -1
  341. package/dist/esm/{gesture-controller-TXPDHL13.js → gesture-controller-B_gJaBk0.js} +6 -14
  342. package/dist/esm/{hardware-back-button-gLJHMX_F.js → hardware-back-button-D8W4L0JP.js} +1 -1
  343. package/dist/esm/{helpers-CAGf8Wgp.js → helpers-BIgoInJU.js} +1 -1
  344. package/dist/esm/{index-DcPaH5uL.js → index-BmLuEdV7.js} +1 -1
  345. package/dist/esm/{index-T0JxBI8V.js → index-BmOR8tCv.js} +2 -2
  346. package/dist/esm/{index-CqneaaGd.js → index-C5ZdL0qp.js} +5 -5
  347. package/dist/esm/{index-WlteAIqz.js → index-C8Dsa6li.js} +4 -4
  348. package/dist/esm/{index-ChhhtsGZ.js → index-CKYcsw8f.js} +3 -1
  349. package/dist/esm/{index-Clc-28O1.js → index-DHw2lZxe.js} +2 -2
  350. package/dist/esm/{index-CKM1DdGm.js → index-elneMH8y.js} +1 -2
  351. package/dist/esm/index.js +14 -14
  352. package/dist/esm/{input-shims-B8sfni1e.js → input-shims-09NN97kF.js} +3 -3
  353. package/dist/esm/{input.utils-B1ValN_N.js → input.utils-BxyH9l1w.js} +1 -1
  354. package/dist/esm/ion-accordion_2.entry.js +335 -364
  355. package/dist/esm/ion-action-sheet.entry.js +60 -140
  356. package/dist/esm/ion-alert.entry.js +67 -159
  357. package/dist/esm/ion-app_8.entry.js +163 -258
  358. package/dist/esm/ion-avatar_3.entry.js +2 -8
  359. package/dist/esm/ion-back-button.entry.js +21 -45
  360. package/dist/esm/ion-backdrop.entry.js +14 -18
  361. package/dist/esm/ion-breadcrumb_2.entry.js +117 -195
  362. package/dist/esm/ion-button_2.entry.js +61 -130
  363. package/dist/esm/ion-card_5.entry.js +28 -80
  364. package/dist/esm/ion-checkbox.entry.js +98 -147
  365. package/dist/esm/ion-chip.entry.js +10 -16
  366. package/dist/esm/ion-col_3.entry.js +6 -126
  367. package/dist/esm/ion-datetime-button.entry.js +232 -248
  368. package/dist/esm/ion-datetime.entry.js +775 -953
  369. package/dist/esm/ion-fab_3.entry.js +78 -136
  370. package/dist/esm/ion-img.entry.js +11 -31
  371. package/dist/esm/ion-infinite-scroll_2.entry.js +71 -98
  372. package/dist/esm/ion-input-otp.entry.js +352 -424
  373. package/dist/esm/ion-input-password-toggle.entry.js +14 -29
  374. package/dist/esm/ion-input.entry.js +158 -302
  375. package/dist/esm/ion-item-option_3.entry.js +54 -98
  376. package/dist/esm/ion-item_8.entry.js +61 -157
  377. package/dist/esm/ion-loading.entry.js +54 -131
  378. package/dist/esm/ion-menu_3.entry.js +94 -158
  379. package/dist/esm/ion-modal.entry.js +206 -362
  380. package/dist/esm/ion-nav_2.entry.js +26 -78
  381. package/dist/esm/ion-picker-column-option.entry.js +23 -33
  382. package/dist/esm/ion-picker-column.entry.js +389 -410
  383. package/dist/esm/ion-picker.entry.js +390 -400
  384. package/dist/esm/ion-popover.entry.js +184 -292
  385. package/dist/esm/ion-progress-bar.entry.js +23 -29
  386. package/dist/esm/ion-radio_2.entry.js +128 -201
  387. package/dist/esm/ion-range.entry.js +223 -293
  388. package/dist/esm/ion-refresher_2.entry.js +89 -154
  389. package/dist/esm/ion-reorder_2.entry.js +19 -49
  390. package/dist/esm/ion-ripple-effect.entry.js +13 -13
  391. package/dist/esm/ion-route_4.entry.js +45 -144
  392. package/dist/esm/ion-searchbar.entry.js +182 -268
  393. package/dist/esm/ion-segment-content.entry.js +1 -1
  394. package/dist/esm/ion-segment-view.entry.js +12 -24
  395. package/dist/esm/ion-segment_2.entry.js +122 -161
  396. package/dist/esm/ion-select-modal.entry.js +19 -21
  397. package/dist/esm/ion-select_3.entry.js +151 -319
  398. package/dist/esm/ion-spinner.entry.js +6 -21
  399. package/dist/esm/ion-split-pane.entry.js +14 -27
  400. package/dist/esm/ion-tab-bar_2.entry.js +32 -89
  401. package/dist/esm/ion-tab_2.entry.js +22 -49
  402. package/dist/esm/ion-text.entry.js +2 -8
  403. package/dist/esm/ion-textarea.entry.js +139 -256
  404. package/dist/esm/ion-toast.entry.js +106 -221
  405. package/dist/esm/ion-toggle.entry.js +114 -165
  406. package/dist/esm/{ionic-global-BVB7BrLT.js → ionic-global-lrowsHfi.js} +1 -1
  407. package/dist/esm/ionic.js +5 -5
  408. package/dist/esm/{ios.transition-DXRCmcbC.js → ios.transition-BQhADrk1.js} +4 -4
  409. package/dist/esm/{item-multiple-inputs-rU8VaNNg.js → item-multiple-inputs-D_N3fDkD.js} +1 -1
  410. package/dist/esm/loader.js +5 -5
  411. package/dist/esm/{md.transition-BMngO4i_.js → md.transition-D58NpmRa.js} +4 -4
  412. package/dist/esm/{overlays-CPmIs9Ls.js → overlays-BpnIFlXI.js} +6 -6
  413. package/dist/esm/{select-option-render-C4m76VGH.js → select-option-render-lIuu64EV.js} +2 -2
  414. package/dist/esm/{slot-mutation-controller-DiE_C9un.js → slot-mutation-controller-rS_T3FDR.js} +1 -1
  415. package/dist/esm/{status-tap-CHB7KwIb.js → status-tap-CpFQMLl6.js} +3 -3
  416. package/dist/esm/{swipe-back-C9HW1bug.js → swipe-back-rmc7zeNW.js} +4 -4
  417. package/dist/ionic/index.esm.js +1 -1
  418. package/dist/ionic/ionic.esm.js +1 -1
  419. package/dist/ionic/p-05800a02.entry.js +4 -0
  420. package/dist/ionic/p-0eb50dca.entry.js +4 -0
  421. package/dist/ionic/p-16e9f542.entry.js +4 -0
  422. package/dist/ionic/p-18d532a3.entry.js +4 -0
  423. package/dist/ionic/p-1db2afb4.entry.js +4 -0
  424. package/dist/ionic/p-1df75f9e.entry.js +4 -0
  425. package/dist/ionic/p-295ff427.entry.js +4 -0
  426. package/dist/ionic/p-34b9379b.entry.js +4 -0
  427. package/dist/ionic/p-39a8d4e0.entry.js +4 -0
  428. package/dist/ionic/p-4437015c.entry.js +4 -0
  429. package/dist/ionic/p-478035a7.entry.js +4 -0
  430. package/dist/ionic/p-485fb218.entry.js +4 -0
  431. package/dist/ionic/p-48c859fe.entry.js +4 -0
  432. package/dist/ionic/p-49b9d405.entry.js +4 -0
  433. package/dist/ionic/p-56307aea.entry.js +4 -0
  434. package/dist/ionic/p-5b906fd6.entry.js +4 -0
  435. package/dist/ionic/p-5ee2d7b1.entry.js +4 -0
  436. package/dist/ionic/p-5f216b79.entry.js +4 -0
  437. package/dist/ionic/p-61c799d1.entry.js +4 -0
  438. package/dist/ionic/p-63bbba8d.entry.js +4 -0
  439. package/dist/ionic/p-68507e70.entry.js +4 -0
  440. package/dist/ionic/{p-ded69ceb.entry.js → p-6f048604.entry.js} +1 -1
  441. package/dist/ionic/p-70ee8888.entry.js +4 -0
  442. package/dist/ionic/p-72ad7c64.entry.js +4 -0
  443. package/dist/ionic/p-75887ee0.entry.js +4 -0
  444. package/dist/ionic/p-873a315a.entry.js +4 -0
  445. package/dist/ionic/p-881b6954.entry.js +4 -0
  446. package/dist/ionic/p-886d9e66.entry.js +4 -0
  447. package/dist/ionic/p-8dd4c026.entry.js +4 -0
  448. package/dist/ionic/p-8e007f11.entry.js +4 -0
  449. package/dist/ionic/p-8f51110d.entry.js +4 -0
  450. package/dist/ionic/p-90ba736e.entry.js +4 -0
  451. package/dist/ionic/p-959df5f8.entry.js +4 -0
  452. package/dist/ionic/p-9e455875.entry.js +4 -0
  453. package/dist/ionic/{p-CBR_W98Z.js → p-9wczfs_v.js} +1 -1
  454. package/dist/ionic/p-B1Y7LZhV.js +4 -0
  455. package/dist/ionic/p-B5RyLYvl.js +4 -0
  456. package/dist/ionic/{p-CPcPmkGv.js → p-BQv5i5Kf.js} +1 -1
  457. package/{components/p-8FN7p701.js → dist/ionic/p-BZVE25Gu.js} +1 -1
  458. package/{components/p-DFvZn99E.js → dist/ionic/p-BZxjcGRP.js} +1 -1
  459. package/dist/ionic/p-B_gJaBk0.js +4 -0
  460. package/dist/ionic/p-BnGA34Pd.js +4 -0
  461. package/dist/ionic/p-ByLaqOPm.js +4 -0
  462. package/dist/ionic/p-C06QNN45.js +4 -0
  463. package/dist/ionic/p-C4IBDDj6.js +4 -0
  464. package/dist/ionic/p-CCVlNZ__.js +4 -0
  465. package/dist/ionic/{p-CMRtMbJc.js → p-CDBop-kz.js} +1 -1
  466. package/dist/ionic/p-CKYcsw8f.js +5 -0
  467. package/dist/ionic/p-CazSodad.js +4 -0
  468. package/{components/p-ia3IDdJS.js → dist/ionic/p-ClrlQU2y.js} +1 -1
  469. package/dist/ionic/{p-UIBJkZf8.js → p-D0YpjgON.js} +1 -1
  470. package/dist/ionic/p-D0dfUysx.js +4 -0
  471. package/dist/ionic/{p-BB0LlG4y.js → p-D9yvytgv.js} +1 -1
  472. package/{components/p-C5KYjZWD.js → dist/ionic/p-DF_Uqql8.js} +1 -1
  473. package/dist/ionic/{p-BYEAtHr-.js → p-DXJgZWgi.js} +1 -1
  474. package/dist/ionic/{p-D94_RztK.js → p-DdhHqKj-.js} +1 -1
  475. package/dist/ionic/p-De0eY881.js +4 -0
  476. package/dist/ionic/p-DgUL3JbO.js +4 -0
  477. package/dist/ionic/{p-7CBuOvEo.js → p-RzUn7cKs.js} +1 -1
  478. package/dist/ionic/p-VquyMbjp.js +4 -0
  479. package/dist/ionic/p-a0fee899.entry.js +4 -0
  480. package/dist/ionic/p-a54bcd16.entry.js +4 -0
  481. package/dist/ionic/p-aebc4d69.entry.js +4 -0
  482. package/dist/ionic/p-b5f37106.entry.js +4 -0
  483. package/dist/ionic/{p-40424a88.entry.js → p-b62bfce8.entry.js} +1 -1
  484. package/dist/ionic/p-b7a11b58.entry.js +4 -0
  485. package/dist/ionic/p-bbf6878c.entry.js +4 -0
  486. package/dist/ionic/p-c49165af.entry.js +4 -0
  487. package/dist/ionic/p-cad4eccf.entry.js +4 -0
  488. package/dist/ionic/p-cdc5115e.entry.js +4 -0
  489. package/dist/ionic/p-d3384a40.entry.js +4 -0
  490. package/dist/ionic/p-d8bae128.entry.js +4 -0
  491. package/dist/ionic/p-d8deff43.entry.js +4 -0
  492. package/dist/ionic/p-ddfb7e5f.entry.js +4 -0
  493. package/dist/ionic/p-e538f18d.entry.js +4 -0
  494. package/dist/ionic/p-f376876b.entry.js +4 -0
  495. package/dist/ionic/p-f7dd1ed9.entry.js +4 -0
  496. package/dist/ionic/p-fbd83d4c.entry.js +4 -0
  497. package/dist/types/components/refresher/refresher.d.ts +7 -0
  498. package/hydrate/index.js +5450 -8380
  499. package/hydrate/index.mjs +5450 -8380
  500. package/package.json +1 -1
  501. package/components/p--m5cCjbK.js +0 -4
  502. package/components/p-B4uHHhPK.js +0 -4
  503. package/components/p-BNJOu1Q2.js +0 -4
  504. package/components/p-BOvLNVKq.js +0 -4
  505. package/components/p-BeamQXHF.js +0 -4
  506. package/components/p-BjluhQMI.js +0 -4
  507. package/components/p-BlsIikdZ.js +0 -4
  508. package/components/p-BrD9Xv62.js +0 -4
  509. package/components/p-BvJqoZ5R.js +0 -4
  510. package/components/p-Bz6z3Asd.js +0 -4
  511. package/components/p-C6HnVvHO.js +0 -4
  512. package/components/p-C7jvh5Wy.js +0 -4
  513. package/components/p-C9BGR5fy.js +0 -4
  514. package/components/p-CB-y1CdP.js +0 -4
  515. package/components/p-CHH3loEE.js +0 -4
  516. package/components/p-CJKUWjmg.js +0 -4
  517. package/components/p-CMLAwl_N.js +0 -4
  518. package/components/p-CejmQs3h.js +0 -4
  519. package/components/p-CtZqa4HM.js +0 -4
  520. package/components/p-D9qIVSWm.js +0 -4
  521. package/components/p-DE-3iMNW.js +0 -4
  522. package/components/p-DHFt2rdc.js +0 -4
  523. package/components/p-D_RCyzwu.js +0 -4
  524. package/components/p-D_tD8r3L.js +0 -4
  525. package/components/p-DjCtLZbF.js +0 -4
  526. package/components/p-Dmd2xqCe.js +0 -4
  527. package/components/p-G6JR-cr_.js +0 -4
  528. package/components/p-GG5GhznE.js +0 -4
  529. package/components/p-TXPDHL13.js +0 -4
  530. package/components/p-_IKFD3ID.js +0 -4
  531. package/components/p-dKq2jIum.js +0 -4
  532. package/components/p-iYhH60Tc.js +0 -4
  533. package/dist/ionic/p-06ec7136.entry.js +0 -4
  534. package/dist/ionic/p-09fe4fa3.entry.js +0 -4
  535. package/dist/ionic/p-10d45a07.entry.js +0 -4
  536. package/dist/ionic/p-208c8a07.entry.js +0 -4
  537. package/dist/ionic/p-212474fa.entry.js +0 -4
  538. package/dist/ionic/p-2eef1396.entry.js +0 -4
  539. package/dist/ionic/p-347e005d.entry.js +0 -4
  540. package/dist/ionic/p-3a0b3f1d.entry.js +0 -4
  541. package/dist/ionic/p-3b071259.entry.js +0 -4
  542. package/dist/ionic/p-4204184c.entry.js +0 -4
  543. package/dist/ionic/p-47464391.entry.js +0 -4
  544. package/dist/ionic/p-4f9c9126.entry.js +0 -4
  545. package/dist/ionic/p-5JsKPLJD.js +0 -4
  546. package/dist/ionic/p-5bc485c6.entry.js +0 -4
  547. package/dist/ionic/p-603a61e6.entry.js +0 -4
  548. package/dist/ionic/p-60576951.entry.js +0 -4
  549. package/dist/ionic/p-67a81d33.entry.js +0 -4
  550. package/dist/ionic/p-6affb775.entry.js +0 -4
  551. package/dist/ionic/p-6f120c25.entry.js +0 -4
  552. package/dist/ionic/p-71c82b60.entry.js +0 -4
  553. package/dist/ionic/p-79325ffe.entry.js +0 -4
  554. package/dist/ionic/p-7e4d51fa.entry.js +0 -4
  555. package/dist/ionic/p-7f5d4664.entry.js +0 -4
  556. package/dist/ionic/p-80ee82fc.entry.js +0 -4
  557. package/dist/ionic/p-84af7dbc.entry.js +0 -4
  558. package/dist/ionic/p-89ca830a.entry.js +0 -4
  559. package/dist/ionic/p-93b8ec8f.entry.js +0 -4
  560. package/dist/ionic/p-946f65c2.entry.js +0 -4
  561. package/dist/ionic/p-9c4b39fb.entry.js +0 -4
  562. package/dist/ionic/p-B1NEZUzQ.js +0 -4
  563. package/dist/ionic/p-B1ck5iy-.js +0 -4
  564. package/dist/ionic/p-B4FrqdW0.js +0 -4
  565. package/dist/ionic/p-C-94tAim.js +0 -4
  566. package/dist/ionic/p-C-eHZMYE.js +0 -4
  567. package/dist/ionic/p-CaRuIadB.js +0 -4
  568. package/dist/ionic/p-ChhhtsGZ.js +0 -5
  569. package/dist/ionic/p-CzS1qWve.js +0 -4
  570. package/dist/ionic/p-DjjfauRM.js +0 -4
  571. package/dist/ionic/p-DkUB-ROc.js +0 -4
  572. package/dist/ionic/p-DplOqGUv.js +0 -4
  573. package/dist/ionic/p-Dst_XmZh.js +0 -4
  574. package/dist/ionic/p-TXPDHL13.js +0 -4
  575. package/dist/ionic/p-a438b193.entry.js +0 -4
  576. package/dist/ionic/p-babaaaa7.entry.js +0 -4
  577. package/dist/ionic/p-be08d500.entry.js +0 -4
  578. package/dist/ionic/p-be9a4f51.entry.js +0 -4
  579. package/dist/ionic/p-c00d3092.entry.js +0 -4
  580. package/dist/ionic/p-c36dc8f5.entry.js +0 -4
  581. package/dist/ionic/p-c72a7e17.entry.js +0 -4
  582. package/dist/ionic/p-c8edd88c.entry.js +0 -4
  583. package/dist/ionic/p-ce0e380b.entry.js +0 -4
  584. package/dist/ionic/p-ce32912b.entry.js +0 -4
  585. package/dist/ionic/p-d07cf130.entry.js +0 -4
  586. package/dist/ionic/p-d27edeb3.entry.js +0 -4
  587. package/dist/ionic/p-d5d2c506.entry.js +0 -4
  588. package/dist/ionic/p-d5e31ca9.entry.js +0 -4
  589. package/dist/ionic/p-de91444f.entry.js +0 -4
  590. package/dist/ionic/p-df72866d.entry.js +0 -4
  591. package/dist/ionic/p-e47e3151.entry.js +0 -4
  592. package/dist/ionic/p-e621e5e8.entry.js +0 -4
  593. package/dist/ionic/p-eea9cf93.entry.js +0 -4
  594. package/dist/ionic/p-f402f5a4.entry.js +0 -4
  595. package/dist/ionic/p-fe1bfbcf.entry.js +0 -4
  596. package/dist/ionic/p-ffb90460.entry.js +0 -4
@@ -1,8 +1,8 @@
1
1
  /*!
2
2
  * (C) Ionic http://ionicframework.com - MIT License
3
3
  */
4
- import { r as registerInstance, c as createEvent, g as getElement, h, d as Host } from './index-ChhhtsGZ.js';
5
- import { g as getElementRoot } from './helpers-CAGf8Wgp.js';
4
+ import { r as registerInstance, c as createEvent, h, d as Host, g as getElement } from './index-CKYcsw8f.js';
5
+ import { g as getElementRoot } from './helpers-BIgoInJU.js';
6
6
  import './dir-Dojwmvde.js';
7
7
 
8
8
  const pickerIosCss = () => `:host{display:-ms-flexbox;display:flex;position:relative;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center;width:100%;height:200px;direction:ltr;z-index:0}:host .picker-before,:host .picker-after{position:absolute;width:100%;-webkit-transform:translateZ(0);transform:translateZ(0);z-index:1;pointer-events:none}:host .picker-before{top:0;height:83px}:host .picker-before{inset-inline-start:0}:host .picker-after{top:116px;height:84px}:host .picker-after{inset-inline-start:0}:host .picker-highlight{border-radius:var(--highlight-border-radius, 8px);left:0;right:0;top:50%;bottom:0;-webkit-margin-start:auto;margin-inline-start:auto;-webkit-margin-end:auto;margin-inline-end:auto;margin-top:0;margin-bottom:0;position:absolute;width:calc(100% - 16px);height:34px;-webkit-transform:translateY(-50%);transform:translateY(-50%);background:var(--highlight-background);z-index:-1}:host input{position:absolute;top:0;left:0;right:0;bottom:0;width:100%;height:100%;margin:0;padding:0;border:0;outline:0;clip:rect(0 0 0 0);opacity:0;overflow:hidden;-webkit-appearance:none;-moz-appearance:none}:host ::slotted(ion-picker-column:first-of-type){text-align:start}:host ::slotted(ion-picker-column:last-of-type){text-align:end}:host ::slotted(ion-picker-column:only-child){text-align:center}:host .picker-before{background:-webkit-gradient(linear, left top, left bottom, color-stop(20%, rgba(var(--fade-background-rgb, var(--background-rgb, var(--ion-background-color-rgb, 255, 255, 255))), 1)), to(rgba(var(--fade-background-rgb, var(--background-rgb, var(--ion-background-color-rgb, 255, 255, 255))), 0.8)));background:linear-gradient(to bottom, rgba(var(--fade-background-rgb, var(--background-rgb, var(--ion-background-color-rgb, 255, 255, 255))), 1) 20%, rgba(var(--fade-background-rgb, var(--background-rgb, var(--ion-background-color-rgb, 255, 255, 255))), 0.8) 100%)}:host .picker-after{background:-webkit-gradient(linear, left bottom, left top, color-stop(20%, rgba(var(--fade-background-rgb, var(--background-rgb, var(--ion-background-color-rgb, 255, 255, 255))), 1)), to(rgba(var(--fade-background-rgb, var(--background-rgb, var(--ion-background-color-rgb, 255, 255, 255))), 0.8)));background:linear-gradient(to top, rgba(var(--fade-background-rgb, var(--background-rgb, var(--ion-background-color-rgb, 255, 255, 255))), 1) 20%, rgba(var(--fade-background-rgb, var(--background-rgb, var(--ion-background-color-rgb, 255, 255, 255))), 0.8) 100%)}:host .picker-highlight{background:var(--highlight-background, var(--ion-color-step-150, var(--ion-background-color-step-150, #eeeeef)))}`;
@@ -13,249 +13,427 @@ const Picker = class {
13
13
  constructor(hostRef) {
14
14
  registerInstance(this, hostRef);
15
15
  this.ionInputModeChange = createEvent(this, "ionInputModeChange", 7);
16
- }
17
- inputEl;
18
- useInputMode = false;
19
- inputModeColumn;
20
- highlightEl;
21
- actionOnClick;
22
- destroyKeypressListener;
23
- singleColumnSearchTimeout;
24
- get el() { return getElement(this); }
25
- /**
26
- * @internal
27
- */
28
- ionInputModeChange;
29
- /**
30
- * When the picker is interacted with
31
- * we need to prevent touchstart so other
32
- * gestures do not fire. For example,
33
- * scrolling on the wheel picker
34
- * in ion-datetime should not cause
35
- * a card modal to swipe to close.
36
- */
37
- preventTouchStartPropagation(ev) {
38
- ev.stopPropagation();
39
- }
40
- componentWillLoad() {
41
- getElementRoot(this.el).addEventListener('focusin', this.onFocusIn);
42
- getElementRoot(this.el).addEventListener('focusout', this.onFocusOut);
43
- }
44
- isInHighlightBounds = (ev) => {
45
- const { highlightEl } = this;
46
- if (!highlightEl) {
47
- return false;
48
- }
49
- const bbox = highlightEl.getBoundingClientRect();
50
- /**
51
- * Check to see if the user clicked
52
- * outside the bounds of the highlight.
53
- */
54
- const outsideX = ev.clientX < bbox.left || ev.clientX > bbox.right;
55
- const outsideY = ev.clientY < bbox.top || ev.clientY > bbox.bottom;
56
- if (outsideX || outsideY) {
57
- return false;
58
- }
59
- return true;
60
- };
61
- /**
62
- * If we are no longer focused
63
- * on a picker column, then we should
64
- * exit input mode. An exception is made
65
- * for the input in the picker since having
66
- * that focused means we are still in input mode.
67
- */
68
- onFocusOut = (ev) => {
69
- // TODO(FW-2832): type
70
- const { relatedTarget } = ev;
71
- if (!relatedTarget || (relatedTarget.tagName !== 'ION-PICKER-COLUMN' && relatedTarget !== this.inputEl)) {
72
- this.exitInputMode();
73
- }
74
- };
75
- /**
76
- * When picker columns receive focus
77
- * the parent picker needs to determine
78
- * whether to enter/exit input mode.
79
- */
80
- onFocusIn = (ev) => {
81
- // TODO(FW-2832): type
82
- const { target } = ev;
16
+ this.useInputMode = false;
17
+ this.isInHighlightBounds = (ev) => {
18
+ const { highlightEl } = this;
19
+ if (!highlightEl) {
20
+ return false;
21
+ }
22
+ const bbox = highlightEl.getBoundingClientRect();
23
+ /**
24
+ * Check to see if the user clicked
25
+ * outside the bounds of the highlight.
26
+ */
27
+ const outsideX = ev.clientX < bbox.left || ev.clientX > bbox.right;
28
+ const outsideY = ev.clientY < bbox.top || ev.clientY > bbox.bottom;
29
+ if (outsideX || outsideY) {
30
+ return false;
31
+ }
32
+ return true;
33
+ };
83
34
  /**
84
- * Due to browser differences in how/when focus
85
- * is dispatched on certain elements, we need to
86
- * make sure that this function only ever runs when
87
- * focusing a picker column.
35
+ * If we are no longer focused
36
+ * on a picker column, then we should
37
+ * exit input mode. An exception is made
38
+ * for the input in the picker since having
39
+ * that focused means we are still in input mode.
88
40
  */
89
- if (target.tagName !== 'ION-PICKER-COLUMN') {
90
- return;
91
- }
41
+ this.onFocusOut = (ev) => {
42
+ // TODO(FW-2832): type
43
+ const { relatedTarget } = ev;
44
+ if (!relatedTarget || (relatedTarget.tagName !== 'ION-PICKER-COLUMN' && relatedTarget !== this.inputEl)) {
45
+ this.exitInputMode();
46
+ }
47
+ };
92
48
  /**
93
- * If we have actionOnClick
94
- * then this means the user focused
95
- * a picker column via mouse or
96
- * touch (i.e. a PointerEvent). As a result,
97
- * we should not enter/exit input mode
98
- * until the click event has fired, which happens
99
- * after the `focusin` event.
100
- *
101
- * Otherwise, the user likely focused
102
- * the column using their keyboard and
103
- * we should enter/exit input mode automatically.
49
+ * When picker columns receive focus
50
+ * the parent picker needs to determine
51
+ * whether to enter/exit input mode.
104
52
  */
105
- if (!this.actionOnClick) {
106
- const columnEl = target;
107
- const allowInput = columnEl.numericInput;
108
- if (allowInput) {
109
- this.enterInputMode(columnEl, false);
110
- }
111
- else {
112
- this.exitInputMode();
53
+ this.onFocusIn = (ev) => {
54
+ // TODO(FW-2832): type
55
+ const { target } = ev;
56
+ /**
57
+ * Due to browser differences in how/when focus
58
+ * is dispatched on certain elements, we need to
59
+ * make sure that this function only ever runs when
60
+ * focusing a picker column.
61
+ */
62
+ if (target.tagName !== 'ION-PICKER-COLUMN') {
63
+ return;
113
64
  }
114
- }
115
- };
116
- /**
117
- * On click we need to run an actionOnClick
118
- * function that has been set in onPointerDown
119
- * so that we enter/exit input mode correctly.
120
- */
121
- onClick = () => {
122
- const { actionOnClick } = this;
123
- if (actionOnClick) {
124
- actionOnClick();
125
- this.actionOnClick = undefined;
126
- }
127
- };
128
- /**
129
- * Clicking a column also focuses the column on
130
- * certain browsers, so we use onPointerDown
131
- * to tell the onFocusIn function that users
132
- * are trying to click the column rather than
133
- * focus the column using the keyboard. When the
134
- * user completes the click, the onClick function
135
- * runs and runs the actionOnClick callback.
136
- */
137
- onPointerDown = (ev) => {
138
- const { useInputMode, inputModeColumn, el } = this;
139
- if (this.isInHighlightBounds(ev)) {
140
65
  /**
141
- * If we were already in
142
- * input mode, then we should determine
143
- * if we tapped a particular column and
144
- * should switch to input mode for
145
- * that specific column.
66
+ * If we have actionOnClick
67
+ * then this means the user focused
68
+ * a picker column via mouse or
69
+ * touch (i.e. a PointerEvent). As a result,
70
+ * we should not enter/exit input mode
71
+ * until the click event has fired, which happens
72
+ * after the `focusin` event.
73
+ *
74
+ * Otherwise, the user likely focused
75
+ * the column using their keyboard and
76
+ * we should enter/exit input mode automatically.
146
77
  */
147
- if (useInputMode) {
78
+ if (!this.actionOnClick) {
79
+ const columnEl = target;
80
+ const allowInput = columnEl.numericInput;
81
+ if (allowInput) {
82
+ this.enterInputMode(columnEl, false);
83
+ }
84
+ else {
85
+ this.exitInputMode();
86
+ }
87
+ }
88
+ };
89
+ /**
90
+ * On click we need to run an actionOnClick
91
+ * function that has been set in onPointerDown
92
+ * so that we enter/exit input mode correctly.
93
+ */
94
+ this.onClick = () => {
95
+ const { actionOnClick } = this;
96
+ if (actionOnClick) {
97
+ actionOnClick();
98
+ this.actionOnClick = undefined;
99
+ }
100
+ };
101
+ /**
102
+ * Clicking a column also focuses the column on
103
+ * certain browsers, so we use onPointerDown
104
+ * to tell the onFocusIn function that users
105
+ * are trying to click the column rather than
106
+ * focus the column using the keyboard. When the
107
+ * user completes the click, the onClick function
108
+ * runs and runs the actionOnClick callback.
109
+ */
110
+ this.onPointerDown = (ev) => {
111
+ const { useInputMode, inputModeColumn, el } = this;
112
+ if (this.isInHighlightBounds(ev)) {
148
113
  /**
149
- * If we tapped a picker column
150
- * then we should either switch to input
151
- * mode for that column or all columns.
152
- * Otherwise we should exit input mode
153
- * since we just tapped the highlight and
154
- * not a column.
114
+ * If we were already in
115
+ * input mode, then we should determine
116
+ * if we tapped a particular column and
117
+ * should switch to input mode for
118
+ * that specific column.
155
119
  */
156
- if (ev.target.tagName === 'ION-PICKER-COLUMN') {
120
+ if (useInputMode) {
157
121
  /**
158
- * If user taps 2 different columns
159
- * then we should just switch to input mode
160
- * for the new column rather than switching to
161
- * input mode for all columns.
122
+ * If we tapped a picker column
123
+ * then we should either switch to input
124
+ * mode for that column or all columns.
125
+ * Otherwise we should exit input mode
126
+ * since we just tapped the highlight and
127
+ * not a column.
162
128
  */
163
- if (inputModeColumn && inputModeColumn === ev.target) {
164
- this.actionOnClick = () => {
165
- this.enterInputMode();
166
- };
129
+ if (ev.target.tagName === 'ION-PICKER-COLUMN') {
130
+ /**
131
+ * If user taps 2 different columns
132
+ * then we should just switch to input mode
133
+ * for the new column rather than switching to
134
+ * input mode for all columns.
135
+ */
136
+ if (inputModeColumn && inputModeColumn === ev.target) {
137
+ this.actionOnClick = () => {
138
+ this.enterInputMode();
139
+ };
140
+ }
141
+ else {
142
+ this.actionOnClick = () => {
143
+ this.enterInputMode(ev.target);
144
+ };
145
+ }
167
146
  }
168
147
  else {
169
148
  this.actionOnClick = () => {
170
- this.enterInputMode(ev.target);
149
+ this.exitInputMode();
171
150
  };
172
151
  }
152
+ /**
153
+ * If we were not already in
154
+ * input mode, then we should
155
+ * enter input mode for all columns.
156
+ */
173
157
  }
174
158
  else {
159
+ /**
160
+ * If there is only 1 numeric input column
161
+ * then we should skip multi column input.
162
+ */
163
+ const columns = el.querySelectorAll('ion-picker-column.picker-column-numeric-input');
164
+ const columnEl = columns.length === 1 ? ev.target : undefined;
175
165
  this.actionOnClick = () => {
176
- this.exitInputMode();
166
+ this.enterInputMode(columnEl);
177
167
  };
178
168
  }
179
- /**
180
- * If we were not already in
181
- * input mode, then we should
182
- * enter input mode for all columns.
183
- */
169
+ return;
170
+ }
171
+ this.actionOnClick = () => {
172
+ this.exitInputMode();
173
+ };
174
+ };
175
+ /**
176
+ * Enters input mode to allow
177
+ * for text entry of numeric values.
178
+ * If on mobile, we focus a hidden input
179
+ * field so that the on screen keyboard
180
+ * is brought up. When tabbing using a
181
+ * keyboard, picker columns receive an outline
182
+ * to indicate they are focused. As a result,
183
+ * we should not focus the hidden input as it
184
+ * would cause the outline to go away, preventing
185
+ * users from having any visual indication of which
186
+ * column is focused.
187
+ */
188
+ this.enterInputMode = (columnEl, focusInput = true) => {
189
+ const { inputEl, el } = this;
190
+ if (!inputEl) {
191
+ return;
192
+ }
193
+ /**
194
+ * Only active input mode if there is at
195
+ * least one column that accepts numeric input.
196
+ */
197
+ const hasInputColumn = el.querySelector('ion-picker-column.picker-column-numeric-input');
198
+ if (!hasInputColumn) {
199
+ return;
200
+ }
201
+ /**
202
+ * If columnEl is undefined then
203
+ * it is assumed that all numeric pickers
204
+ * are eligible for text entry.
205
+ * (i.e. hour and minute columns)
206
+ */
207
+ this.useInputMode = true;
208
+ this.inputModeColumn = columnEl;
209
+ /**
210
+ * Users with a keyboard and mouse can
211
+ * activate input mode where the input is
212
+ * focused as well as when it is not focused,
213
+ * so we need to make sure we clean up any
214
+ * old listeners.
215
+ */
216
+ if (focusInput) {
217
+ if (this.destroyKeypressListener) {
218
+ this.destroyKeypressListener();
219
+ this.destroyKeypressListener = undefined;
220
+ }
221
+ inputEl.focus();
184
222
  }
185
223
  else {
224
+ // TODO FW-5900 Use keydown instead
225
+ el.addEventListener('keypress', this.onKeyPress);
226
+ this.destroyKeypressListener = () => {
227
+ el.removeEventListener('keypress', this.onKeyPress);
228
+ };
229
+ }
230
+ this.emitInputModeChange();
231
+ };
232
+ this.onKeyPress = (ev) => {
233
+ const { inputEl } = this;
234
+ if (!inputEl) {
235
+ return;
236
+ }
237
+ const parsedValue = parseInt(ev.key, 10);
238
+ /**
239
+ * Only numbers should be allowed
240
+ */
241
+ if (!Number.isNaN(parsedValue)) {
242
+ inputEl.value += ev.key;
243
+ this.onInputChange();
244
+ }
245
+ };
246
+ this.selectSingleColumn = () => {
247
+ const { inputEl, inputModeColumn, singleColumnSearchTimeout } = this;
248
+ if (!inputEl || !inputModeColumn) {
249
+ return;
250
+ }
251
+ const options = Array.from(inputModeColumn.querySelectorAll('ion-picker-column-option')).filter((el) => el.disabled !== true);
252
+ /**
253
+ * If users pause for a bit, the search
254
+ * value should be reset similar to how a
255
+ * <select> behaves. So typing "34", waiting,
256
+ * then typing "5" should select "05".
257
+ */
258
+ if (singleColumnSearchTimeout) {
259
+ clearTimeout(singleColumnSearchTimeout);
260
+ }
261
+ this.singleColumnSearchTimeout = setTimeout(() => {
262
+ inputEl.value = '';
263
+ this.singleColumnSearchTimeout = undefined;
264
+ }, 1000);
265
+ /**
266
+ * For values that are longer than 2 digits long
267
+ * we should shift the value over 1 character
268
+ * to the left. So typing "456" would result in "56".
269
+ * TODO: If we want to support more than just
270
+ * time entry, we should update this value to be
271
+ * the max length of all of the picker items.
272
+ */
273
+ if (inputEl.value.length >= 3) {
274
+ const startIndex = inputEl.value.length - 2;
275
+ const newString = inputEl.value.substring(startIndex);
276
+ inputEl.value = newString;
277
+ this.selectSingleColumn();
278
+ return;
279
+ }
280
+ /**
281
+ * Checking the value of the input gets priority
282
+ * first. For example, if the value of the input
283
+ * is "1" and we entered "2", then the complete value
284
+ * is "12" and we should select hour 12.
285
+ *
286
+ * Regex removes any leading zeros from values like "02",
287
+ * but it keeps a single zero if there are only zeros in the string.
288
+ * 0+(?=[1-9]) --> Match 1 or more zeros that are followed by 1-9
289
+ * 0+(?=0$) --> Match 1 or more zeros that must be followed by one 0 and end.
290
+ */
291
+ const findItemFromCompleteValue = options.find(({ textContent }) => {
186
292
  /**
187
- * If there is only 1 numeric input column
188
- * then we should skip multi column input.
293
+ * Keyboard entry is currently only used inside of Datetime
294
+ * where we guarantee textContent is set.
295
+ * If we end up exposing this feature publicly we should revisit this assumption.
189
296
  */
190
- const columns = el.querySelectorAll('ion-picker-column.picker-column-numeric-input');
191
- const columnEl = columns.length === 1 ? ev.target : undefined;
192
- this.actionOnClick = () => {
193
- this.enterInputMode(columnEl);
194
- };
297
+ const parsedText = textContent.replace(/^0+(?=[1-9])|0+(?=0$)/, '');
298
+ return parsedText === inputEl.value;
299
+ });
300
+ if (findItemFromCompleteValue) {
301
+ inputModeColumn.setValue(findItemFromCompleteValue.value);
302
+ return;
303
+ }
304
+ /**
305
+ * If we typed "56" to get minute 56, then typed "7",
306
+ * we should select "07" as "567" is not a valid minute.
307
+ */
308
+ if (inputEl.value.length === 2) {
309
+ const changedCharacter = inputEl.value.substring(inputEl.value.length - 1);
310
+ inputEl.value = changedCharacter;
311
+ this.selectSingleColumn();
195
312
  }
196
- return;
197
- }
198
- this.actionOnClick = () => {
199
- this.exitInputMode();
200
313
  };
201
- };
202
- /**
203
- * Enters input mode to allow
204
- * for text entry of numeric values.
205
- * If on mobile, we focus a hidden input
206
- * field so that the on screen keyboard
207
- * is brought up. When tabbing using a
208
- * keyboard, picker columns receive an outline
209
- * to indicate they are focused. As a result,
210
- * we should not focus the hidden input as it
211
- * would cause the outline to go away, preventing
212
- * users from having any visual indication of which
213
- * column is focused.
214
- */
215
- enterInputMode = (columnEl, focusInput = true) => {
216
- const { inputEl, el } = this;
217
- if (!inputEl) {
218
- return;
219
- }
220
314
  /**
221
- * Only active input mode if there is at
222
- * least one column that accepts numeric input.
315
+ * Searches a list of column items for a particular
316
+ * value. This is currently used for numeric values.
317
+ * The zeroBehavior can be set to account for leading
318
+ * or trailing zeros when looking at the item text.
223
319
  */
224
- const hasInputColumn = el.querySelector('ion-picker-column.picker-column-numeric-input');
225
- if (!hasInputColumn) {
226
- return;
227
- }
320
+ this.searchColumn = (colEl, value, zeroBehavior = 'start') => {
321
+ if (!value) {
322
+ return false;
323
+ }
324
+ const behavior = zeroBehavior === 'start' ? /^0+/ : /0$/;
325
+ value = value.replace(behavior, '');
326
+ const option = Array.from(colEl.querySelectorAll('ion-picker-column-option')).find((el) => {
327
+ return el.disabled !== true && el.textContent.replace(behavior, '') === value;
328
+ });
329
+ if (option) {
330
+ colEl.setValue(option.value);
331
+ }
332
+ return !!option;
333
+ };
228
334
  /**
229
- * If columnEl is undefined then
230
- * it is assumed that all numeric pickers
231
- * are eligible for text entry.
232
- * (i.e. hour and minute columns)
335
+ * Attempts to intelligently search the first and second
336
+ * column as if they're number columns for the provided numbers
337
+ * where the first two numbers are the first column
338
+ * and the last 2 are the last column. Tries to allow for the first
339
+ * number to be ignored for situations where typos occurred.
233
340
  */
234
- this.useInputMode = true;
235
- this.inputModeColumn = columnEl;
341
+ this.multiColumnSearch = (firstColumn, secondColumn, input) => {
342
+ if (input.length === 0) {
343
+ return;
344
+ }
345
+ const inputArray = input.split('');
346
+ const hourValue = inputArray.slice(0, 2).join('');
347
+ // Try to find a match for the first two digits in the first column
348
+ const foundHour = this.searchColumn(firstColumn, hourValue);
349
+ // If we have more than 2 digits and found a match for hours,
350
+ // use the remaining digits for the second column (minutes)
351
+ if (inputArray.length > 2 && foundHour) {
352
+ const minuteValue = inputArray.slice(2, 4).join('');
353
+ this.searchColumn(secondColumn, minuteValue);
354
+ }
355
+ // If we couldn't find a match for the two-digit hour, try single digit approaches
356
+ else if (!foundHour && inputArray.length >= 1) {
357
+ // First try the first digit as a single-digit hour
358
+ let singleDigitHour = inputArray[0];
359
+ let singleDigitFound = this.searchColumn(firstColumn, singleDigitHour);
360
+ // If that didn't work, try the second digit as a single-digit hour
361
+ // (handles case where user made a typo in the first digit, or they typed over themselves)
362
+ if (!singleDigitFound) {
363
+ inputArray.shift();
364
+ singleDigitHour = inputArray[0];
365
+ singleDigitFound = this.searchColumn(firstColumn, singleDigitHour);
366
+ }
367
+ // If we found a single-digit hour and have remaining digits,
368
+ // use up to 2 of the remaining digits for the second column
369
+ if (singleDigitFound && inputArray.length > 1) {
370
+ const remainingDigits = inputArray.slice(1, 3).join('');
371
+ this.searchColumn(secondColumn, remainingDigits);
372
+ }
373
+ }
374
+ };
375
+ this.selectMultiColumn = () => {
376
+ const { inputEl, el } = this;
377
+ if (!inputEl) {
378
+ return;
379
+ }
380
+ const numericPickers = Array.from(el.querySelectorAll('ion-picker-column')).filter((col) => col.numericInput);
381
+ const firstColumn = numericPickers[0];
382
+ const lastColumn = numericPickers[1];
383
+ let value = inputEl.value;
384
+ if (value.length > 4) {
385
+ const startIndex = inputEl.value.length - 4;
386
+ const newString = inputEl.value.substring(startIndex);
387
+ inputEl.value = newString;
388
+ value = newString;
389
+ }
390
+ this.multiColumnSearch(firstColumn, lastColumn, value);
391
+ };
236
392
  /**
237
- * Users with a keyboard and mouse can
238
- * activate input mode where the input is
239
- * focused as well as when it is not focused,
240
- * so we need to make sure we clean up any
241
- * old listeners.
393
+ * Searches the value of the active column
394
+ * to determine which value users are trying
395
+ * to select
242
396
  */
243
- if (focusInput) {
244
- if (this.destroyKeypressListener) {
245
- this.destroyKeypressListener();
246
- this.destroyKeypressListener = undefined;
397
+ this.onInputChange = () => {
398
+ const { useInputMode, inputEl, inputModeColumn } = this;
399
+ if (!useInputMode || !inputEl) {
400
+ return;
247
401
  }
248
- inputEl.focus();
249
- }
250
- else {
251
- // TODO FW-5900 Use keydown instead
252
- el.addEventListener('keypress', this.onKeyPress);
253
- this.destroyKeypressListener = () => {
254
- el.removeEventListener('keypress', this.onKeyPress);
255
- };
256
- }
257
- this.emitInputModeChange();
258
- };
402
+ if (inputModeColumn) {
403
+ this.selectSingleColumn();
404
+ }
405
+ else {
406
+ this.selectMultiColumn();
407
+ }
408
+ };
409
+ /**
410
+ * Emit ionInputModeChange. Picker columns
411
+ * listen for this event to determine whether
412
+ * or not their column is "active" for text input.
413
+ */
414
+ this.emitInputModeChange = () => {
415
+ const { useInputMode, inputModeColumn } = this;
416
+ this.ionInputModeChange.emit({
417
+ useInputMode,
418
+ inputModeColumn,
419
+ });
420
+ };
421
+ }
422
+ /**
423
+ * When the picker is interacted with
424
+ * we need to prevent touchstart so other
425
+ * gestures do not fire. For example,
426
+ * scrolling on the wheel picker
427
+ * in ion-datetime should not cause
428
+ * a card modal to swipe to close.
429
+ */
430
+ preventTouchStartPropagation(ev) {
431
+ ev.stopPropagation();
432
+ }
433
+ componentWillLoad() {
434
+ getElementRoot(this.el).addEventListener('focusin', this.onFocusIn);
435
+ getElementRoot(this.el).addEventListener('focusout', this.onFocusOut);
436
+ }
259
437
  /**
260
438
  * @internal
261
439
  * Exits text entry mode for the picker
@@ -277,195 +455,6 @@ const Picker = class {
277
455
  }
278
456
  this.emitInputModeChange();
279
457
  }
280
- onKeyPress = (ev) => {
281
- const { inputEl } = this;
282
- if (!inputEl) {
283
- return;
284
- }
285
- const parsedValue = parseInt(ev.key, 10);
286
- /**
287
- * Only numbers should be allowed
288
- */
289
- if (!Number.isNaN(parsedValue)) {
290
- inputEl.value += ev.key;
291
- this.onInputChange();
292
- }
293
- };
294
- selectSingleColumn = () => {
295
- const { inputEl, inputModeColumn, singleColumnSearchTimeout } = this;
296
- if (!inputEl || !inputModeColumn) {
297
- return;
298
- }
299
- const options = Array.from(inputModeColumn.querySelectorAll('ion-picker-column-option')).filter((el) => el.disabled !== true);
300
- /**
301
- * If users pause for a bit, the search
302
- * value should be reset similar to how a
303
- * <select> behaves. So typing "34", waiting,
304
- * then typing "5" should select "05".
305
- */
306
- if (singleColumnSearchTimeout) {
307
- clearTimeout(singleColumnSearchTimeout);
308
- }
309
- this.singleColumnSearchTimeout = setTimeout(() => {
310
- inputEl.value = '';
311
- this.singleColumnSearchTimeout = undefined;
312
- }, 1000);
313
- /**
314
- * For values that are longer than 2 digits long
315
- * we should shift the value over 1 character
316
- * to the left. So typing "456" would result in "56".
317
- * TODO: If we want to support more than just
318
- * time entry, we should update this value to be
319
- * the max length of all of the picker items.
320
- */
321
- if (inputEl.value.length >= 3) {
322
- const startIndex = inputEl.value.length - 2;
323
- const newString = inputEl.value.substring(startIndex);
324
- inputEl.value = newString;
325
- this.selectSingleColumn();
326
- return;
327
- }
328
- /**
329
- * Checking the value of the input gets priority
330
- * first. For example, if the value of the input
331
- * is "1" and we entered "2", then the complete value
332
- * is "12" and we should select hour 12.
333
- *
334
- * Regex removes any leading zeros from values like "02",
335
- * but it keeps a single zero if there are only zeros in the string.
336
- * 0+(?=[1-9]) --> Match 1 or more zeros that are followed by 1-9
337
- * 0+(?=0$) --> Match 1 or more zeros that must be followed by one 0 and end.
338
- */
339
- const findItemFromCompleteValue = options.find(({ textContent }) => {
340
- /**
341
- * Keyboard entry is currently only used inside of Datetime
342
- * where we guarantee textContent is set.
343
- * If we end up exposing this feature publicly we should revisit this assumption.
344
- */
345
- const parsedText = textContent.replace(/^0+(?=[1-9])|0+(?=0$)/, '');
346
- return parsedText === inputEl.value;
347
- });
348
- if (findItemFromCompleteValue) {
349
- inputModeColumn.setValue(findItemFromCompleteValue.value);
350
- return;
351
- }
352
- /**
353
- * If we typed "56" to get minute 56, then typed "7",
354
- * we should select "07" as "567" is not a valid minute.
355
- */
356
- if (inputEl.value.length === 2) {
357
- const changedCharacter = inputEl.value.substring(inputEl.value.length - 1);
358
- inputEl.value = changedCharacter;
359
- this.selectSingleColumn();
360
- }
361
- };
362
- /**
363
- * Searches a list of column items for a particular
364
- * value. This is currently used for numeric values.
365
- * The zeroBehavior can be set to account for leading
366
- * or trailing zeros when looking at the item text.
367
- */
368
- searchColumn = (colEl, value, zeroBehavior = 'start') => {
369
- if (!value) {
370
- return false;
371
- }
372
- const behavior = zeroBehavior === 'start' ? /^0+/ : /0$/;
373
- value = value.replace(behavior, '');
374
- const option = Array.from(colEl.querySelectorAll('ion-picker-column-option')).find((el) => {
375
- return el.disabled !== true && el.textContent.replace(behavior, '') === value;
376
- });
377
- if (option) {
378
- colEl.setValue(option.value);
379
- }
380
- return !!option;
381
- };
382
- /**
383
- * Attempts to intelligently search the first and second
384
- * column as if they're number columns for the provided numbers
385
- * where the first two numbers are the first column
386
- * and the last 2 are the last column. Tries to allow for the first
387
- * number to be ignored for situations where typos occurred.
388
- */
389
- multiColumnSearch = (firstColumn, secondColumn, input) => {
390
- if (input.length === 0) {
391
- return;
392
- }
393
- const inputArray = input.split('');
394
- const hourValue = inputArray.slice(0, 2).join('');
395
- // Try to find a match for the first two digits in the first column
396
- const foundHour = this.searchColumn(firstColumn, hourValue);
397
- // If we have more than 2 digits and found a match for hours,
398
- // use the remaining digits for the second column (minutes)
399
- if (inputArray.length > 2 && foundHour) {
400
- const minuteValue = inputArray.slice(2, 4).join('');
401
- this.searchColumn(secondColumn, minuteValue);
402
- }
403
- // If we couldn't find a match for the two-digit hour, try single digit approaches
404
- else if (!foundHour && inputArray.length >= 1) {
405
- // First try the first digit as a single-digit hour
406
- let singleDigitHour = inputArray[0];
407
- let singleDigitFound = this.searchColumn(firstColumn, singleDigitHour);
408
- // If that didn't work, try the second digit as a single-digit hour
409
- // (handles case where user made a typo in the first digit, or they typed over themselves)
410
- if (!singleDigitFound) {
411
- inputArray.shift();
412
- singleDigitHour = inputArray[0];
413
- singleDigitFound = this.searchColumn(firstColumn, singleDigitHour);
414
- }
415
- // If we found a single-digit hour and have remaining digits,
416
- // use up to 2 of the remaining digits for the second column
417
- if (singleDigitFound && inputArray.length > 1) {
418
- const remainingDigits = inputArray.slice(1, 3).join('');
419
- this.searchColumn(secondColumn, remainingDigits);
420
- }
421
- }
422
- };
423
- selectMultiColumn = () => {
424
- const { inputEl, el } = this;
425
- if (!inputEl) {
426
- return;
427
- }
428
- const numericPickers = Array.from(el.querySelectorAll('ion-picker-column')).filter((col) => col.numericInput);
429
- const firstColumn = numericPickers[0];
430
- const lastColumn = numericPickers[1];
431
- let value = inputEl.value;
432
- if (value.length > 4) {
433
- const startIndex = inputEl.value.length - 4;
434
- const newString = inputEl.value.substring(startIndex);
435
- inputEl.value = newString;
436
- value = newString;
437
- }
438
- this.multiColumnSearch(firstColumn, lastColumn, value);
439
- };
440
- /**
441
- * Searches the value of the active column
442
- * to determine which value users are trying
443
- * to select
444
- */
445
- onInputChange = () => {
446
- const { useInputMode, inputEl, inputModeColumn } = this;
447
- if (!useInputMode || !inputEl) {
448
- return;
449
- }
450
- if (inputModeColumn) {
451
- this.selectSingleColumn();
452
- }
453
- else {
454
- this.selectMultiColumn();
455
- }
456
- };
457
- /**
458
- * Emit ionInputModeChange. Picker columns
459
- * listen for this event to determine whether
460
- * or not their column is "active" for text input.
461
- */
462
- emitInputModeChange = () => {
463
- const { useInputMode, inputModeColumn } = this;
464
- this.ionInputModeChange.emit({
465
- useInputMode,
466
- inputModeColumn,
467
- });
468
- };
469
458
  render() {
470
459
  return (h(Host, { key: '28f81e4ed44a633178561757c5199c2c98f94b74', onPointerDown: (ev) => this.onPointerDown(ev), onClick: () => this.onClick() }, h("input", { key: 'abb3d1ad25ef63856af7804111175a4d50008bc0', "aria-hidden": "true", tabindex: -1, inputmode: "numeric", type: "number", onKeyDown: (ev) => {
471
460
  /**
@@ -483,6 +472,7 @@ const Picker = class {
483
472
  }
484
473
  }, ref: (el) => (this.inputEl = el), onInput: () => this.onInputChange(), onBlur: () => this.exitInputMode() }), h("div", { key: '334a5abdc02e6b127c57177f626d7e4ff5526183', class: "picker-before" }), h("div", { key: 'ffd6271931129e88fc7c820e919d684899e420c5', class: "picker-after" }), h("div", { key: '78d1d95fd09e04f154ea59f24a1cece72c47ed7b', class: "picker-highlight", ref: (el) => (this.highlightEl = el) }), h("slot", { key: '0bd5b9f875d3c71f6cbbde2054baeb1b0a2e8cd5' })));
485
474
  }
475
+ get el() { return getElement(this); }
486
476
  };
487
477
  Picker.style = {
488
478
  ios: pickerIosCss(),