@ionic/core 7.5.8-dev.11701791090.18ebbea8 → 7.5.8-dev.11701806358.1ca1b519

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 (308) hide show
  1. package/components/backdrop.js +0 -12
  2. package/components/data.js +1 -1
  3. package/components/gesture-controller.js +1 -1
  4. package/components/ion-content.js +1 -1
  5. package/components/ion-datetime.js +40 -64
  6. package/components/ion-input.js +2 -21
  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/ion-textarea.js +2 -25
  16. package/components/overlays.js +11 -4
  17. package/components/picker-column-option.js +122 -0
  18. package/components/picker-column.js +363 -317
  19. package/components/picker-column2.js +379 -0
  20. package/components/{picker-internal.js → picker.js} +16 -16
  21. package/dist/cjs/{button-active-417ccdcb.js → button-active-9d7e0640.js} +1 -1
  22. package/dist/cjs/{data-36b9094e.js → data-e7526b58.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-datetime-button.cjs.entry.js +1 -1
  31. package/dist/cjs/ion-datetime_3.cjs.entry.js +36 -56
  32. package/dist/cjs/ion-input.cjs.entry.js +2 -21
  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} +105 -72
  40. package/dist/cjs/{ion-picker-internal.cjs.entry.js → ion-picker.cjs.entry.js} +13 -13
  41. package/dist/cjs/ion-popover.cjs.entry.js +2 -1
  42. package/dist/cjs/ion-range.cjs.entry.js +1 -1
  43. package/dist/cjs/ion-refresher_2.cjs.entry.js +3 -3
  44. package/dist/cjs/ion-reorder_2.cjs.entry.js +1 -1
  45. package/dist/cjs/ion-segment_2.cjs.entry.js +1 -1
  46. package/dist/cjs/ion-select_3.cjs.entry.js +2 -1
  47. package/dist/cjs/ion-textarea.cjs.entry.js +2 -25
  48. package/dist/cjs/ion-toast.cjs.entry.js +2 -1
  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-5c379703.js → overlays-e8e05b0e.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/content/content.css +0 -4
  57. package/dist/collection/components/datetime/datetime.ios.css +83 -37
  58. package/dist/collection/components/datetime/datetime.js +24 -36
  59. package/dist/collection/components/datetime/datetime.md.css +88 -37
  60. package/dist/collection/components/datetime/test/a11y/datetime.e2e.js +1 -1
  61. package/dist/collection/components/datetime/test/a11y/datetime.spec.js +6 -9
  62. package/dist/collection/components/datetime/test/basic/datetime.e2e.js +10 -0
  63. package/dist/collection/components/datetime/test/datetime.e2e.js +2 -2
  64. package/dist/collection/components/datetime/test/disabled/datetime.spec.js +4 -4
  65. package/dist/collection/components/datetime/test/locale/datetime.e2e.js +2 -2
  66. package/dist/collection/components/datetime/test/minmax/datetime.e2e.js +6 -6
  67. package/dist/collection/components/datetime/test/month-year-picker/datetime.e2e.js +1 -1
  68. package/dist/collection/components/datetime/test/prefer-wheel/datetime.e2e.js +43 -41
  69. package/dist/collection/components/datetime/test/presentation/datetime.e2e.js +1 -1
  70. package/dist/collection/components/datetime/test/readonly/datetime.e2e.js +4 -4
  71. package/dist/collection/components/datetime/test/values/datetime.e2e.js +15 -12
  72. package/dist/collection/components/datetime/utils/data.js +1 -1
  73. package/dist/collection/components/input/input.js +2 -21
  74. package/dist/collection/components/input/test/clear-on-edit/input.e2e.js +9 -21
  75. package/dist/collection/components/picker/picker.ios.css +100 -205
  76. package/dist/collection/components/picker/picker.js +461 -743
  77. package/dist/collection/components/picker/picker.md.css +98 -194
  78. package/dist/collection/components/{picker-internal/test/a11y/picker-internal.e2e.js → picker/test/a11y/picker.e2e.js} +2 -2
  79. package/dist/collection/components/picker/test/basic/picker.e2e.js +99 -13
  80. package/dist/collection/components/{picker-internal/test/keyboard-entry/picker-internal.e2e.js → picker/test/keyboard-entry/picker.e2e.js} +23 -22
  81. package/dist/collection/components/picker-column/picker-column.ios.css +120 -160
  82. package/dist/collection/components/picker-column/picker-column.js +514 -329
  83. package/dist/collection/components/picker-column/picker-column.md.css +134 -107
  84. package/dist/collection/components/{picker-column-internal/test/basic/picker-column-internal.e2e.js → picker-column/test/basic/picker-column.e2e.js} +8 -8
  85. package/dist/collection/components/picker-column/test/disabled/picker-column.e2e.js +113 -0
  86. package/dist/collection/components/picker-column/test/slots/picker-column.e2e.js +39 -0
  87. package/dist/collection/components/picker-column-option/picker-column-option.ios.css +87 -0
  88. package/dist/collection/components/picker-column-option/picker-column-option.js +173 -0
  89. package/dist/collection/components/{picker-column-internal/picker-column-internal.ios.css → picker-column-option/picker-column-option.md.css} +6 -53
  90. package/dist/collection/components/picker-column-option/test/a11y/picker-column-option.e2e.js +18 -0
  91. package/dist/collection/components/picker-column-option/test/basic/picker-column-option.e2e.js +37 -0
  92. package/dist/collection/components/picker-legacy/picker.ios.css +367 -0
  93. package/dist/collection/components/picker-legacy/picker.js +817 -0
  94. package/dist/collection/components/{picker-internal/picker-internal.ios.css → picker-legacy/picker.md.css} +192 -100
  95. package/dist/collection/components/picker-legacy/test/basic/picker.e2e.js +25 -0
  96. package/dist/collection/components/{picker → picker-legacy}/test/is-open/picker.e2e.js +4 -4
  97. package/dist/collection/components/{picker → picker-legacy}/test/picker-id.spec.js +5 -5
  98. package/dist/collection/components/{picker → picker-legacy}/test/trigger/picker.e2e.js +1 -1
  99. package/dist/collection/components/{picker-internal/picker-internal.md.css → picker-legacy-column/picker-column.ios.css} +98 -101
  100. package/dist/collection/components/picker-legacy-column/picker-column.js +419 -0
  101. package/dist/collection/components/{picker-column-internal/picker-column-internal.md.css → picker-legacy-column/picker-column.md.css} +113 -63
  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/textarea/test/clear-on-edit/textarea.e2e.js +0 -28
  107. package/dist/collection/components/textarea/textarea.js +2 -25
  108. package/dist/collection/utils/gesture/gesture-controller.js +1 -1
  109. package/dist/collection/utils/overlays.js +11 -4
  110. package/dist/collection/utils/test/overlays/overlays-scroll-blocking.spec.js +65 -0
  111. package/dist/docs.json +493 -40
  112. package/dist/esm/{button-active-3fdf3e4f.js → button-active-ed9d848c.js} +1 -1
  113. package/dist/esm/{data-f5c75b4e.js → data-4b9508c9.js} +1 -1
  114. package/dist/esm/{gesture-controller-1bf57181.js → gesture-controller-314a54f6.js} +1 -1
  115. package/dist/esm/{index-2cf77112.js → index-39782642.js} +2 -2
  116. package/dist/esm/index.js +3 -3
  117. package/dist/esm/ion-action-sheet.entry.js +4 -4
  118. package/dist/esm/ion-alert.entry.js +4 -4
  119. package/dist/esm/ion-app_8.entry.js +2 -2
  120. package/dist/esm/ion-backdrop.entry.js +0 -12
  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-input.entry.js +2 -21
  124. package/dist/esm/ion-item-option_3.entry.js +1 -1
  125. package/dist/esm/ion-loading.entry.js +2 -1
  126. package/dist/esm/ion-menu_3.entry.js +3 -3
  127. package/dist/esm/ion-modal.entry.js +3 -3
  128. package/dist/esm/ion-nav_2.entry.js +1 -1
  129. package/dist/esm/ion-picker-column-option.entry.js +100 -0
  130. package/dist/esm/{ion-picker-column-internal.entry.js → ion-picker-column.entry.js} +105 -72
  131. package/dist/esm/{ion-picker-internal.entry.js → ion-picker.entry.js} +13 -13
  132. package/dist/esm/ion-popover.entry.js +2 -1
  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-textarea.entry.js +2 -25
  139. package/dist/esm/ion-toast.entry.js +2 -1
  140. package/dist/esm/ion-toggle.entry.js +1 -1
  141. package/dist/esm/ionic.js +1 -1
  142. package/dist/esm/loader.js +1 -1
  143. package/dist/esm/{overlays-abf58489.js → overlays-fbc5cab5.js} +11 -4
  144. package/dist/esm/{swipe-back-a6f386fc.js → swipe-back-a8ca7f93.js} +2 -2
  145. package/dist/esm-es5/{button-active-3fdf3e4f.js → button-active-ed9d848c.js} +1 -1
  146. package/dist/esm-es5/{gesture-controller-1bf57181.js → gesture-controller-314a54f6.js} +1 -1
  147. package/dist/esm-es5/{index-2cf77112.js → index-39782642.js} +1 -1
  148. package/dist/esm-es5/index.js +1 -1
  149. package/dist/esm-es5/ion-action-sheet.entry.js +1 -1
  150. package/dist/esm-es5/ion-alert.entry.js +1 -1
  151. package/dist/esm-es5/ion-app_8.entry.js +1 -1
  152. package/dist/esm-es5/ion-backdrop.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-input.entry.js +1 -1
  156. package/dist/esm-es5/ion-item-option_3.entry.js +1 -1
  157. package/dist/esm-es5/ion-loading.entry.js +1 -1
  158. package/dist/esm-es5/ion-menu_3.entry.js +1 -1
  159. package/dist/esm-es5/ion-modal.entry.js +1 -1
  160. package/dist/esm-es5/ion-nav_2.entry.js +1 -1
  161. package/dist/esm-es5/ion-picker-column-option.entry.js +4 -0
  162. package/dist/esm-es5/ion-picker-column.entry.js +4 -0
  163. package/dist/esm-es5/ion-picker.entry.js +4 -0
  164. package/dist/esm-es5/ion-popover.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-textarea.entry.js +1 -1
  171. package/dist/esm-es5/ion-toast.entry.js +1 -1
  172. package/dist/esm-es5/ion-toggle.entry.js +1 -1
  173. package/dist/esm-es5/ionic.js +1 -1
  174. package/dist/esm-es5/loader.js +1 -1
  175. package/dist/esm-es5/overlays-fbc5cab5.js +4 -0
  176. package/dist/esm-es5/swipe-back-a8ca7f93.js +4 -0
  177. package/dist/html.html-data.json +152 -1
  178. package/dist/ionic/index.esm.js +1 -1
  179. package/dist/ionic/ionic.esm.js +1 -1
  180. package/dist/ionic/{p-b0dc1cf9.system.js → p-1d624e03.system.js} +1 -1
  181. package/dist/ionic/{p-d40a974a.entry.js → p-1fc72959.entry.js} +1 -1
  182. package/dist/ionic/{p-c7c8429a.system.js → p-20d469d0.system.js} +1 -1
  183. package/dist/ionic/{p-0519cd21.entry.js → p-21c3515a.entry.js} +1 -1
  184. package/dist/ionic/{p-6470b136.entry.js → p-22e5af95.entry.js} +1 -1
  185. package/dist/ionic/p-232d1f22.entry.js +4 -0
  186. package/dist/ionic/p-23672c82.system.entry.js +4 -0
  187. package/dist/ionic/p-26798a7b.system.entry.js +4 -0
  188. package/dist/ionic/p-27bcbbc7.system.entry.js +4 -0
  189. package/dist/ionic/{p-765a08a7.system.entry.js → p-32303650.system.entry.js} +1 -1
  190. package/dist/ionic/p-3ba01a9c.system.entry.js +4 -0
  191. package/dist/ionic/{p-31b2326e.system.js → p-3e1e14d9.system.js} +1 -1
  192. package/dist/ionic/{p-667df818.system.entry.js → p-3fd26bd6.system.entry.js} +1 -1
  193. package/dist/ionic/{p-864c4046.entry.js → p-42ba3902.entry.js} +1 -1
  194. package/dist/ionic/{p-88fde0e0.entry.js → p-4911a5d6.entry.js} +1 -1
  195. package/dist/ionic/{p-a6f9dd7b.entry.js → p-4a081ea9.entry.js} +1 -1
  196. package/dist/ionic/{p-7b8d0af2.system.entry.js → p-4a36430f.system.entry.js} +1 -1
  197. package/dist/ionic/p-51abefb7.system.js +4 -0
  198. package/dist/ionic/{p-0b1bc636.entry.js → p-535d2a67.entry.js} +1 -1
  199. package/dist/ionic/{p-af5cfad2.system.js → p-54dfc9b5.system.js} +1 -1
  200. package/dist/ionic/p-563c41f0.system.entry.js +4 -0
  201. package/dist/ionic/{p-b04e4d62.entry.js → p-5d42b6b4.entry.js} +1 -1
  202. package/dist/ionic/{p-50880712.entry.js → p-6b7c55cd.entry.js} +1 -1
  203. package/dist/ionic/{p-a1987850.entry.js → p-6d72fb44.entry.js} +1 -1
  204. package/dist/ionic/{p-e6d68e02.system.entry.js → p-6fd64e7c.system.entry.js} +1 -1
  205. package/dist/ionic/p-73190c5f.entry.js +4 -0
  206. package/dist/ionic/p-73aa7604.entry.js +4 -0
  207. package/dist/ionic/{p-17f893be.js → p-76d3765d.js} +1 -1
  208. package/dist/ionic/{p-94389114.system.entry.js → p-77965464.system.entry.js} +1 -1
  209. package/dist/ionic/{p-98b14ece.entry.js → p-7b725280.entry.js} +1 -1
  210. package/dist/ionic/p-8017aad2.system.entry.js +4 -0
  211. package/dist/ionic/p-846ee227.entry.js +4 -0
  212. package/dist/ionic/p-8c97cdc0.entry.js +4 -0
  213. package/dist/ionic/{p-f5d2dc9b.js → p-8ededb41.js} +1 -1
  214. package/dist/ionic/p-8fa6583d.system.js +4 -0
  215. package/dist/ionic/p-9282b16f.entry.js +4 -0
  216. package/dist/ionic/{p-d7be6b7e.system.entry.js → p-96dbbac1.system.entry.js} +1 -1
  217. package/dist/ionic/{p-bb3615f7.js → p-9b97df10.js} +1 -1
  218. package/dist/ionic/p-9ba90516.system.entry.js +4 -0
  219. package/dist/ionic/{p-a0126dd5.system.entry.js → p-9c229210.system.entry.js} +2 -2
  220. package/dist/ionic/{p-7faba551.system.entry.js → p-a225bf0f.system.entry.js} +1 -1
  221. package/dist/ionic/p-a60a1ce5.js +4 -0
  222. package/dist/ionic/p-a8baa23e.entry.js +4 -0
  223. package/dist/ionic/{p-ad019ef0.entry.js → p-a9a80f5b.entry.js} +1 -1
  224. package/dist/ionic/p-afcf4620.entry.js +4 -0
  225. package/dist/ionic/{p-ddb30596.entry.js → p-b133e9b4.entry.js} +1 -1
  226. package/dist/ionic/{p-08f196ce.system.entry.js → p-b4d31b30.system.entry.js} +1 -1
  227. package/dist/ionic/{p-e553006f.system.entry.js → p-c18de88a.system.entry.js} +1 -1
  228. package/dist/ionic/p-c2910c78.entry.js +4 -0
  229. package/dist/ionic/p-c8f0a036.entry.js +4 -0
  230. package/dist/ionic/p-ca8938f4.js +4 -0
  231. package/dist/ionic/p-ca9d1792.system.entry.js +4 -0
  232. package/dist/ionic/{p-c3d09cf2.system.entry.js → p-cde52378.system.entry.js} +1 -1
  233. package/dist/ionic/p-da15f571.system.entry.js +4 -0
  234. package/dist/ionic/p-e3584231.system.js +1 -1
  235. package/dist/ionic/{p-6577aea9.system.entry.js → p-e8e86f69.system.entry.js} +1 -1
  236. package/dist/ionic/{p-9eec42cc.system.entry.js → p-f910cc73.system.entry.js} +1 -1
  237. package/dist/ionic/{p-3b686a65.system.entry.js → p-fbf3a689.system.entry.js} +1 -1
  238. package/dist/ionic/p-fe4dde76.entry.js +4 -0
  239. package/dist/ionic/p-ffd5dba4.system.entry.js +4 -0
  240. package/dist/types/components/backdrop/backdrop.d.ts +0 -3
  241. package/dist/types/components/datetime/datetime.d.ts +0 -1
  242. package/dist/types/components/datetime/utils/data.d.ts +2 -2
  243. package/dist/types/components/menu/menu.d.ts +1 -1
  244. package/dist/types/components/picker/picker-interfaces.d.ts +8 -0
  245. package/dist/types/components/picker/picker.d.ts +74 -131
  246. package/dist/types/components/picker-column/picker-column.d.ts +105 -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 +163 -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 +1367 -1296
  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-abf58489.js +0 -4
  268. package/dist/esm-es5/swipe-back-a6f386fc.js +0 -4
  269. package/dist/ionic/p-18b6bd23.system.entry.js +0 -4
  270. package/dist/ionic/p-1d17219f.entry.js +0 -4
  271. package/dist/ionic/p-25b32c3d.entry.js +0 -4
  272. package/dist/ionic/p-2ba0657d.system.entry.js +0 -4
  273. package/dist/ionic/p-35ce400e.system.js +0 -4
  274. package/dist/ionic/p-3de71759.entry.js +0 -4
  275. package/dist/ionic/p-3e960213.system.entry.js +0 -4
  276. package/dist/ionic/p-61d7d7fb.js +0 -4
  277. package/dist/ionic/p-67da080d.entry.js +0 -4
  278. package/dist/ionic/p-6a6477b2.js +0 -4
  279. package/dist/ionic/p-73637557.system.entry.js +0 -4
  280. package/dist/ionic/p-73ea8f82.system.entry.js +0 -4
  281. package/dist/ionic/p-80fa068e.entry.js +0 -4
  282. package/dist/ionic/p-82045bc1.entry.js +0 -4
  283. package/dist/ionic/p-908475e7.system.entry.js +0 -4
  284. package/dist/ionic/p-9c3b6849.entry.js +0 -4
  285. package/dist/ionic/p-b4bad293.system.entry.js +0 -4
  286. package/dist/ionic/p-c3289ef2.entry.js +0 -4
  287. package/dist/ionic/p-cce9f61a.system.entry.js +0 -4
  288. package/dist/ionic/p-d1cb29a8.system.entry.js +0 -4
  289. package/dist/ionic/p-e94c392d.entry.js +0 -4
  290. package/dist/ionic/p-f2c21dae.system.js +0 -4
  291. package/dist/ionic/p-f51666d3.entry.js +0 -4
  292. package/dist/types/components/picker-column-internal/picker-column-internal.d.ts +0 -102
  293. package/dist/types/components/picker-internal/picker-internal-interfaces.d.ts +0 -8
  294. package/dist/types/components/picker-internal/picker-internal.d.ts +0 -102
  295. /package/dist/collection/components/{picker-internal/picker-internal-interfaces.js → picker/picker-interfaces.js} +0 -0
  296. /package/dist/collection/components/{picker-column-internal/picker-column-internal-interfaces.js → picker-column/picker-column-interfaces.js} +0 -0
  297. /package/dist/collection/components/{picker → picker-legacy}/animations/ios.enter.js +0 -0
  298. /package/dist/collection/components/{picker → picker-legacy}/animations/ios.leave.js +0 -0
  299. /package/dist/collection/components/{picker → picker-legacy}/picker-interface.js +0 -0
  300. /package/dist/collection/components/{picker-column → picker-legacy-column}/test/test.utils.js +0 -0
  301. /package/dist/esm-es5/{data-f5c75b4e.js → data-4b9508c9.js} +0 -0
  302. /package/dist/ionic/{p-2aea8b1e.js → p-368f5215.js} +0 -0
  303. /package/dist/ionic/{p-82e3d633.system.js → p-f58981c2.system.js} +0 -0
  304. /package/dist/types/components/{picker-column-internal/picker-column-internal-interfaces.d.ts → picker-column/picker-column-interfaces.d.ts} +0 -0
  305. /package/dist/types/components/{picker → picker-legacy}/animations/ios.enter.d.ts +0 -0
  306. /package/dist/types/components/{picker → picker-legacy}/animations/ios.leave.d.ts +0 -0
  307. /package/dist/types/components/{picker → picker-legacy}/picker-interface.d.ts +0 -0
  308. /package/dist/types/components/{picker-column → picker-legacy-column}/test/test.utils.d.ts +0 -0
@@ -2,345 +2,390 @@
2
2
  * (C) Ionic http://ionicframework.com - MIT License
3
3
  */
4
4
  import { Host, h } from "@stencil/core";
5
- import { clamp } from "../../utils/helpers";
5
+ import { doc } from "../../utils/browser/index";
6
+ import { getElementRoot, raf } from "../../utils/helpers";
6
7
  import { hapticSelectionChanged, hapticSelectionEnd, hapticSelectionStart } from "../../utils/native/haptic";
7
- import { getClassMap } from "../../utils/theme";
8
+ import { isPlatform } from "../../utils/platform";
9
+ import { createColorClasses } from "../../utils/theme";
8
10
  import { getIonMode } from "../../global/ionic-global";
9
11
  /**
10
- * @internal
12
+ * @virtualProp {"ios" | "md"} mode - The mode determines which platform styles to use.
13
+ *
14
+ * @slot prefix - Content to show on the left side of the picker options.
15
+ * @slot suffix - Content to show on the right side of the picker options.
11
16
  */
12
- export class PickerColumnCmp {
17
+ // TODO FW-5580 we can likely go back to a single stylesheet here
18
+ // the per-mode styles were moved to ion-picker-column-option
19
+ export class PickerColumn {
13
20
  constructor() {
14
- this.optHeight = 0;
15
- this.rotateFactor = 0;
16
- this.scaleFactor = 1;
17
- this.velocity = 0;
18
- this.y = 0;
19
- this.noAnimate = true;
20
- // `colDidChange` is a flag that gets set when the column is changed
21
- // dynamically. When this flag is set, the column will refresh
22
- // after the component re-renders to incorporate the new column data.
23
- // This is necessary because `this.refresh` queries for the option elements,
24
- // so it needs to wait for the latest elements to be available in the DOM.
25
- // Ex: column is created with 3 options. User updates the column data
26
- // to have 5 options. The column will still think it only has 3 options.
27
- this.colDidChange = false;
28
- this.col = undefined;
29
- }
30
- colChanged() {
31
- this.colDidChange = true;
32
- }
33
- async connectedCallback() {
34
- let pickerRotateFactor = 0;
35
- let pickerScaleFactor = 0.81;
36
- const mode = getIonMode(this);
37
- if (mode === 'ios') {
38
- pickerRotateFactor = -0.46;
39
- pickerScaleFactor = 1;
40
- }
41
- this.rotateFactor = pickerRotateFactor;
42
- this.scaleFactor = pickerScaleFactor;
43
- this.gesture = (await import('../../utils/gesture')).createGesture({
44
- el: this.el,
45
- gestureName: 'picker-swipe',
46
- gesturePriority: 100,
47
- threshold: 0,
48
- passive: false,
49
- onStart: (ev) => this.onStart(ev),
50
- onMove: (ev) => this.onMove(ev),
51
- onEnd: (ev) => this.onEnd(ev),
52
- });
53
- this.gesture.enable();
54
- // Options have not been initialized yet
55
- // Animation must be disabled through the `noAnimate` flag
56
- // Otherwise, the options will render
57
- // at the top of the column and transition down
58
- this.tmrId = setTimeout(() => {
59
- this.noAnimate = false;
60
- // After initialization, `refresh()` will be called
61
- // At this point, animation will be enabled. The options will
62
- // animate as they are being selected.
63
- this.refresh(true);
64
- }, 250);
65
- }
66
- componentDidLoad() {
67
- this.onDomChange();
68
- }
69
- componentDidUpdate() {
70
- // Options may have changed since last update.
71
- if (this.colDidChange) {
72
- // Animation must be disabled through the `onDomChange` parameter.
73
- // Otherwise, the recently added options will render
74
- // at the top of the column and transition down
75
- this.onDomChange(true, false);
76
- this.colDidChange = false;
77
- }
78
- }
79
- disconnectedCallback() {
80
- if (this.rafId !== undefined)
81
- cancelAnimationFrame(this.rafId);
82
- if (this.tmrId)
83
- clearTimeout(this.tmrId);
84
- if (this.gesture) {
85
- this.gesture.destroy();
86
- this.gesture = undefined;
87
- }
88
- }
89
- emitColChange() {
90
- this.ionPickerColChange.emit(this.col);
91
- }
92
- setSelected(selectedIndex, duration) {
93
- // if there is a selected index, then figure out it's y position
94
- // if there isn't a selected index, then just use the top y position
95
- const y = selectedIndex > -1 ? -(selectedIndex * this.optHeight) : 0;
96
- this.velocity = 0;
97
- // set what y position we're at
98
- if (this.rafId !== undefined)
99
- cancelAnimationFrame(this.rafId);
100
- this.update(y, duration, true);
101
- this.emitColChange();
102
- }
103
- update(y, duration, saveY) {
104
- if (!this.optsEl) {
105
- return;
106
- }
107
- // ensure we've got a good round number :)
108
- let translateY = 0;
109
- let translateZ = 0;
110
- const { col, rotateFactor } = this;
111
- const prevSelected = col.selectedIndex;
112
- const selectedIndex = (col.selectedIndex = this.indexForY(-y));
113
- const durationStr = duration === 0 ? '' : duration + 'ms';
114
- const scaleStr = `scale(${this.scaleFactor})`;
115
- const children = this.optsEl.children;
116
- for (let i = 0; i < children.length; i++) {
117
- const button = children[i];
118
- const opt = col.options[i];
119
- const optOffset = i * this.optHeight + y;
120
- let transform = '';
121
- if (rotateFactor !== 0) {
122
- const rotateX = optOffset * rotateFactor;
123
- if (Math.abs(rotateX) <= 90) {
124
- translateY = 0;
125
- translateZ = 90;
126
- transform = `rotateX(${rotateX}deg) `;
21
+ this.isScrolling = false;
22
+ this.isColumnVisible = false;
23
+ this.canExitInputMode = true;
24
+ this.centerPickerItemInView = (target, smooth = true, canExitInputMode = true) => {
25
+ const { isColumnVisible, scrollEl } = this;
26
+ if (isColumnVisible && scrollEl) {
27
+ // (Vertical offset from parent) - (three empty picker rows) + (half the height of the target to ensure the scroll triggers)
28
+ const top = target.offsetTop - 3 * target.clientHeight + target.clientHeight / 2;
29
+ if (scrollEl.scrollTop !== top) {
30
+ /**
31
+ * Setting this flag prevents input
32
+ * mode from exiting in the picker column's
33
+ * scroll callback. This is useful when the user manually
34
+ * taps an item or types on the keyboard as both
35
+ * of these can cause a scroll to occur.
36
+ */
37
+ this.canExitInputMode = canExitInputMode;
38
+ scrollEl.scroll({
39
+ top,
40
+ left: 0,
41
+ behavior: smooth ? 'smooth' : undefined,
42
+ });
127
43
  }
128
- else {
129
- translateY = -9999;
130
- }
131
- }
132
- else {
133
- translateZ = 0;
134
- translateY = optOffset;
135
44
  }
136
- const selected = selectedIndex === i;
137
- transform += `translate3d(0px,${translateY}px,${translateZ}px) `;
138
- if (this.scaleFactor !== 1 && !selected) {
139
- transform += scaleStr;
140
- }
141
- // Update transition duration
142
- if (this.noAnimate) {
143
- opt.duration = 0;
144
- button.style.transitionDuration = '';
45
+ };
46
+ this.setPickerItemActiveState = (item, isActive) => {
47
+ if (isActive) {
48
+ item.classList.add(PICKER_ITEM_ACTIVE_CLASS);
49
+ item.part.add(PICKER_ITEM_ACTIVE_PART);
145
50
  }
146
- else if (duration !== opt.duration) {
147
- opt.duration = duration;
148
- button.style.transitionDuration = durationStr;
51
+ else {
52
+ item.classList.remove(PICKER_ITEM_ACTIVE_CLASS);
53
+ item.part.remove(PICKER_ITEM_ACTIVE_PART);
149
54
  }
150
- // Update transform
151
- if (transform !== opt.transform) {
152
- opt.transform = transform;
55
+ };
56
+ /**
57
+ * When ionInputModeChange is emitted, each column
58
+ * needs to check if it is the one being made available
59
+ * for text entry.
60
+ */
61
+ this.inputModeChange = (ev) => {
62
+ if (!this.numericInput) {
63
+ return;
153
64
  }
154
- button.style.transform = transform;
65
+ const { useInputMode, inputModeColumn } = ev.detail;
155
66
  /**
156
- * Ensure that the select column
157
- * item has the selected class
67
+ * If inputModeColumn is undefined then this means
68
+ * all numericInput columns are being selected.
158
69
  */
159
- opt.selected = selected;
160
- if (selected) {
161
- button.classList.add(PICKER_OPT_SELECTED);
70
+ const isColumnActive = inputModeColumn === undefined || inputModeColumn === this.el;
71
+ if (!useInputMode || !isColumnActive) {
72
+ this.setInputModeActive(false);
73
+ return;
162
74
  }
163
- else {
164
- button.classList.remove(PICKER_OPT_SELECTED);
75
+ this.setInputModeActive(true);
76
+ };
77
+ /**
78
+ * Setting isActive will cause a re-render.
79
+ * As a result, we do not want to cause the
80
+ * re-render mid scroll as this will cause
81
+ * the picker column to jump back to
82
+ * whatever value was selected at the
83
+ * start of the scroll interaction.
84
+ */
85
+ this.setInputModeActive = (state) => {
86
+ if (this.isScrolling) {
87
+ this.scrollEndCallback = () => {
88
+ this.isActive = state;
89
+ };
90
+ return;
165
91
  }
166
- }
167
- this.col.prevSelected = prevSelected;
168
- if (saveY) {
169
- this.y = y;
170
- }
171
- if (this.lastIndex !== selectedIndex) {
172
- // have not set a last index yet
173
- hapticSelectionChanged();
174
- this.lastIndex = selectedIndex;
92
+ this.isActive = state;
93
+ };
94
+ /**
95
+ * When the column scrolls, the component
96
+ * needs to determine which item is centered
97
+ * in the view and will emit an ionChange with
98
+ * the item object.
99
+ */
100
+ this.initializeScrollListener = () => {
101
+ /**
102
+ * The haptics for the wheel picker are
103
+ * an iOS-only feature. As a result, they should
104
+ * be disabled on Android.
105
+ */
106
+ const enableHaptics = isPlatform('ios');
107
+ const { el, scrollEl } = this;
108
+ let timeout;
109
+ let activeEl = this.activeItem;
110
+ const scrollCallback = () => {
111
+ raf(() => {
112
+ if (!scrollEl)
113
+ return;
114
+ if (timeout) {
115
+ clearTimeout(timeout);
116
+ timeout = undefined;
117
+ }
118
+ if (!this.isScrolling) {
119
+ enableHaptics && hapticSelectionStart();
120
+ this.isScrolling = true;
121
+ }
122
+ /**
123
+ * Select item in the center of the column
124
+ * which is the month/year that we want to select
125
+ */
126
+ const bbox = scrollEl.getBoundingClientRect();
127
+ const centerX = bbox.x + bbox.width / 2;
128
+ const centerY = bbox.y + bbox.height / 2;
129
+ /**
130
+ * elementFromPoint returns the top-most element.
131
+ * This means that if an ion-backdrop is overlaying the
132
+ * picker then the appropriate picker column option will
133
+ * not be selected. To account for this, we use elementsFromPoint
134
+ * and use an Array.find to find the appropriate column option
135
+ * at that point.
136
+ *
137
+ * Additionally, the picker column could be used in the
138
+ * Shadow DOM (i.e. in ion-datetime) so we need to make
139
+ * sure we are choosing the correct host otherwise
140
+ * the elements returns by elementsFromPoint will be
141
+ * retargeted. To account for this, we check to see
142
+ * if the picker column has a parent shadow root. If
143
+ * so, we use that shadow root when doing elementsFromPoint.
144
+ * Otherwise, we just use the document.
145
+ */
146
+ const rootNode = el.getRootNode();
147
+ const hasParentShadow = rootNode instanceof ShadowRoot;
148
+ const referenceNode = hasParentShadow ? rootNode : doc;
149
+ /**
150
+ * If the reference node is undefined
151
+ * then it's likely that doc is undefined
152
+ * due to being in an SSR environment.
153
+ */
154
+ if (referenceNode === undefined) {
155
+ return;
156
+ }
157
+ const elementsAtPoint = referenceNode.elementsFromPoint(centerX, centerY);
158
+ /**
159
+ * elementsFromPoint can returns multiple elements
160
+ * so find the relevant picker column option if one exists.
161
+ */
162
+ const newActiveElement = elementsAtPoint.find((el) => el.tagName === 'ION-PICKER-COLUMN-OPTION');
163
+ if (activeEl !== undefined) {
164
+ this.setPickerItemActiveState(activeEl, false);
165
+ }
166
+ if (newActiveElement === undefined || newActiveElement.disabled) {
167
+ return;
168
+ }
169
+ /**
170
+ * If we are selecting a new value,
171
+ * we need to run haptics again.
172
+ */
173
+ if (newActiveElement !== activeEl) {
174
+ enableHaptics && hapticSelectionChanged();
175
+ if (this.canExitInputMode) {
176
+ /**
177
+ * The native iOS wheel picker
178
+ * only dismisses the keyboard
179
+ * once the selected item has changed
180
+ * as a result of a swipe
181
+ * from the user. If `canExitInputMode` is
182
+ * `false` then this means that the
183
+ * scroll is happening as a result of
184
+ * the `value` property programmatically changing
185
+ * either by an application or by the user via the keyboard.
186
+ */
187
+ this.exitInputMode();
188
+ }
189
+ }
190
+ activeEl = newActiveElement;
191
+ this.setPickerItemActiveState(newActiveElement, true);
192
+ timeout = setTimeout(() => {
193
+ this.isScrolling = false;
194
+ enableHaptics && hapticSelectionEnd();
195
+ /**
196
+ * Certain tasks (such as those that
197
+ * cause re-renders) should only be done
198
+ * once scrolling has finished, otherwise
199
+ * flickering may occur.
200
+ */
201
+ const { scrollEndCallback } = this;
202
+ if (scrollEndCallback) {
203
+ scrollEndCallback();
204
+ this.scrollEndCallback = undefined;
205
+ }
206
+ /**
207
+ * Reset this flag as the
208
+ * next scroll interaction could
209
+ * be a scroll from the user. In this
210
+ * case, we should exit input mode.
211
+ */
212
+ this.canExitInputMode = true;
213
+ this.setValue(newActiveElement.value);
214
+ }, 250);
215
+ });
216
+ };
217
+ /**
218
+ * Wrap this in an raf so that the scroll callback
219
+ * does not fire when component is initially shown.
220
+ */
221
+ raf(() => {
222
+ if (!scrollEl)
223
+ return;
224
+ scrollEl.addEventListener('scroll', scrollCallback);
225
+ this.destroyScrollListener = () => {
226
+ scrollEl.removeEventListener('scroll', scrollCallback);
227
+ };
228
+ });
229
+ };
230
+ /**
231
+ * Tells the parent picker to
232
+ * exit text entry mode. This is only called
233
+ * when the selected item changes during scroll, so
234
+ * we know that the user likely wants to scroll
235
+ * instead of type.
236
+ */
237
+ this.exitInputMode = () => {
238
+ const { parentEl } = this;
239
+ if (parentEl == null)
240
+ return;
241
+ parentEl.exitInputMode();
242
+ /**
243
+ * setInputModeActive only takes
244
+ * effect once scrolling stops to avoid
245
+ * a component re-render while scrolling.
246
+ * However, we want the visual active
247
+ * indicator to go away immediately, so
248
+ * we call classList.remove here.
249
+ */
250
+ this.el.classList.remove('picker-column-active');
251
+ };
252
+ this.isActive = false;
253
+ this.disabled = false;
254
+ this.items = [];
255
+ this.value = undefined;
256
+ this.color = 'primary';
257
+ this.numericInput = false;
258
+ }
259
+ valueChange() {
260
+ if (this.isColumnVisible) {
261
+ /**
262
+ * Only scroll the active item into view when the picker column
263
+ * is actively visible to the user.
264
+ */
265
+ this.scrollActiveItemIntoView();
175
266
  }
176
267
  }
177
- decelerate() {
178
- if (this.velocity !== 0) {
179
- // still decelerating
180
- this.velocity *= DECELERATION_FRICTION;
181
- // do not let it go slower than a velocity of 1
182
- this.velocity = this.velocity > 0 ? Math.max(this.velocity, 1) : Math.min(this.velocity, -1);
183
- let y = this.y + this.velocity;
184
- if (y > this.minY) {
185
- // whoops, it's trying to scroll up farther than the options we have!
186
- y = this.minY;
187
- this.velocity = 0;
188
- }
189
- else if (y < this.maxY) {
190
- // gahh, it's trying to scroll down farther than we can!
191
- y = this.maxY;
192
- this.velocity = 0;
193
- }
194
- this.update(y, 0, true);
195
- const notLockedIn = Math.round(y) % this.optHeight !== 0 || Math.abs(this.velocity) > 1;
196
- if (notLockedIn) {
197
- // isn't locked in yet, keep decelerating until it is
198
- this.rafId = requestAnimationFrame(() => this.decelerate());
268
+ /**
269
+ * Only setup scroll listeners
270
+ * when the picker is visible, otherwise
271
+ * the container will have a scroll
272
+ * height of 0px.
273
+ */
274
+ componentWillLoad() {
275
+ const visibleCallback = (entries) => {
276
+ const ev = entries[0];
277
+ if (ev.isIntersecting) {
278
+ const { activeItem, el } = this;
279
+ this.isColumnVisible = true;
280
+ /**
281
+ * Because this initial call to scrollActiveItemIntoView has to fire before
282
+ * the scroll listener is set up, we need to manage the active class manually.
283
+ */
284
+ const oldActive = getElementRoot(el).querySelector(`.${PICKER_ITEM_ACTIVE_CLASS}`);
285
+ if (oldActive) {
286
+ this.setPickerItemActiveState(oldActive, false);
287
+ }
288
+ this.scrollActiveItemIntoView();
289
+ if (activeItem) {
290
+ this.setPickerItemActiveState(activeItem, true);
291
+ }
292
+ this.initializeScrollListener();
199
293
  }
200
294
  else {
201
- this.velocity = 0;
202
- this.emitColChange();
203
- hapticSelectionEnd();
295
+ this.isColumnVisible = false;
296
+ if (this.destroyScrollListener) {
297
+ this.destroyScrollListener();
298
+ this.destroyScrollListener = undefined;
299
+ }
204
300
  }
205
- }
206
- else if (this.y % this.optHeight !== 0) {
207
- // needs to still get locked into a position so options line up
208
- const currentPos = Math.abs(this.y % this.optHeight);
209
- // create a velocity in the direction it needs to scroll
210
- this.velocity = currentPos > this.optHeight / 2 ? 1 : -1;
211
- this.decelerate();
301
+ };
302
+ new IntersectionObserver(visibleCallback, { threshold: 0.001 }).observe(this.el);
303
+ const parentEl = (this.parentEl = this.el.closest('ion-picker'));
304
+ if (parentEl !== null) {
305
+ // TODO(FW-2832): type
306
+ parentEl.addEventListener('ionInputModeChange', (ev) => this.inputModeChange(ev));
212
307
  }
213
308
  }
214
- indexForY(y) {
215
- return Math.min(Math.max(Math.abs(Math.round(y / this.optHeight)), 0), this.col.options.length - 1);
216
- }
217
- onStart(detail) {
218
- // We have to prevent default in order to block scrolling under the picker
219
- // but we DO NOT have to stop propagation, since we still want
220
- // some "click" events to capture
221
- if (detail.event.cancelable) {
222
- detail.event.preventDefault();
223
- }
224
- detail.event.stopPropagation();
225
- hapticSelectionStart();
226
- // reset everything
227
- if (this.rafId !== undefined)
228
- cancelAnimationFrame(this.rafId);
229
- const options = this.col.options;
230
- let minY = options.length - 1;
231
- let maxY = 0;
232
- for (let i = 0; i < options.length; i++) {
233
- if (!options[i].disabled) {
234
- minY = Math.min(minY, i);
235
- maxY = Math.max(maxY, i);
309
+ componentDidRender() {
310
+ const { el, activeItem, isColumnVisible, value } = this;
311
+ if (isColumnVisible && !activeItem) {
312
+ const firstOption = el.querySelector('ion-picker-column-option');
313
+ /**
314
+ * If the picker column does not have an active item and the current value
315
+ * does not match the first item in the picker column, that means
316
+ * the value is out of bounds. In this case, we assign the value to the
317
+ * first item to match the scroll position of the column.
318
+ *
319
+ */
320
+ if (firstOption !== null && firstOption.value !== value) {
321
+ this.setValue(firstOption.value);
236
322
  }
237
323
  }
238
- this.minY = -(minY * this.optHeight);
239
- this.maxY = -(maxY * this.optHeight);
240
324
  }
241
- onMove(detail) {
242
- if (detail.event.cancelable) {
243
- detail.event.preventDefault();
244
- }
245
- detail.event.stopPropagation();
246
- // update the scroll position relative to pointer start position
247
- let y = this.y + detail.deltaY;
248
- if (y > this.minY) {
249
- // scrolling up higher than scroll area
250
- y = Math.pow(y, 0.8);
251
- this.bounceFrom = y;
252
- }
253
- else if (y < this.maxY) {
254
- // scrolling down below scroll area
255
- y += Math.pow(this.maxY - y, 0.9);
256
- this.bounceFrom = y;
257
- }
258
- else {
259
- this.bounceFrom = 0;
325
+ /** @internal */
326
+ async scrollActiveItemIntoView() {
327
+ const activeEl = this.activeItem;
328
+ if (activeEl) {
329
+ this.centerPickerItemInView(activeEl, false, false);
260
330
  }
261
- this.update(y, 0, false);
262
331
  }
263
- onEnd(detail) {
264
- if (this.bounceFrom > 0) {
265
- // bounce back up
266
- this.update(this.minY, 100, true);
267
- this.emitColChange();
332
+ /**
333
+ * Sets the value prop and fires the ionChange event.
334
+ * This is used when we need to fire ionChange from
335
+ * user-generated events that cannot be caught with normal
336
+ * input/change event listeners.
337
+ * @internal
338
+ */
339
+ async setValue(value) {
340
+ if (this.value === value) {
268
341
  return;
269
342
  }
270
- else if (this.bounceFrom < 0) {
271
- // bounce back down
272
- this.update(this.maxY, 100, true);
273
- this.emitColChange();
274
- return;
275
- }
276
- this.velocity = clamp(-MAX_PICKER_SPEED, detail.velocityY * 23, MAX_PICKER_SPEED);
277
- if (this.velocity === 0 && detail.deltaY === 0) {
278
- const opt = detail.event.target.closest('.picker-opt');
279
- if (opt === null || opt === void 0 ? void 0 : opt.hasAttribute('opt-index')) {
280
- this.setSelected(parseInt(opt.getAttribute('opt-index'), 10), TRANSITION_DURATION);
281
- }
282
- }
283
- else {
284
- this.y += detail.deltaY;
285
- if (Math.abs(detail.velocityY) < 0.05) {
286
- const isScrollingUp = detail.deltaY > 0;
287
- const optHeightFraction = (Math.abs(this.y) % this.optHeight) / this.optHeight;
288
- if (isScrollingUp && optHeightFraction > 0.5) {
289
- this.velocity = Math.abs(this.velocity) * -1;
290
- }
291
- else if (!isScrollingUp && optHeightFraction <= 0.5) {
292
- this.velocity = Math.abs(this.velocity);
293
- }
294
- }
295
- this.decelerate();
296
- }
343
+ this.value = value;
344
+ this.ionChange.emit({ value });
297
345
  }
298
- refresh(forceRefresh, animated) {
299
- var _a;
300
- let min = this.col.options.length - 1;
301
- let max = 0;
302
- const options = this.col.options;
303
- for (let i = 0; i < options.length; i++) {
304
- if (!options[i].disabled) {
305
- min = Math.min(min, i);
306
- max = Math.max(max, i);
307
- }
308
- }
309
- /**
310
- * Only update selected value if column has a
311
- * velocity of 0. If it does not, then the
312
- * column is animating might land on
313
- * a value different than the value at
314
- * selectedIndex
315
- */
316
- if (this.velocity !== 0) {
317
- return;
318
- }
319
- const selectedIndex = clamp(min, (_a = this.col.selectedIndex) !== null && _a !== void 0 ? _a : 0, max);
320
- if (this.col.prevSelected !== selectedIndex || forceRefresh) {
321
- const y = selectedIndex * this.optHeight * -1;
322
- const duration = animated ? TRANSITION_DURATION : 0;
323
- this.velocity = 0;
324
- this.update(y, duration, true);
346
+ /**
347
+ * Sets focus on the scrollable container within the picker column.
348
+ * Use this method instead of the global `pickerColumn.focus()`.
349
+ */
350
+ async setFocus() {
351
+ if (this.scrollEl) {
352
+ this.scrollEl.focus();
325
353
  }
326
354
  }
327
- onDomChange(forceRefresh, animated) {
328
- const colEl = this.optsEl;
329
- if (colEl) {
330
- // DOM READ
331
- // We perfom a DOM read over a rendered item, this needs to happen after the first render or after the the column has changed
332
- this.optHeight = colEl.firstElementChild ? colEl.firstElementChild.clientHeight : 0;
333
- }
334
- this.refresh(forceRefresh, animated);
355
+ get activeItem() {
356
+ const { value } = this;
357
+ const options = Array.from(this.el.querySelectorAll('ion-picker-column-option'));
358
+ return options.find((option) => {
359
+ /**
360
+ * If the whole picker column is disabled, the current value should appear active
361
+ * If the current value item is specifically disabled, it should not appear active
362
+ */
363
+ if (!this.disabled && option.disabled) {
364
+ return false;
365
+ }
366
+ return option.value === value;
367
+ });
335
368
  }
336
369
  render() {
337
- const col = this.col;
370
+ const { color, disabled: pickerDisabled, isActive, numericInput } = this;
338
371
  const mode = getIonMode(this);
339
- 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: {
340
- 'max-width': this.col.columnWidth,
341
- } }, 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))));
372
+ /**
373
+ * exportparts is needed so ion-datetime can expose the parts
374
+ * from two layers of shadow nesting. If this causes problems,
375
+ * the attribute can be moved to datetime.tsx and set on every
376
+ * instance of ion-picker-column there instead.
377
+ * TODO FW-5580 remove exportparts
378
+ */
379
+ return (h(Host, { exportparts: `${PICKER_ITEM_PART}, ${PICKER_ITEM_ACTIVE_PART}`, disabled: pickerDisabled, class: createColorClasses(color, {
380
+ [mode]: true,
381
+ ['picker-column-active']: isActive,
382
+ ['picker-column-numeric-input']: numericInput,
383
+ }) }, h("slot", { name: "prefix" }), h("div", { class: "picker-opts", tabindex: pickerDisabled ? undefined : 0, ref: (el) => {
384
+ this.scrollEl = el;
385
+ } }, h("div", { class: "picker-item picker-item-empty", "aria-hidden": "true" }, "\u00A0"), h("div", { class: "picker-item picker-item-empty", "aria-hidden": "true" }, "\u00A0"), h("div", { class: "picker-item picker-item-empty", "aria-hidden": "true" }, "\u00A0"), h("slot", null), h("div", { class: "picker-item picker-item-empty", "aria-hidden": "true" }, "\u00A0"), h("div", { class: "picker-item picker-item-empty", "aria-hidden": "true" }, "\u00A0"), h("div", { class: "picker-item picker-item-empty", "aria-hidden": "true" }, "\u00A0")), h("slot", { name: "suffix" })));
342
386
  }
343
387
  static get is() { return "ion-picker-column"; }
388
+ static get encapsulation() { return "shadow"; }
344
389
  static get originalStyleUrls() {
345
390
  return {
346
391
  "ios": ["picker-column.ios.scss"],
@@ -355,65 +400,205 @@ export class PickerColumnCmp {
355
400
  }
356
401
  static get properties() {
357
402
  return {
358
- "col": {
403
+ "disabled": {
404
+ "type": "boolean",
405
+ "mutable": false,
406
+ "complexType": {
407
+ "original": "boolean",
408
+ "resolved": "boolean",
409
+ "references": {}
410
+ },
411
+ "required": false,
412
+ "optional": false,
413
+ "docs": {
414
+ "tags": [],
415
+ "text": "If `true`, the user cannot interact with the picker."
416
+ },
417
+ "attribute": "disabled",
418
+ "reflect": false,
419
+ "defaultValue": "false"
420
+ },
421
+ "items": {
359
422
  "type": "unknown",
360
423
  "mutable": false,
361
424
  "complexType": {
362
- "original": "PickerColumn",
363
- "resolved": "PickerColumn",
425
+ "original": "PickerColumnItem[]",
426
+ "resolved": "PickerColumnItem[]",
364
427
  "references": {
365
- "PickerColumn": {
428
+ "PickerColumnItem": {
366
429
  "location": "import",
367
- "path": "../picker/picker-interface",
368
- "id": "src/components/picker/picker-interface.ts::PickerColumn"
430
+ "path": "./picker-column-interfaces",
431
+ "id": "src/components/picker-column/picker-column-interfaces.ts::PickerColumnItem"
369
432
  }
370
433
  }
371
434
  },
372
- "required": true,
435
+ "required": false,
373
436
  "optional": false,
374
437
  "docs": {
375
438
  "tags": [],
376
- "text": "Picker column data"
377
- }
439
+ "text": "A list of options to be displayed in the picker"
440
+ },
441
+ "defaultValue": "[]"
442
+ },
443
+ "value": {
444
+ "type": "any",
445
+ "mutable": true,
446
+ "complexType": {
447
+ "original": "string | number",
448
+ "resolved": "number | string | undefined",
449
+ "references": {}
450
+ },
451
+ "required": false,
452
+ "optional": true,
453
+ "docs": {
454
+ "tags": [],
455
+ "text": "The selected option in the picker."
456
+ },
457
+ "attribute": "value",
458
+ "reflect": false
459
+ },
460
+ "color": {
461
+ "type": "string",
462
+ "mutable": false,
463
+ "complexType": {
464
+ "original": "Color",
465
+ "resolved": "\"danger\" | \"dark\" | \"light\" | \"medium\" | \"primary\" | \"secondary\" | \"success\" | \"tertiary\" | \"warning\" | string & Record<never, never> | undefined",
466
+ "references": {
467
+ "Color": {
468
+ "location": "import",
469
+ "path": "../../interface",
470
+ "id": "src/interface.d.ts::Color"
471
+ }
472
+ }
473
+ },
474
+ "required": false,
475
+ "optional": true,
476
+ "docs": {
477
+ "tags": [],
478
+ "text": "The color to use from your application's color palette.\nDefault options are: `\"primary\"`, `\"secondary\"`, `\"tertiary\"`, `\"success\"`, `\"warning\"`, `\"danger\"`, `\"light\"`, `\"medium\"`, and `\"dark\"`.\nFor more information on colors, see [theming](/docs/theming/basics)."
479
+ },
480
+ "attribute": "color",
481
+ "reflect": true,
482
+ "defaultValue": "'primary'"
483
+ },
484
+ "numericInput": {
485
+ "type": "boolean",
486
+ "mutable": false,
487
+ "complexType": {
488
+ "original": "boolean",
489
+ "resolved": "boolean",
490
+ "references": {}
491
+ },
492
+ "required": false,
493
+ "optional": false,
494
+ "docs": {
495
+ "tags": [{
496
+ "name": "internal",
497
+ "text": undefined
498
+ }],
499
+ "text": "If `true`, tapping the picker will\nreveal a number input keyboard that lets\nthe user type in values for each picker\ncolumn. This is useful when working\nwith time pickers."
500
+ },
501
+ "attribute": "numeric-input",
502
+ "reflect": false,
503
+ "defaultValue": "false"
378
504
  }
379
505
  };
380
506
  }
507
+ static get states() {
508
+ return {
509
+ "isActive": {}
510
+ };
511
+ }
381
512
  static get events() {
382
513
  return [{
383
- "method": "ionPickerColChange",
384
- "name": "ionPickerColChange",
514
+ "method": "ionChange",
515
+ "name": "ionChange",
385
516
  "bubbles": true,
386
517
  "cancelable": true,
387
518
  "composed": true,
388
519
  "docs": {
520
+ "tags": [],
521
+ "text": "Emitted when the value has changed."
522
+ },
523
+ "complexType": {
524
+ "original": "{ value: string | number | undefined }",
525
+ "resolved": "{ value: string | number | undefined; }",
526
+ "references": {}
527
+ }
528
+ }];
529
+ }
530
+ static get methods() {
531
+ return {
532
+ "scrollActiveItemIntoView": {
533
+ "complexType": {
534
+ "signature": "() => Promise<void>",
535
+ "parameters": [],
536
+ "references": {
537
+ "Promise": {
538
+ "location": "global",
539
+ "id": "global::Promise"
540
+ }
541
+ },
542
+ "return": "Promise<void>"
543
+ },
544
+ "docs": {
545
+ "text": "",
389
546
  "tags": [{
390
547
  "name": "internal",
391
548
  "text": undefined
549
+ }]
550
+ }
551
+ },
552
+ "setValue": {
553
+ "complexType": {
554
+ "signature": "(value?: string | number) => Promise<void>",
555
+ "parameters": [{
556
+ "tags": [],
557
+ "text": ""
392
558
  }],
393
- "text": "Emitted when the selected value has changed"
559
+ "references": {
560
+ "Promise": {
561
+ "location": "global",
562
+ "id": "global::Promise"
563
+ }
564
+ },
565
+ "return": "Promise<void>"
394
566
  },
567
+ "docs": {
568
+ "text": "Sets the value prop and fires the ionChange event.\nThis is used when we need to fire ionChange from\nuser-generated events that cannot be caught with normal\ninput/change event listeners.",
569
+ "tags": [{
570
+ "name": "internal",
571
+ "text": undefined
572
+ }]
573
+ }
574
+ },
575
+ "setFocus": {
395
576
  "complexType": {
396
- "original": "PickerColumn",
397
- "resolved": "PickerColumn",
577
+ "signature": "() => Promise<void>",
578
+ "parameters": [],
398
579
  "references": {
399
- "PickerColumn": {
400
- "location": "import",
401
- "path": "../picker/picker-interface",
402
- "id": "src/components/picker/picker-interface.ts::PickerColumn"
580
+ "Promise": {
581
+ "location": "global",
582
+ "id": "global::Promise"
403
583
  }
404
- }
584
+ },
585
+ "return": "Promise<void>"
586
+ },
587
+ "docs": {
588
+ "text": "Sets focus on the scrollable container within the picker column.\nUse this method instead of the global `pickerColumn.focus()`.",
589
+ "tags": []
405
590
  }
406
- }];
591
+ }
592
+ };
407
593
  }
408
594
  static get elementRef() { return "el"; }
409
595
  static get watchers() {
410
596
  return [{
411
- "propName": "col",
412
- "methodName": "colChanged"
597
+ "propName": "value",
598
+ "methodName": "valueChange"
413
599
  }];
414
600
  }
415
601
  }
416
- const PICKER_OPT_SELECTED = 'picker-opt-selected';
417
- const DECELERATION_FRICTION = 0.97;
418
- const MAX_PICKER_SPEED = 90;
419
- const TRANSITION_DURATION = 150;
602
+ const PICKER_ITEM_ACTIVE_CLASS = 'option-active';
603
+ const PICKER_ITEM_PART = 'wheel-item';
604
+ const PICKER_ITEM_ACTIVE_PART = 'active';