@ionic/core 7.6.2-dev.11703182244.1165aeec → 7.6.2-dev.11704390532.1202188d

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 (307) hide show
  1. package/components/backdrop.js +0 -12
  2. package/components/button.js +2 -2
  3. package/components/data.js +1 -1
  4. package/components/gesture-controller.js +1 -1
  5. package/components/ion-content.js +1 -1
  6. package/components/ion-datetime.js +40 -64
  7. package/components/ion-picker-column-option.d.ts +11 -0
  8. package/components/ion-picker-column-option.js +9 -0
  9. package/components/ion-picker-column.js +2 -2
  10. package/components/ion-picker-legacy-column.d.ts +11 -0
  11. package/components/ion-picker-legacy-column.js +9 -0
  12. package/components/{ion-picker-internal.d.ts → ion-picker-legacy.d.ts} +4 -4
  13. package/components/ion-picker-legacy.js +309 -0
  14. package/components/ion-picker.js +1 -309
  15. package/components/overlays.js +11 -4
  16. package/components/picker-column-option.js +122 -0
  17. package/components/picker-column.js +351 -322
  18. package/components/picker-column2.js +379 -0
  19. package/components/{picker-internal.js → picker.js} +29 -22
  20. package/components/radio-group.js +1 -9
  21. package/dist/cjs/{button-active-962fe442.js → button-active-5bf1cac0.js} +1 -1
  22. package/dist/cjs/{data-a5109f09.js → data-e2bf21de.js} +1 -1
  23. package/dist/cjs/{gesture-controller-c40c045a.js → gesture-controller-9436f482.js} +1 -0
  24. package/dist/cjs/{index-d1b59ffa.js → index-ee07ed59.js} +1 -1
  25. package/dist/cjs/index.cjs.js +3 -3
  26. package/dist/cjs/ion-action-sheet.cjs.entry.js +4 -4
  27. package/dist/cjs/ion-alert.cjs.entry.js +4 -4
  28. package/dist/cjs/ion-app_8.cjs.entry.js +2 -2
  29. package/dist/cjs/ion-backdrop.cjs.entry.js +0 -12
  30. package/dist/cjs/ion-button_2.cjs.entry.js +2 -2
  31. package/dist/cjs/ion-datetime-button.cjs.entry.js +1 -1
  32. package/dist/cjs/ion-datetime_3.cjs.entry.js +36 -56
  33. package/dist/cjs/ion-item-option_3.cjs.entry.js +1 -1
  34. package/dist/cjs/ion-loading.cjs.entry.js +2 -1
  35. package/dist/cjs/ion-menu_3.cjs.entry.js +3 -3
  36. package/dist/cjs/ion-modal.cjs.entry.js +3 -3
  37. package/dist/cjs/ion-nav_2.cjs.entry.js +1 -1
  38. package/dist/cjs/ion-picker-column-option.cjs.entry.js +104 -0
  39. package/dist/cjs/{ion-picker-column-internal.cjs.entry.js → ion-picker-column.cjs.entry.js} +104 -87
  40. package/dist/cjs/{ion-picker-internal.cjs.entry.js → ion-picker.cjs.entry.js} +26 -19
  41. package/dist/cjs/ion-popover.cjs.entry.js +2 -1
  42. package/dist/cjs/ion-radio_2.cjs.entry.js +1 -9
  43. package/dist/cjs/ion-range.cjs.entry.js +1 -1
  44. package/dist/cjs/ion-refresher_2.cjs.entry.js +3 -3
  45. package/dist/cjs/ion-reorder_2.cjs.entry.js +1 -1
  46. package/dist/cjs/ion-segment_2.cjs.entry.js +1 -1
  47. package/dist/cjs/ion-select_3.cjs.entry.js +2 -1
  48. package/dist/cjs/ion-toast.cjs.entry.js +3 -3
  49. package/dist/cjs/ion-toggle.cjs.entry.js +1 -1
  50. package/dist/cjs/ionic.cjs.js +1 -1
  51. package/dist/cjs/loader.cjs.js +1 -1
  52. package/dist/cjs/{overlays-e77cc023.js → overlays-7773cbe1.js} +11 -4
  53. package/dist/cjs/{swipe-back-2a858bbd.js → swipe-back-b8f2330b.js} +2 -2
  54. package/dist/collection/collection-manifest.json +7 -6
  55. package/dist/collection/components/backdrop/backdrop.js +0 -12
  56. package/dist/collection/components/button/button.ios.css +1 -1
  57. package/dist/collection/components/button/button.md.css +1 -1
  58. package/dist/collection/components/button/test/wrap/button.e2e.js +12 -24
  59. package/dist/collection/components/content/content.css +0 -4
  60. package/dist/collection/components/datetime/datetime.ios.css +91 -38
  61. package/dist/collection/components/datetime/datetime.js +24 -36
  62. package/dist/collection/components/datetime/datetime.md.css +96 -38
  63. package/dist/collection/components/datetime/test/a11y/datetime.e2e.js +1 -1
  64. package/dist/collection/components/datetime/test/a11y/datetime.spec.js +6 -9
  65. package/dist/collection/components/datetime/test/basic/datetime.e2e.js +10 -0
  66. package/dist/collection/components/datetime/test/datetime.e2e.js +2 -2
  67. package/dist/collection/components/datetime/test/disabled/datetime.spec.js +4 -4
  68. package/dist/collection/components/datetime/test/locale/datetime.e2e.js +2 -2
  69. package/dist/collection/components/datetime/test/minmax/datetime.e2e.js +6 -6
  70. package/dist/collection/components/datetime/test/month-year-picker/datetime.e2e.js +1 -1
  71. package/dist/collection/components/datetime/test/prefer-wheel/datetime.e2e.js +43 -41
  72. package/dist/collection/components/datetime/test/presentation/datetime.e2e.js +1 -1
  73. package/dist/collection/components/datetime/test/readonly/datetime.e2e.js +4 -4
  74. package/dist/collection/components/datetime/test/values/datetime.e2e.js +15 -12
  75. package/dist/collection/components/datetime/utils/data.js +1 -1
  76. package/dist/collection/components/picker/picker.ios.css +112 -211
  77. package/dist/collection/components/picker/picker.js +472 -744
  78. package/dist/collection/components/picker/picker.md.css +108 -198
  79. package/dist/collection/components/{picker-internal/test/a11y/picker-internal.e2e.js → picker/test/a11y/picker.e2e.js} +2 -2
  80. package/dist/collection/components/picker/test/basic/picker.e2e.js +99 -13
  81. package/dist/collection/components/picker/test/custom/picker.e2e.js +85 -0
  82. package/dist/collection/components/{picker-internal/test/keyboard-entry/picker-internal.e2e.js → picker/test/keyboard-entry/picker.e2e.js} +63 -32
  83. package/dist/collection/components/{picker-column-internal/picker-column-internal.md.css → picker-column/picker-column.css} +96 -83
  84. package/dist/collection/components/picker-column/picker-column.js +497 -335
  85. package/dist/collection/components/{picker-column-internal/test/basic/picker-column-internal.e2e.js → picker-column/test/basic/picker-column.e2e.js} +8 -8
  86. package/dist/collection/components/picker-column/test/disabled/picker-column.e2e.js +91 -0
  87. package/dist/collection/components/picker-column/test/slots/picker-column.e2e.js +39 -0
  88. package/dist/collection/components/picker-column-option/picker-column-option.ios.css +87 -0
  89. package/dist/collection/components/picker-column-option/picker-column-option.js +173 -0
  90. package/dist/collection/components/{picker-column-internal/picker-column-internal.ios.css → picker-column-option/picker-column-option.md.css} +6 -53
  91. package/dist/collection/components/picker-column-option/test/a11y/picker-column-option.e2e.js +18 -0
  92. package/dist/collection/components/picker-column-option/test/basic/picker-column-option.e2e.js +37 -0
  93. package/dist/collection/components/picker-column-option/test/picker-column-option.spec.js +29 -0
  94. package/dist/collection/components/{picker-internal/picker-internal.md.css → picker-legacy/picker.ios.css} +207 -98
  95. package/dist/collection/components/picker-legacy/picker.js +817 -0
  96. package/dist/collection/components/{picker-internal/picker-internal.ios.css → picker-legacy/picker.md.css} +192 -100
  97. package/dist/collection/components/picker-legacy/test/basic/picker.e2e.js +25 -0
  98. package/dist/collection/components/{picker → picker-legacy}/test/is-open/picker.e2e.js +4 -4
  99. package/dist/collection/components/{picker → picker-legacy}/test/picker-id.spec.js +5 -5
  100. package/dist/collection/components/{picker → picker-legacy}/test/trigger/picker.e2e.js +1 -1
  101. package/dist/collection/components/picker-legacy-column/picker-column.js +419 -0
  102. package/dist/collection/components/{picker-column → picker-legacy-column}/test/picker-column-aria.spec.js +3 -3
  103. package/dist/collection/components/{picker-column → picker-legacy-column}/test/picker-column-dynamic.spec.js +2 -2
  104. package/dist/collection/components/{picker-column → picker-legacy-column}/test/picker-column.spec.js +2 -2
  105. package/dist/collection/components/{picker-column → picker-legacy-column}/test/standalone/picker-column.e2e.js +3 -3
  106. package/dist/collection/components/radio-group/radio-group.js +1 -9
  107. package/dist/collection/utils/gesture/gesture-controller.js +1 -1
  108. package/dist/collection/utils/overlays.js +11 -4
  109. package/dist/collection/utils/test/overlays/overlays-scroll-blocking.spec.js +65 -0
  110. package/dist/docs.json +478 -41
  111. package/dist/esm/{button-active-308d3edd.js → button-active-48379dd2.js} +1 -1
  112. package/dist/esm/{data-775093f5.js → data-6a31d701.js} +1 -1
  113. package/dist/esm/{gesture-controller-1bf57181.js → gesture-controller-314a54f6.js} +1 -1
  114. package/dist/esm/{index-2cf77112.js → index-39782642.js} +2 -2
  115. package/dist/esm/index.js +3 -3
  116. package/dist/esm/ion-action-sheet.entry.js +4 -4
  117. package/dist/esm/ion-alert.entry.js +4 -4
  118. package/dist/esm/ion-app_8.entry.js +2 -2
  119. package/dist/esm/ion-backdrop.entry.js +0 -12
  120. package/dist/esm/ion-button_2.entry.js +2 -2
  121. package/dist/esm/ion-datetime-button.entry.js +1 -1
  122. package/dist/esm/ion-datetime_3.entry.js +35 -55
  123. package/dist/esm/ion-item-option_3.entry.js +1 -1
  124. package/dist/esm/ion-loading.entry.js +2 -1
  125. package/dist/esm/ion-menu_3.entry.js +3 -3
  126. package/dist/esm/ion-modal.entry.js +3 -3
  127. package/dist/esm/ion-nav_2.entry.js +1 -1
  128. package/dist/esm/ion-picker-column-option.entry.js +100 -0
  129. package/dist/esm/{ion-picker-column-internal.entry.js → ion-picker-column.entry.js} +104 -87
  130. package/dist/esm/{ion-picker-internal.entry.js → ion-picker.entry.js} +26 -19
  131. package/dist/esm/ion-popover.entry.js +2 -1
  132. package/dist/esm/ion-radio_2.entry.js +1 -9
  133. package/dist/esm/ion-range.entry.js +1 -1
  134. package/dist/esm/ion-refresher_2.entry.js +3 -3
  135. package/dist/esm/ion-reorder_2.entry.js +1 -1
  136. package/dist/esm/ion-segment_2.entry.js +1 -1
  137. package/dist/esm/ion-select_3.entry.js +2 -1
  138. package/dist/esm/ion-toast.entry.js +3 -3
  139. package/dist/esm/ion-toggle.entry.js +1 -1
  140. package/dist/esm/ionic.js +1 -1
  141. package/dist/esm/loader.js +1 -1
  142. package/dist/esm/{overlays-b33f6bca.js → overlays-94dac1cb.js} +11 -4
  143. package/dist/esm/{swipe-back-a6f386fc.js → swipe-back-a8ca7f93.js} +2 -2
  144. package/dist/esm-es5/{button-active-308d3edd.js → button-active-48379dd2.js} +1 -1
  145. package/dist/esm-es5/{gesture-controller-1bf57181.js → gesture-controller-314a54f6.js} +1 -1
  146. package/dist/esm-es5/{index-2cf77112.js → index-39782642.js} +1 -1
  147. package/dist/esm-es5/index.js +1 -1
  148. package/dist/esm-es5/ion-action-sheet.entry.js +1 -1
  149. package/dist/esm-es5/ion-alert.entry.js +1 -1
  150. package/dist/esm-es5/ion-app_8.entry.js +1 -1
  151. package/dist/esm-es5/ion-backdrop.entry.js +1 -1
  152. package/dist/esm-es5/ion-button_2.entry.js +1 -1
  153. package/dist/esm-es5/ion-datetime-button.entry.js +1 -1
  154. package/dist/esm-es5/ion-datetime_3.entry.js +1 -1
  155. package/dist/esm-es5/ion-item-option_3.entry.js +1 -1
  156. package/dist/esm-es5/ion-loading.entry.js +1 -1
  157. package/dist/esm-es5/ion-menu_3.entry.js +1 -1
  158. package/dist/esm-es5/ion-modal.entry.js +1 -1
  159. package/dist/esm-es5/ion-nav_2.entry.js +1 -1
  160. package/dist/esm-es5/ion-picker-column-option.entry.js +4 -0
  161. package/dist/esm-es5/ion-picker-column.entry.js +4 -0
  162. package/dist/esm-es5/ion-picker.entry.js +4 -0
  163. package/dist/esm-es5/ion-popover.entry.js +1 -1
  164. package/dist/esm-es5/ion-radio_2.entry.js +1 -1
  165. package/dist/esm-es5/ion-range.entry.js +1 -1
  166. package/dist/esm-es5/ion-refresher_2.entry.js +1 -1
  167. package/dist/esm-es5/ion-reorder_2.entry.js +1 -1
  168. package/dist/esm-es5/ion-segment_2.entry.js +1 -1
  169. package/dist/esm-es5/ion-select_3.entry.js +1 -1
  170. package/dist/esm-es5/ion-toast.entry.js +1 -1
  171. package/dist/esm-es5/ion-toggle.entry.js +1 -1
  172. package/dist/esm-es5/ionic.js +1 -1
  173. package/dist/esm-es5/loader.js +1 -1
  174. package/dist/esm-es5/overlays-94dac1cb.js +4 -0
  175. package/dist/esm-es5/swipe-back-a8ca7f93.js +4 -0
  176. package/dist/html.html-data.json +152 -1
  177. package/dist/ionic/index.esm.js +1 -1
  178. package/dist/ionic/ionic.esm.js +1 -1
  179. package/dist/ionic/{p-254ec7c0.system.entry.js → p-0dfa4ab4.system.entry.js} +2 -2
  180. package/dist/ionic/{p-96d4814f.system.entry.js → p-0e908476.system.entry.js} +1 -1
  181. package/dist/ionic/{p-11786dc7.entry.js → p-10339dcc.entry.js} +1 -1
  182. package/dist/ionic/{p-f6e9c227.system.js → p-11c55ac8.system.js} +1 -1
  183. package/dist/ionic/{p-f2bfd3d7.entry.js → p-13d4dfe7.entry.js} +1 -1
  184. package/dist/ionic/p-19d9ceb8.system.js +1 -1
  185. package/dist/ionic/{p-afa9f205.system.js → p-1ab2642a.system.js} +1 -1
  186. package/dist/ionic/{p-11a3973f.entry.js → p-1b14f0f8.entry.js} +1 -1
  187. package/dist/ionic/{p-0235067a.js → p-1b60cc53.js} +1 -1
  188. package/dist/ionic/{p-c5acfeb1.entry.js → p-20755eb0.entry.js} +1 -1
  189. package/dist/ionic/{p-c7c8429a.system.js → p-20d469d0.system.js} +1 -1
  190. package/dist/ionic/{p-6b0ce9b4.system.entry.js → p-25312768.system.entry.js} +1 -1
  191. package/dist/ionic/p-26ff1180.entry.js +4 -0
  192. package/dist/ionic/p-2f449cdf.system.entry.js +4 -0
  193. package/dist/ionic/p-3717e641.system.entry.js +4 -0
  194. package/dist/ionic/{p-745e3339.system.entry.js → p-3af5faf8.system.entry.js} +1 -1
  195. package/dist/ionic/{p-dc71e4ef.system.entry.js → p-3b434dee.system.entry.js} +1 -1
  196. package/dist/ionic/{p-31b2326e.system.js → p-3e1e14d9.system.js} +1 -1
  197. package/dist/ionic/{p-a42ef163.system.entry.js → p-4793c14c.system.entry.js} +1 -1
  198. package/dist/ionic/p-51abefb7.system.js +4 -0
  199. package/dist/ionic/{p-10ec9af7.system.entry.js → p-5ff211d0.system.entry.js} +1 -1
  200. package/dist/ionic/{p-1b27ac67.entry.js → p-642ac927.entry.js} +1 -1
  201. package/dist/ionic/{p-a821750c.system.entry.js → p-6e4c7340.system.entry.js} +1 -1
  202. package/dist/ionic/p-71483cbb.entry.js +4 -0
  203. package/dist/ionic/p-75a3e35b.entry.js +4 -0
  204. package/dist/ionic/p-77d78f68.system.entry.js +4 -0
  205. package/dist/ionic/{p-06abe918.system.entry.js → p-7be412e8.system.entry.js} +1 -1
  206. package/dist/ionic/p-7c0d778d.system.js +4 -0
  207. package/dist/ionic/{p-c1701827.entry.js → p-80c6c078.entry.js} +1 -1
  208. package/dist/ionic/p-8ad6d643.entry.js +4 -0
  209. package/dist/ionic/{p-648ad047.system.entry.js → p-8ce4e506.system.entry.js} +1 -1
  210. package/dist/ionic/{p-f5d2dc9b.js → p-8ededb41.js} +1 -1
  211. package/dist/ionic/p-9164a09d.entry.js +4 -0
  212. package/dist/ionic/{p-b964aba3.entry.js → p-92bfb607.entry.js} +1 -1
  213. package/dist/ionic/{p-f894e0ad.entry.js → p-92d35b6a.entry.js} +1 -1
  214. package/dist/ionic/{p-9fda6824.system.entry.js → p-964dcdb2.system.entry.js} +1 -1
  215. package/dist/ionic/{p-bb3615f7.js → p-9b97df10.js} +1 -1
  216. package/dist/ionic/p-a1bd098f.system.entry.js +4 -0
  217. package/dist/ionic/p-a41eaff2.system.entry.js +4 -0
  218. package/dist/ionic/p-a60a1ce5.js +4 -0
  219. package/dist/ionic/{p-2a583966.entry.js → p-b2b5d761.entry.js} +1 -1
  220. package/dist/ionic/{p-767f1a92.entry.js → p-ba5d9e27.entry.js} +1 -1
  221. package/dist/ionic/{p-3e8d5e53.entry.js → p-bb3fd397.entry.js} +1 -1
  222. package/dist/ionic/{p-a3ca2e64.entry.js → p-bec6ae40.entry.js} +1 -1
  223. package/dist/ionic/{p-2df97906.system.entry.js → p-beed2450.system.entry.js} +1 -1
  224. package/dist/ionic/p-c001b24f.entry.js +4 -0
  225. package/dist/ionic/{p-2894d5f6.entry.js → p-c01803db.entry.js} +1 -1
  226. package/dist/ionic/p-c19bf524.entry.js +4 -0
  227. package/dist/ionic/p-c6176849.system.entry.js +4 -0
  228. package/dist/ionic/p-cf350317.entry.js +4 -0
  229. package/dist/ionic/{p-bdf71399.entry.js → p-cf53213c.entry.js} +1 -1
  230. package/dist/ionic/{p-28740823.system.entry.js → p-d2634efe.system.entry.js} +1 -1
  231. package/dist/ionic/{p-ddd48faf.system.entry.js → p-db05ecb6.system.entry.js} +1 -1
  232. package/dist/ionic/p-dc63dccb.system.entry.js +4 -0
  233. package/dist/ionic/{p-22827063.system.entry.js → p-e2737fef.system.entry.js} +1 -1
  234. package/dist/ionic/{p-aee39e06.entry.js → p-ed8402d6.entry.js} +1 -1
  235. package/dist/ionic/p-f0717d98.js +4 -0
  236. package/dist/ionic/p-f0dea903.system.entry.js +4 -0
  237. package/dist/ionic/p-f60807dd.system.entry.js +4 -0
  238. package/dist/ionic/p-f8c5008f.entry.js +4 -0
  239. package/dist/types/components/backdrop/backdrop.d.ts +0 -3
  240. package/dist/types/components/datetime/datetime.d.ts +0 -1
  241. package/dist/types/components/datetime/utils/data.d.ts +11 -7
  242. package/dist/types/components/menu/menu.d.ts +1 -1
  243. package/dist/types/components/picker/picker-interfaces.d.ts +8 -0
  244. package/dist/types/components/picker/picker.d.ts +75 -129
  245. package/dist/types/components/picker-column/picker-column-interfaces.d.ts +4 -0
  246. package/dist/types/components/picker-column/picker-column.d.ts +99 -39
  247. package/dist/types/components/picker-column-option/picker-column-option.d.ts +66 -0
  248. package/dist/types/components/picker-legacy/picker.d.ts +158 -0
  249. package/dist/types/components/picker-legacy-column/picker-column.d.ts +46 -0
  250. package/dist/types/components.d.ts +154 -122
  251. package/dist/types/interface.d.ts +1 -1
  252. package/dist/types/utils/config.d.ts +2 -2
  253. package/dist/types/utils/gesture/gesture-controller.d.ts +1 -0
  254. package/dist/types/utils/overlays.d.ts +5 -2
  255. package/hydrate/index.js +1497 -1404
  256. package/package.json +1 -1
  257. package/components/ion-picker-column-internal.d.ts +0 -11
  258. package/components/ion-picker-column-internal.js +0 -9
  259. package/components/ion-picker-internal.js +0 -9
  260. package/components/picker-column-internal.js +0 -390
  261. package/dist/collection/components/picker-column-internal/picker-column-internal.js +0 -565
  262. package/dist/collection/components/picker-column-internal/test/disabled/picker-column-internal.e2e.js +0 -162
  263. package/dist/collection/components/picker-internal/picker-internal.js +0 -544
  264. package/dist/collection/components/picker-internal/test/basic/picker-internal.e2e.js +0 -118
  265. package/dist/esm-es5/ion-picker-column-internal.entry.js +0 -4
  266. package/dist/esm-es5/ion-picker-internal.entry.js +0 -4
  267. package/dist/esm-es5/overlays-b33f6bca.js +0 -4
  268. package/dist/esm-es5/swipe-back-a6f386fc.js +0 -4
  269. package/dist/ionic/p-12a62500.entry.js +0 -4
  270. package/dist/ionic/p-1c249831.entry.js +0 -4
  271. package/dist/ionic/p-35ce400e.system.js +0 -4
  272. package/dist/ionic/p-3671f1b9.system.js +0 -4
  273. package/dist/ionic/p-47bb15a1.entry.js +0 -4
  274. package/dist/ionic/p-4d145435.entry.js +0 -4
  275. package/dist/ionic/p-507ddbfe.system.entry.js +0 -4
  276. package/dist/ionic/p-6a6477b2.js +0 -4
  277. package/dist/ionic/p-6ab03751.js +0 -4
  278. package/dist/ionic/p-6c277fa2.system.entry.js +0 -4
  279. package/dist/ionic/p-6fba0ce1.system.entry.js +0 -4
  280. package/dist/ionic/p-7dc892f8.entry.js +0 -4
  281. package/dist/ionic/p-85f48531.entry.js +0 -4
  282. package/dist/ionic/p-8f301ac5.system.entry.js +0 -4
  283. package/dist/ionic/p-932f2259.system.entry.js +0 -4
  284. package/dist/ionic/p-b1f29949.system.entry.js +0 -4
  285. package/dist/ionic/p-b7a2ffc9.system.entry.js +0 -4
  286. package/dist/ionic/p-cd1b920b.entry.js +0 -4
  287. package/dist/ionic/p-da5e2652.entry.js +0 -4
  288. package/dist/ionic/p-ec652bc0.system.entry.js +0 -4
  289. package/dist/types/components/picker-column-internal/picker-column-internal-interfaces.d.ts +0 -5
  290. package/dist/types/components/picker-column-internal/picker-column-internal.d.ts +0 -102
  291. package/dist/types/components/picker-internal/picker-internal-interfaces.d.ts +0 -8
  292. package/dist/types/components/picker-internal/picker-internal.d.ts +0 -102
  293. /package/dist/collection/components/{picker-internal/picker-internal-interfaces.js → picker/picker-interfaces.js} +0 -0
  294. /package/dist/collection/components/{picker-column-internal/picker-column-internal-interfaces.js → picker-column/picker-column-interfaces.js} +0 -0
  295. /package/dist/collection/components/{picker → picker-legacy}/animations/ios.enter.js +0 -0
  296. /package/dist/collection/components/{picker → picker-legacy}/animations/ios.leave.js +0 -0
  297. /package/dist/collection/components/{picker → picker-legacy}/picker-interface.js +0 -0
  298. /package/dist/collection/components/{picker-column → picker-legacy-column}/picker-column.ios.css +0 -0
  299. /package/dist/collection/components/{picker-column → picker-legacy-column}/picker-column.md.css +0 -0
  300. /package/dist/collection/components/{picker-column → picker-legacy-column}/test/test.utils.js +0 -0
  301. /package/dist/esm-es5/{data-775093f5.js → data-6a31d701.js} +0 -0
  302. /package/dist/ionic/{p-87bb3735.system.js → p-7ff4359e.system.js} +0 -0
  303. /package/dist/ionic/{p-18cae04f.js → p-a64accf5.js} +0 -0
  304. /package/dist/types/components/{picker → picker-legacy}/animations/ios.enter.d.ts +0 -0
  305. /package/dist/types/components/{picker → picker-legacy}/animations/ios.leave.d.ts +0 -0
  306. /package/dist/types/components/{picker → picker-legacy}/picker-interface.d.ts +0 -0
  307. /package/dist/types/components/{picker-column → picker-legacy-column}/test/test.utils.d.ts +0 -0
@@ -2,366 +2,395 @@
2
2
  * (C) Ionic http://ionicframework.com - MIT License
3
3
  */
4
4
  import { proxyCustomElement, HTMLElement, createEvent, h, Host } from '@stencil/core/internal/client';
5
- import { m as clamp } from './helpers.js';
6
- import { b as hapticSelectionChanged, h as hapticSelectionEnd, a as hapticSelectionStart } from './haptic.js';
7
- import { g as getClassMap } from './theme.js';
8
- import { b as getIonMode } from './ionic-global.js';
5
+ import { d as doc } from './index5.js';
6
+ import { r as raf, g as getElementRoot } from './helpers.js';
7
+ import { a as hapticSelectionStart, b as hapticSelectionChanged, h as hapticSelectionEnd } from './haptic.js';
8
+ import { a as isPlatform, b as getIonMode } from './ionic-global.js';
9
+ import { c as createColorClasses } from './theme.js';
9
10
 
10
- const pickerColumnIosCss = ".picker-col{display:-ms-flexbox;display:flex;position:relative;-ms-flex:1;flex:1;-ms-flex-pack:center;justify-content:center;height:100%;-webkit-box-sizing:content-box;box-sizing:content-box;contain:content}.picker-opts{position:relative;-ms-flex:1;flex:1;max-width:100%}.picker-opt{top:0;display:block;position:absolute;width:100%;border:0;text-align:center;text-overflow:ellipsis;white-space:nowrap;contain:strict;overflow:hidden;will-change:transform}@supports (inset-inline-start: 0){.picker-opt{inset-inline-start:0}}@supports not (inset-inline-start: 0){.picker-opt{left:0}:host-context([dir=rtl]) .picker-opt{left:unset;right:unset;right:0}[dir=rtl] .picker-opt{left:unset;right:unset;right:0}@supports selector(:dir(rtl)){.picker-opt:dir(rtl){left:unset;right:unset;right:0}}}.picker-opt.picker-opt-disabled{pointer-events:none}.picker-opt-disabled{opacity:0}.picker-opts-left{-ms-flex-pack:start;justify-content:flex-start}.picker-opts-right{-ms-flex-pack:end;justify-content:flex-end}.picker-opt:active,.picker-opt:focus{outline:none}.picker-prefix{position:relative;-ms-flex:1;flex:1;text-align:end;white-space:nowrap}.picker-suffix{position:relative;-ms-flex:1;flex:1;text-align:start;white-space:nowrap}.picker-col{-webkit-padding-start:4px;padding-inline-start:4px;-webkit-padding-end:4px;padding-inline-end:4px;padding-top:0;padding-bottom:0;-webkit-transform-style:preserve-3d;transform-style:preserve-3d}.picker-prefix,.picker-suffix,.picker-opts{top:77px;-webkit-transform-style:preserve-3d;transform-style:preserve-3d;color:inherit;font-size:20px;line-height:42px;pointer-events:none}.picker-opt{padding-left:0;padding-right:0;padding-top:0;padding-bottom:0;margin-left:0;margin-right:0;margin-top:0;margin-bottom:0;-webkit-transform-origin:center center;transform-origin:center center;height:46px;-webkit-transform-style:preserve-3d;transform-style:preserve-3d;-webkit-transition-timing-function:ease-out;transition-timing-function:ease-out;background:transparent;color:inherit;font-size:20px;line-height:42px;-webkit-backface-visibility:hidden;backface-visibility:hidden;pointer-events:auto}:host-context([dir=rtl]) .picker-opt{-webkit-transform-origin:calc(100% - center) center;transform-origin:calc(100% - center) center}[dir=rtl] .picker-opt{-webkit-transform-origin:calc(100% - center) center;transform-origin:calc(100% - center) center}@supports selector(:dir(rtl)){.picker-opt:dir(rtl){-webkit-transform-origin:calc(100% - center) center;transform-origin:calc(100% - center) center}}";
11
+ const pickerColumnCss = ":host{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center;max-width:100%;height:200px;font-size:22px;text-align:center}.picker-opts{-webkit-padding-start:16px;padding-inline-start:16px;-webkit-padding-end:16px;padding-inline-end:16px;padding-top:0px;padding-bottom:0px;min-width:26px;max-height:200px;outline:none;text-align:inherit;-webkit-scroll-snap-type:y mandatory;-ms-scroll-snap-type:y mandatory;scroll-snap-type:y mandatory;overflow-x:hidden;overflow-y:scroll;scrollbar-width:none}.picker-item-empty{padding-left:0;padding-right:0;padding-top:0;padding-bottom:0;margin-left:0;margin-right:0;margin-top:0;margin-bottom:0;display:block;width:100%;height:34px;border:0px;outline:none;background:transparent;color:inherit;font-family:var(--ion-font-family, inherit);font-size:inherit;line-height:34px;text-align:inherit;text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.picker-opts::-webkit-scrollbar{display:none}::slotted(ion-picker-column-option){display:block;scroll-snap-align:center}.picker-item-empty,:host(:not([disabled])) ::slotted(ion-picker-column-option.option-disabled){scroll-snap-align:none}::slotted([slot=prefix]),::slotted([slot=suffix]){max-width:200px;text-overflow:ellipsis;white-space:nowrap;overflow:hidden}::slotted([slot=prefix]){-webkit-padding-start:16px;padding-inline-start:16px;-webkit-padding-end:16px;padding-inline-end:16px;padding-top:0;padding-bottom:0;-ms-flex-pack:end;justify-content:end}::slotted([slot=suffix]){-webkit-padding-start:16px;padding-inline-start:16px;-webkit-padding-end:16px;padding-inline-end:16px;padding-top:0;padding-bottom:0;-ms-flex-pack:start;justify-content:start}:host(.picker-column-disabled) .picker-opts{overflow-y:hidden}:host(.picker-column-disabled) ::slotted(ion-picker-column-option){cursor:default;opacity:0.4;pointer-events:none}@media (any-hover: hover){:host(:focus) .picker-opts{outline:none;background:rgba(var(--ion-color-base-rgb), 0.2)}}";
11
12
 
12
- const pickerColumnMdCss = ".picker-col{display:-ms-flexbox;display:flex;position:relative;-ms-flex:1;flex:1;-ms-flex-pack:center;justify-content:center;height:100%;-webkit-box-sizing:content-box;box-sizing:content-box;contain:content}.picker-opts{position:relative;-ms-flex:1;flex:1;max-width:100%}.picker-opt{top:0;display:block;position:absolute;width:100%;border:0;text-align:center;text-overflow:ellipsis;white-space:nowrap;contain:strict;overflow:hidden;will-change:transform}@supports (inset-inline-start: 0){.picker-opt{inset-inline-start:0}}@supports not (inset-inline-start: 0){.picker-opt{left:0}:host-context([dir=rtl]) .picker-opt{left:unset;right:unset;right:0}[dir=rtl] .picker-opt{left:unset;right:unset;right:0}@supports selector(:dir(rtl)){.picker-opt:dir(rtl){left:unset;right:unset;right:0}}}.picker-opt.picker-opt-disabled{pointer-events:none}.picker-opt-disabled{opacity:0}.picker-opts-left{-ms-flex-pack:start;justify-content:flex-start}.picker-opts-right{-ms-flex-pack:end;justify-content:flex-end}.picker-opt:active,.picker-opt:focus{outline:none}.picker-prefix{position:relative;-ms-flex:1;flex:1;text-align:end;white-space:nowrap}.picker-suffix{position:relative;-ms-flex:1;flex:1;text-align:start;white-space:nowrap}.picker-col{-webkit-padding-start:8px;padding-inline-start:8px;-webkit-padding-end:8px;padding-inline-end:8px;padding-top:0;padding-bottom:0;-webkit-transform-style:preserve-3d;transform-style:preserve-3d}.picker-prefix,.picker-suffix,.picker-opts{top:77px;-webkit-transform-style:preserve-3d;transform-style:preserve-3d;color:inherit;font-size:22px;line-height:42px;pointer-events:none}.picker-opt{margin-left:0;margin-right:0;margin-top:0;margin-bottom:0;padding-left:0;padding-right:0;padding-top:0;padding-bottom:0;height:43px;-webkit-transition-timing-function:ease-out;transition-timing-function:ease-out;background:transparent;color:inherit;font-size:22px;line-height:42px;-webkit-backface-visibility:hidden;backface-visibility:hidden;pointer-events:auto}.picker-prefix,.picker-suffix,.picker-opt.picker-opt-selected{color:var(--ion-color-primary, #3880ff)}";
13
-
14
- const PickerColumnCmp = /*@__PURE__*/ proxyCustomElement(class PickerColumnCmp extends HTMLElement {
13
+ const PickerColumn = /*@__PURE__*/ proxyCustomElement(class PickerColumn extends HTMLElement {
15
14
  constructor() {
16
15
  super();
17
16
  this.__registerHost();
18
- this.ionPickerColChange = createEvent(this, "ionPickerColChange", 7);
19
- this.optHeight = 0;
20
- this.rotateFactor = 0;
21
- this.scaleFactor = 1;
22
- this.velocity = 0;
23
- this.y = 0;
24
- this.noAnimate = true;
25
- // `colDidChange` is a flag that gets set when the column is changed
26
- // dynamically. When this flag is set, the column will refresh
27
- // after the component re-renders to incorporate the new column data.
28
- // This is necessary because `this.refresh` queries for the option elements,
29
- // so it needs to wait for the latest elements to be available in the DOM.
30
- // Ex: column is created with 3 options. User updates the column data
31
- // to have 5 options. The column will still think it only has 3 options.
32
- this.colDidChange = false;
33
- this.col = undefined;
34
- }
35
- colChanged() {
36
- this.colDidChange = true;
37
- }
38
- async connectedCallback() {
39
- let pickerRotateFactor = 0;
40
- let pickerScaleFactor = 0.81;
41
- const mode = getIonMode(this);
42
- if (mode === 'ios') {
43
- pickerRotateFactor = -0.46;
44
- pickerScaleFactor = 1;
45
- }
46
- this.rotateFactor = pickerRotateFactor;
47
- this.scaleFactor = pickerScaleFactor;
48
- this.gesture = (await import('./index3.js')).createGesture({
49
- el: this.el,
50
- gestureName: 'picker-swipe',
51
- gesturePriority: 100,
52
- threshold: 0,
53
- passive: false,
54
- onStart: (ev) => this.onStart(ev),
55
- onMove: (ev) => this.onMove(ev),
56
- onEnd: (ev) => this.onEnd(ev),
57
- });
58
- this.gesture.enable();
59
- // Options have not been initialized yet
60
- // Animation must be disabled through the `noAnimate` flag
61
- // Otherwise, the options will render
62
- // at the top of the column and transition down
63
- this.tmrId = setTimeout(() => {
64
- this.noAnimate = false;
65
- // After initialization, `refresh()` will be called
66
- // At this point, animation will be enabled. The options will
67
- // animate as they are being selected.
68
- this.refresh(true);
69
- }, 250);
70
- }
71
- componentDidLoad() {
72
- this.onDomChange();
73
- }
74
- componentDidUpdate() {
75
- // Options may have changed since last update.
76
- if (this.colDidChange) {
77
- // Animation must be disabled through the `onDomChange` parameter.
78
- // Otherwise, the recently added options will render
79
- // at the top of the column and transition down
80
- this.onDomChange(true, false);
81
- this.colDidChange = false;
82
- }
83
- }
84
- disconnectedCallback() {
85
- if (this.rafId !== undefined)
86
- cancelAnimationFrame(this.rafId);
87
- if (this.tmrId)
88
- clearTimeout(this.tmrId);
89
- if (this.gesture) {
90
- this.gesture.destroy();
91
- this.gesture = undefined;
92
- }
93
- }
94
- emitColChange() {
95
- this.ionPickerColChange.emit(this.col);
96
- }
97
- setSelected(selectedIndex, duration) {
98
- // if there is a selected index, then figure out it's y position
99
- // if there isn't a selected index, then just use the top y position
100
- const y = selectedIndex > -1 ? -(selectedIndex * this.optHeight) : 0;
101
- this.velocity = 0;
102
- // set what y position we're at
103
- if (this.rafId !== undefined)
104
- cancelAnimationFrame(this.rafId);
105
- this.update(y, duration, true);
106
- this.emitColChange();
107
- }
108
- update(y, duration, saveY) {
109
- if (!this.optsEl) {
110
- return;
111
- }
112
- // ensure we've got a good round number :)
113
- let translateY = 0;
114
- let translateZ = 0;
115
- const { col, rotateFactor } = this;
116
- const prevSelected = col.selectedIndex;
117
- const selectedIndex = (col.selectedIndex = this.indexForY(-y));
118
- const durationStr = duration === 0 ? '' : duration + 'ms';
119
- const scaleStr = `scale(${this.scaleFactor})`;
120
- const children = this.optsEl.children;
121
- for (let i = 0; i < children.length; i++) {
122
- const button = children[i];
123
- const opt = col.options[i];
124
- const optOffset = i * this.optHeight + y;
125
- let transform = '';
126
- if (rotateFactor !== 0) {
127
- const rotateX = optOffset * rotateFactor;
128
- if (Math.abs(rotateX) <= 90) {
129
- translateY = 0;
130
- translateZ = 90;
131
- transform = `rotateX(${rotateX}deg) `;
132
- }
133
- else {
134
- translateY = -9999;
17
+ this.__attachShadow();
18
+ this.ionChange = createEvent(this, "ionChange", 7);
19
+ this.isScrolling = false;
20
+ this.isColumnVisible = false;
21
+ this.canExitInputMode = true;
22
+ this.centerPickerItemInView = (target, smooth = true, canExitInputMode = true) => {
23
+ const { isColumnVisible, scrollEl } = this;
24
+ if (isColumnVisible && scrollEl) {
25
+ // (Vertical offset from parent) - (three empty picker rows) + (half the height of the target to ensure the scroll triggers)
26
+ const top = target.offsetTop - 3 * target.clientHeight + target.clientHeight / 2;
27
+ if (scrollEl.scrollTop !== top) {
28
+ /**
29
+ * Setting this flag prevents input
30
+ * mode from exiting in the picker column's
31
+ * scroll callback. This is useful when the user manually
32
+ * taps an item or types on the keyboard as both
33
+ * of these can cause a scroll to occur.
34
+ */
35
+ this.canExitInputMode = canExitInputMode;
36
+ scrollEl.scroll({
37
+ top,
38
+ left: 0,
39
+ behavior: smooth ? 'smooth' : undefined,
40
+ });
135
41
  }
136
42
  }
137
- else {
138
- translateZ = 0;
139
- translateY = optOffset;
140
- }
141
- const selected = selectedIndex === i;
142
- transform += `translate3d(0px,${translateY}px,${translateZ}px) `;
143
- if (this.scaleFactor !== 1 && !selected) {
144
- transform += scaleStr;
43
+ };
44
+ this.setPickerItemActiveState = (item, isActive) => {
45
+ if (isActive) {
46
+ item.classList.add(PICKER_ITEM_ACTIVE_CLASS);
145
47
  }
146
- // Update transition duration
147
- if (this.noAnimate) {
148
- opt.duration = 0;
149
- button.style.transitionDuration = '';
150
- }
151
- else if (duration !== opt.duration) {
152
- opt.duration = duration;
153
- button.style.transitionDuration = durationStr;
48
+ else {
49
+ item.classList.remove(PICKER_ITEM_ACTIVE_CLASS);
154
50
  }
155
- // Update transform
156
- if (transform !== opt.transform) {
157
- opt.transform = transform;
51
+ };
52
+ /**
53
+ * When ionInputModeChange is emitted, each column
54
+ * needs to check if it is the one being made available
55
+ * for text entry.
56
+ */
57
+ this.inputModeChange = (ev) => {
58
+ if (!this.numericInput) {
59
+ return;
158
60
  }
159
- button.style.transform = transform;
61
+ const { useInputMode, inputModeColumn } = ev.detail;
160
62
  /**
161
- * Ensure that the select column
162
- * item has the selected class
63
+ * If inputModeColumn is undefined then this means
64
+ * all numericInput columns are being selected.
163
65
  */
164
- opt.selected = selected;
165
- if (selected) {
166
- button.classList.add(PICKER_OPT_SELECTED);
66
+ const isColumnActive = inputModeColumn === undefined || inputModeColumn === this.el;
67
+ if (!useInputMode || !isColumnActive) {
68
+ this.setInputModeActive(false);
69
+ return;
167
70
  }
168
- else {
169
- button.classList.remove(PICKER_OPT_SELECTED);
71
+ this.setInputModeActive(true);
72
+ };
73
+ /**
74
+ * Setting isActive will cause a re-render.
75
+ * As a result, we do not want to cause the
76
+ * re-render mid scroll as this will cause
77
+ * the picker column to jump back to
78
+ * whatever value was selected at the
79
+ * start of the scroll interaction.
80
+ */
81
+ this.setInputModeActive = (state) => {
82
+ if (this.isScrolling) {
83
+ this.scrollEndCallback = () => {
84
+ this.isActive = state;
85
+ };
86
+ return;
170
87
  }
171
- }
172
- this.col.prevSelected = prevSelected;
173
- if (saveY) {
174
- this.y = y;
175
- }
176
- if (this.lastIndex !== selectedIndex) {
177
- // have not set a last index yet
178
- hapticSelectionChanged();
179
- this.lastIndex = selectedIndex;
88
+ this.isActive = state;
89
+ };
90
+ /**
91
+ * When the column scrolls, the component
92
+ * needs to determine which item is centered
93
+ * in the view and will emit an ionChange with
94
+ * the item object.
95
+ */
96
+ this.initializeScrollListener = () => {
97
+ /**
98
+ * The haptics for the wheel picker are
99
+ * an iOS-only feature. As a result, they should
100
+ * be disabled on Android.
101
+ */
102
+ const enableHaptics = isPlatform('ios');
103
+ const { el, scrollEl } = this;
104
+ let timeout;
105
+ let activeEl = this.activeItem;
106
+ const scrollCallback = () => {
107
+ raf(() => {
108
+ if (!scrollEl)
109
+ return;
110
+ if (timeout) {
111
+ clearTimeout(timeout);
112
+ timeout = undefined;
113
+ }
114
+ if (!this.isScrolling) {
115
+ enableHaptics && hapticSelectionStart();
116
+ this.isScrolling = true;
117
+ }
118
+ /**
119
+ * Select item in the center of the column
120
+ * which is the month/year that we want to select
121
+ */
122
+ const bbox = scrollEl.getBoundingClientRect();
123
+ const centerX = bbox.x + bbox.width / 2;
124
+ const centerY = bbox.y + bbox.height / 2;
125
+ /**
126
+ * elementFromPoint returns the top-most element.
127
+ * This means that if an ion-backdrop is overlaying the
128
+ * picker then the appropriate picker column option will
129
+ * not be selected. To account for this, we use elementsFromPoint
130
+ * and use an Array.find to find the appropriate column option
131
+ * at that point.
132
+ *
133
+ * Additionally, the picker column could be used in the
134
+ * Shadow DOM (i.e. in ion-datetime) so we need to make
135
+ * sure we are choosing the correct host otherwise
136
+ * the elements returns by elementsFromPoint will be
137
+ * retargeted. To account for this, we check to see
138
+ * if the picker column has a parent shadow root. If
139
+ * so, we use that shadow root when doing elementsFromPoint.
140
+ * Otherwise, we just use the document.
141
+ */
142
+ const rootNode = el.getRootNode();
143
+ const hasParentShadow = rootNode instanceof ShadowRoot;
144
+ const referenceNode = hasParentShadow ? rootNode : doc;
145
+ /**
146
+ * If the reference node is undefined
147
+ * then it's likely that doc is undefined
148
+ * due to being in an SSR environment.
149
+ */
150
+ if (referenceNode === undefined) {
151
+ return;
152
+ }
153
+ const elementsAtPoint = referenceNode.elementsFromPoint(centerX, centerY);
154
+ /**
155
+ * elementsFromPoint can returns multiple elements
156
+ * so find the relevant picker column option if one exists.
157
+ */
158
+ const newActiveElement = elementsAtPoint.find((el) => el.tagName === 'ION-PICKER-COLUMN-OPTION');
159
+ if (activeEl !== undefined) {
160
+ this.setPickerItemActiveState(activeEl, false);
161
+ }
162
+ if (newActiveElement === undefined || newActiveElement.disabled) {
163
+ return;
164
+ }
165
+ /**
166
+ * If we are selecting a new value,
167
+ * we need to run haptics again.
168
+ */
169
+ if (newActiveElement !== activeEl) {
170
+ enableHaptics && hapticSelectionChanged();
171
+ if (this.canExitInputMode) {
172
+ /**
173
+ * The native iOS wheel picker
174
+ * only dismisses the keyboard
175
+ * once the selected item has changed
176
+ * as a result of a swipe
177
+ * from the user. If `canExitInputMode` is
178
+ * `false` then this means that the
179
+ * scroll is happening as a result of
180
+ * the `value` property programmatically changing
181
+ * either by an application or by the user via the keyboard.
182
+ */
183
+ this.exitInputMode();
184
+ }
185
+ }
186
+ activeEl = newActiveElement;
187
+ this.setPickerItemActiveState(newActiveElement, true);
188
+ timeout = setTimeout(() => {
189
+ this.isScrolling = false;
190
+ enableHaptics && hapticSelectionEnd();
191
+ /**
192
+ * Certain tasks (such as those that
193
+ * cause re-renders) should only be done
194
+ * once scrolling has finished, otherwise
195
+ * flickering may occur.
196
+ */
197
+ const { scrollEndCallback } = this;
198
+ if (scrollEndCallback) {
199
+ scrollEndCallback();
200
+ this.scrollEndCallback = undefined;
201
+ }
202
+ /**
203
+ * Reset this flag as the
204
+ * next scroll interaction could
205
+ * be a scroll from the user. In this
206
+ * case, we should exit input mode.
207
+ */
208
+ this.canExitInputMode = true;
209
+ this.setValue(newActiveElement.value);
210
+ }, 250);
211
+ });
212
+ };
213
+ /**
214
+ * Wrap this in an raf so that the scroll callback
215
+ * does not fire when component is initially shown.
216
+ */
217
+ raf(() => {
218
+ if (!scrollEl)
219
+ return;
220
+ scrollEl.addEventListener('scroll', scrollCallback);
221
+ this.destroyScrollListener = () => {
222
+ scrollEl.removeEventListener('scroll', scrollCallback);
223
+ };
224
+ });
225
+ };
226
+ /**
227
+ * Tells the parent picker to
228
+ * exit text entry mode. This is only called
229
+ * when the selected item changes during scroll, so
230
+ * we know that the user likely wants to scroll
231
+ * instead of type.
232
+ */
233
+ this.exitInputMode = () => {
234
+ const { parentEl } = this;
235
+ if (parentEl == null)
236
+ return;
237
+ parentEl.exitInputMode();
238
+ /**
239
+ * setInputModeActive only takes
240
+ * effect once scrolling stops to avoid
241
+ * a component re-render while scrolling.
242
+ * However, we want the visual active
243
+ * indicator to go away immediately, so
244
+ * we call classList.remove here.
245
+ */
246
+ this.el.classList.remove('picker-column-active');
247
+ };
248
+ this.isActive = false;
249
+ this.disabled = false;
250
+ this.value = undefined;
251
+ this.color = 'primary';
252
+ this.numericInput = false;
253
+ }
254
+ valueChange() {
255
+ if (this.isColumnVisible) {
256
+ /**
257
+ * Only scroll the active item into view when the picker column
258
+ * is actively visible to the user.
259
+ */
260
+ this.scrollActiveItemIntoView(true);
180
261
  }
181
262
  }
182
- decelerate() {
183
- if (this.velocity !== 0) {
184
- // still decelerating
185
- this.velocity *= DECELERATION_FRICTION;
186
- // do not let it go slower than a velocity of 1
187
- this.velocity = this.velocity > 0 ? Math.max(this.velocity, 1) : Math.min(this.velocity, -1);
188
- let y = this.y + this.velocity;
189
- if (y > this.minY) {
190
- // whoops, it's trying to scroll up farther than the options we have!
191
- y = this.minY;
192
- this.velocity = 0;
193
- }
194
- else if (y < this.maxY) {
195
- // gahh, it's trying to scroll down farther than we can!
196
- y = this.maxY;
197
- this.velocity = 0;
198
- }
199
- this.update(y, 0, true);
200
- const notLockedIn = Math.round(y) % this.optHeight !== 0 || Math.abs(this.velocity) > 1;
201
- if (notLockedIn) {
202
- // isn't locked in yet, keep decelerating until it is
203
- this.rafId = requestAnimationFrame(() => this.decelerate());
263
+ /**
264
+ * Only setup scroll listeners
265
+ * when the picker is visible, otherwise
266
+ * the container will have a scroll
267
+ * height of 0px.
268
+ */
269
+ componentWillLoad() {
270
+ const visibleCallback = (entries) => {
271
+ const ev = entries[0];
272
+ if (ev.isIntersecting) {
273
+ const { activeItem, el } = this;
274
+ this.isColumnVisible = true;
275
+ /**
276
+ * Because this initial call to scrollActiveItemIntoView has to fire before
277
+ * the scroll listener is set up, we need to manage the active class manually.
278
+ */
279
+ const oldActive = getElementRoot(el).querySelector(`.${PICKER_ITEM_ACTIVE_CLASS}`);
280
+ if (oldActive) {
281
+ this.setPickerItemActiveState(oldActive, false);
282
+ }
283
+ this.scrollActiveItemIntoView();
284
+ if (activeItem) {
285
+ this.setPickerItemActiveState(activeItem, true);
286
+ }
287
+ this.initializeScrollListener();
204
288
  }
205
289
  else {
206
- this.velocity = 0;
207
- this.emitColChange();
208
- hapticSelectionEnd();
290
+ this.isColumnVisible = false;
291
+ if (this.destroyScrollListener) {
292
+ this.destroyScrollListener();
293
+ this.destroyScrollListener = undefined;
294
+ }
209
295
  }
210
- }
211
- else if (this.y % this.optHeight !== 0) {
212
- // needs to still get locked into a position so options line up
213
- const currentPos = Math.abs(this.y % this.optHeight);
214
- // create a velocity in the direction it needs to scroll
215
- this.velocity = currentPos > this.optHeight / 2 ? 1 : -1;
216
- this.decelerate();
296
+ };
297
+ new IntersectionObserver(visibleCallback, { threshold: 0.001 }).observe(this.el);
298
+ const parentEl = (this.parentEl = this.el.closest('ion-picker'));
299
+ if (parentEl !== null) {
300
+ // TODO(FW-2832): type
301
+ parentEl.addEventListener('ionInputModeChange', (ev) => this.inputModeChange(ev));
217
302
  }
218
303
  }
219
- indexForY(y) {
220
- return Math.min(Math.max(Math.abs(Math.round(y / this.optHeight)), 0), this.col.options.length - 1);
221
- }
222
- onStart(detail) {
223
- // We have to prevent default in order to block scrolling under the picker
224
- // but we DO NOT have to stop propagation, since we still want
225
- // some "click" events to capture
226
- if (detail.event.cancelable) {
227
- detail.event.preventDefault();
228
- }
229
- detail.event.stopPropagation();
230
- hapticSelectionStart();
231
- // reset everything
232
- if (this.rafId !== undefined)
233
- cancelAnimationFrame(this.rafId);
234
- const options = this.col.options;
235
- let minY = options.length - 1;
236
- let maxY = 0;
237
- for (let i = 0; i < options.length; i++) {
238
- if (!options[i].disabled) {
239
- minY = Math.min(minY, i);
240
- maxY = Math.max(maxY, i);
304
+ componentDidRender() {
305
+ const { el, activeItem, isColumnVisible, value } = this;
306
+ if (isColumnVisible && !activeItem) {
307
+ const firstOption = el.querySelector('ion-picker-column-option');
308
+ /**
309
+ * If the picker column does not have an active item and the current value
310
+ * does not match the first item in the picker column, that means
311
+ * the value is out of bounds. In this case, we assign the value to the
312
+ * first item to match the scroll position of the column.
313
+ *
314
+ */
315
+ if (firstOption !== null && firstOption.value !== value) {
316
+ this.setValue(firstOption.value);
241
317
  }
242
318
  }
243
- this.minY = -(minY * this.optHeight);
244
- this.maxY = -(maxY * this.optHeight);
245
319
  }
246
- onMove(detail) {
247
- if (detail.event.cancelable) {
248
- detail.event.preventDefault();
249
- }
250
- detail.event.stopPropagation();
251
- // update the scroll position relative to pointer start position
252
- let y = this.y + detail.deltaY;
253
- if (y > this.minY) {
254
- // scrolling up higher than scroll area
255
- y = Math.pow(y, 0.8);
256
- this.bounceFrom = y;
320
+ /** @internal */
321
+ async scrollActiveItemIntoView(smooth = false) {
322
+ const activeEl = this.activeItem;
323
+ if (activeEl) {
324
+ this.centerPickerItemInView(activeEl, smooth, false);
257
325
  }
258
- else if (y < this.maxY) {
259
- // scrolling down below scroll area
260
- y += Math.pow(this.maxY - y, 0.9);
261
- this.bounceFrom = y;
262
- }
263
- else {
264
- this.bounceFrom = 0;
265
- }
266
- this.update(y, 0, false);
267
326
  }
268
- onEnd(detail) {
269
- if (this.bounceFrom > 0) {
270
- // bounce back up
271
- this.update(this.minY, 100, true);
272
- this.emitColChange();
273
- return;
274
- }
275
- else if (this.bounceFrom < 0) {
276
- // bounce back down
277
- this.update(this.maxY, 100, true);
278
- this.emitColChange();
327
+ /**
328
+ * Sets the value prop and fires the ionChange event.
329
+ * This is used when we need to fire ionChange from
330
+ * user-generated events that cannot be caught with normal
331
+ * input/change event listeners.
332
+ * @internal
333
+ */
334
+ async setValue(value) {
335
+ if (this.disabled === true || this.value === value) {
279
336
  return;
280
337
  }
281
- this.velocity = clamp(-MAX_PICKER_SPEED, detail.velocityY * 23, MAX_PICKER_SPEED);
282
- if (this.velocity === 0 && detail.deltaY === 0) {
283
- const opt = detail.event.target.closest('.picker-opt');
284
- if (opt === null || opt === void 0 ? void 0 : opt.hasAttribute('opt-index')) {
285
- this.setSelected(parseInt(opt.getAttribute('opt-index'), 10), TRANSITION_DURATION);
286
- }
287
- }
288
- else {
289
- this.y += detail.deltaY;
290
- if (Math.abs(detail.velocityY) < 0.05) {
291
- const isScrollingUp = detail.deltaY > 0;
292
- const optHeightFraction = (Math.abs(this.y) % this.optHeight) / this.optHeight;
293
- if (isScrollingUp && optHeightFraction > 0.5) {
294
- this.velocity = Math.abs(this.velocity) * -1;
295
- }
296
- else if (!isScrollingUp && optHeightFraction <= 0.5) {
297
- this.velocity = Math.abs(this.velocity);
298
- }
299
- }
300
- this.decelerate();
301
- }
338
+ this.value = value;
339
+ this.ionChange.emit({ value });
302
340
  }
303
- refresh(forceRefresh, animated) {
304
- var _a;
305
- let min = this.col.options.length - 1;
306
- let max = 0;
307
- const options = this.col.options;
308
- for (let i = 0; i < options.length; i++) {
309
- if (!options[i].disabled) {
310
- min = Math.min(min, i);
311
- max = Math.max(max, i);
312
- }
313
- }
314
- /**
315
- * Only update selected value if column has a
316
- * velocity of 0. If it does not, then the
317
- * column is animating might land on
318
- * a value different than the value at
319
- * selectedIndex
320
- */
321
- if (this.velocity !== 0) {
322
- return;
323
- }
324
- const selectedIndex = clamp(min, (_a = this.col.selectedIndex) !== null && _a !== void 0 ? _a : 0, max);
325
- if (this.col.prevSelected !== selectedIndex || forceRefresh) {
326
- const y = selectedIndex * this.optHeight * -1;
327
- const duration = animated ? TRANSITION_DURATION : 0;
328
- this.velocity = 0;
329
- this.update(y, duration, true);
341
+ /**
342
+ * Sets focus on the scrollable container within the picker column.
343
+ * Use this method instead of the global `pickerColumn.focus()`.
344
+ */
345
+ async setFocus() {
346
+ if (this.scrollEl) {
347
+ this.scrollEl.focus();
330
348
  }
331
349
  }
332
- onDomChange(forceRefresh, animated) {
333
- const colEl = this.optsEl;
334
- if (colEl) {
335
- // DOM READ
336
- // We perfom a DOM read over a rendered item, this needs to happen after the first render or after the the column has changed
337
- this.optHeight = colEl.firstElementChild ? colEl.firstElementChild.clientHeight : 0;
338
- }
339
- this.refresh(forceRefresh, animated);
350
+ get activeItem() {
351
+ const { value } = this;
352
+ const options = Array.from(this.el.querySelectorAll('ion-picker-column-option'));
353
+ return options.find((option) => {
354
+ /**
355
+ * If the whole picker column is disabled, the current value should appear active
356
+ * If the current value item is specifically disabled, it should not appear active
357
+ */
358
+ if (!this.disabled && option.disabled) {
359
+ return false;
360
+ }
361
+ return option.value === value;
362
+ });
340
363
  }
341
364
  render() {
342
- const col = this.col;
365
+ const { color, disabled, isActive, numericInput } = this;
343
366
  const mode = getIonMode(this);
344
- return (h(Host, { class: Object.assign({ [mode]: true, 'picker-col': true, 'picker-opts-left': this.col.align === 'left', 'picker-opts-right': this.col.align === 'right' }, getClassMap(col.cssClass)), style: {
345
- 'max-width': this.col.columnWidth,
346
- } }, col.prefix && (h("div", { class: "picker-prefix", style: { width: col.prefixWidth } }, col.prefix)), h("div", { class: "picker-opts", style: { maxWidth: col.optionsWidth }, ref: (el) => (this.optsEl = el) }, col.options.map((o, index) => (h("button", { "aria-label": o.ariaLabel, class: { 'picker-opt': true, 'picker-opt-disabled': !!o.disabled }, "opt-index": index }, o.text)))), col.suffix && (h("div", { class: "picker-suffix", style: { width: col.suffixWidth } }, col.suffix))));
367
+ return (h(Host, { class: createColorClasses(color, {
368
+ [mode]: true,
369
+ ['picker-column-active']: isActive,
370
+ ['picker-column-numeric-input']: numericInput,
371
+ ['picker-column-disabled']: disabled,
372
+ }) }, h("slot", { name: "prefix" }), h("div", { class: "picker-opts", tabindex: disabled ? undefined : 0, ref: (el) => {
373
+ this.scrollEl = el;
374
+ } }, h("div", { class: "picker-item-empty", "aria-hidden": "true" }, "\u00A0"), h("div", { class: "picker-item-empty", "aria-hidden": "true" }, "\u00A0"), h("div", { class: "picker-item-empty", "aria-hidden": "true" }, "\u00A0"), h("slot", null), h("div", { class: "picker-item-empty", "aria-hidden": "true" }, "\u00A0"), h("div", { class: "picker-item-empty", "aria-hidden": "true" }, "\u00A0"), h("div", { class: "picker-item-empty", "aria-hidden": "true" }, "\u00A0")), h("slot", { name: "suffix" })));
347
375
  }
348
376
  get el() { return this; }
349
377
  static get watchers() { return {
350
- "col": ["colChanged"]
351
- }; }
352
- static get style() { return {
353
- ios: pickerColumnIosCss,
354
- md: pickerColumnMdCss
378
+ "value": ["valueChange"]
355
379
  }; }
356
- }, [32, "ion-picker-column", {
357
- "col": [16]
380
+ static get style() { return pickerColumnCss; }
381
+ }, [1, "ion-picker-column", {
382
+ "disabled": [4],
383
+ "value": [1032],
384
+ "color": [513],
385
+ "numericInput": [4, "numeric-input"],
386
+ "isActive": [32],
387
+ "scrollActiveItemIntoView": [64],
388
+ "setValue": [64],
389
+ "setFocus": [64]
358
390
  }, undefined, {
359
- "col": ["colChanged"]
391
+ "value": ["valueChange"]
360
392
  }]);
361
- const PICKER_OPT_SELECTED = 'picker-opt-selected';
362
- const DECELERATION_FRICTION = 0.97;
363
- const MAX_PICKER_SPEED = 90;
364
- const TRANSITION_DURATION = 150;
393
+ const PICKER_ITEM_ACTIVE_CLASS = 'option-active';
365
394
  function defineCustomElement() {
366
395
  if (typeof customElements === "undefined") {
367
396
  return;
@@ -370,10 +399,10 @@ function defineCustomElement() {
370
399
  components.forEach(tagName => { switch (tagName) {
371
400
  case "ion-picker-column":
372
401
  if (!customElements.get(tagName)) {
373
- customElements.define(tagName, PickerColumnCmp);
402
+ customElements.define(tagName, PickerColumn);
374
403
  }
375
404
  break;
376
405
  } });
377
406
  }
378
407
 
379
- export { PickerColumnCmp as P, defineCustomElement as d };
408
+ export { PickerColumn as P, defineCustomElement as d };