@ionic/core 7.5.7-dev.11701201960.104b3a1f → 7.5.7-dev.11701203423.1b6a8829

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 (323) hide show
  1. package/components/backdrop.js +12 -0
  2. package/components/data.js +1 -1
  3. package/components/gesture-controller.js +1 -1
  4. package/components/icon.js +14 -23
  5. package/components/index7.js +1 -1
  6. package/components/ion-content.js +1 -1
  7. package/components/ion-datetime.js +61 -28
  8. package/components/ion-picker-column-internal.d.ts +11 -0
  9. package/components/ion-picker-column-internal.js +9 -0
  10. package/components/ion-picker-column.js +2 -2
  11. package/components/{ion-picker-legacy.d.ts → ion-picker-internal.d.ts} +4 -4
  12. package/components/ion-picker-internal.js +9 -0
  13. package/components/ion-picker.js +299 -1
  14. package/components/overlays.js +4 -11
  15. package/components/picker-column-internal.js +390 -0
  16. package/components/picker-column.js +320 -331
  17. package/components/{picker.js → picker-internal.js} +16 -16
  18. package/dist/cjs/{button-active-cd07b55b.js → button-active-af897e0e.js} +1 -1
  19. package/dist/cjs/{data-4845b494.js → data-c8d21093.js} +1 -1
  20. package/dist/cjs/{gesture-controller-d6a3f907.js → gesture-controller-b46721be.js} +0 -1
  21. package/dist/cjs/{index-0f8b33f8.js → index-0ee995e4.js} +1 -1
  22. package/dist/cjs/{index-09471526.js → index-5ea49600.js} +1 -1
  23. package/dist/cjs/index.cjs.js +3 -3
  24. package/dist/cjs/ion-accordion_2.cjs.entry.js +1 -1
  25. package/dist/cjs/ion-action-sheet.cjs.entry.js +4 -4
  26. package/dist/cjs/ion-alert.cjs.entry.js +4 -4
  27. package/dist/cjs/ion-app_8.cjs.entry.js +2 -2
  28. package/dist/cjs/ion-back-button.cjs.entry.js +1 -1
  29. package/dist/cjs/ion-backdrop.cjs.entry.js +12 -0
  30. package/dist/cjs/ion-breadcrumb_2.cjs.entry.js +1 -1
  31. package/dist/cjs/ion-button_2.cjs.entry.js +14 -23
  32. package/dist/cjs/ion-datetime-button.cjs.entry.js +1 -1
  33. package/dist/cjs/ion-datetime_3.cjs.entry.js +40 -27
  34. package/dist/cjs/ion-fab_3.cjs.entry.js +1 -1
  35. package/dist/cjs/ion-input.cjs.entry.js +1 -1
  36. package/dist/cjs/ion-item-option_3.cjs.entry.js +1 -1
  37. package/dist/cjs/ion-item_8.cjs.entry.js +1 -1
  38. package/dist/cjs/ion-loading.cjs.entry.js +1 -2
  39. package/dist/cjs/ion-menu_3.cjs.entry.js +4 -4
  40. package/dist/cjs/ion-modal.cjs.entry.js +3 -3
  41. package/dist/cjs/ion-nav_2.cjs.entry.js +1 -1
  42. package/dist/cjs/{ion-picker-column.cjs.entry.js → ion-picker-column-internal.cjs.entry.js} +9 -9
  43. package/dist/cjs/{ion-picker.cjs.entry.js → ion-picker-internal.cjs.entry.js} +13 -13
  44. package/dist/cjs/ion-popover.cjs.entry.js +1 -2
  45. package/dist/cjs/ion-range.cjs.entry.js +1 -1
  46. package/dist/cjs/ion-refresher_2.cjs.entry.js +4 -4
  47. package/dist/cjs/ion-reorder_2.cjs.entry.js +2 -2
  48. package/dist/cjs/ion-searchbar.cjs.entry.js +1 -1
  49. package/dist/cjs/ion-segment_2.cjs.entry.js +1 -1
  50. package/dist/cjs/ion-select_3.cjs.entry.js +2 -3
  51. package/dist/cjs/ion-toast.cjs.entry.js +1 -2
  52. package/dist/cjs/ion-toggle.cjs.entry.js +2 -2
  53. package/dist/cjs/ionic.cjs.js +1 -1
  54. package/dist/cjs/loader.cjs.js +1 -1
  55. package/dist/cjs/{overlays-dbb71984.js → overlays-2ffc5f27.js} +4 -11
  56. package/dist/cjs/{swipe-back-a6dc6e5d.js → swipe-back-d0412fb6.js} +2 -2
  57. package/dist/collection/collection-manifest.json +6 -6
  58. package/dist/collection/components/backdrop/backdrop.js +12 -0
  59. package/dist/collection/components/content/content.css +4 -0
  60. package/dist/collection/components/datetime/datetime.ios.css +25 -84
  61. package/dist/collection/components/datetime/datetime.js +29 -14
  62. package/dist/collection/components/datetime/datetime.md.css +25 -89
  63. package/dist/collection/components/datetime/test/a11y/datetime.e2e.js +1 -1
  64. package/dist/collection/components/datetime/test/a11y/datetime.spec.js +9 -6
  65. package/dist/collection/components/datetime/test/basic/datetime.e2e.js +0 -10
  66. package/dist/collection/components/datetime/test/disabled/datetime.spec.js +4 -4
  67. package/dist/collection/components/datetime/test/minmax/datetime.e2e.js +5 -5
  68. package/dist/collection/components/datetime/test/month-year-picker/datetime.e2e.js +1 -1
  69. package/dist/collection/components/datetime/test/prefer-wheel/datetime.e2e.js +2 -2
  70. package/dist/collection/components/datetime/test/presentation/datetime.e2e.js +1 -1
  71. package/dist/collection/components/datetime/test/readonly/datetime.e2e.js +2 -2
  72. package/dist/collection/components/datetime/test/values/datetime.e2e.js +5 -5
  73. package/dist/collection/components/datetime/utils/data.js +1 -1
  74. package/dist/collection/components/picker/picker.ios.css +205 -100
  75. package/dist/collection/components/picker/picker.js +735 -463
  76. package/dist/collection/components/picker/picker.md.css +194 -98
  77. package/dist/collection/components/picker/test/basic/picker.e2e.js +13 -106
  78. package/dist/collection/components/{picker-legacy → picker}/test/is-open/picker.e2e.js +4 -4
  79. package/dist/collection/components/{picker-legacy → picker}/test/picker-id.spec.js +5 -5
  80. package/dist/collection/components/{picker-legacy → picker}/test/trigger/picker.e2e.js +1 -1
  81. package/dist/collection/components/picker-column/picker-column.ios.css +176 -59
  82. package/dist/collection/components/picker-column/picker-column.js +333 -478
  83. package/dist/collection/components/picker-column/picker-column.md.css +113 -63
  84. package/dist/collection/components/{picker-legacy-column → picker-column}/test/picker-column-aria.spec.js +3 -3
  85. package/dist/collection/components/{picker-legacy-column → picker-column}/test/picker-column-dynamic.spec.js +2 -2
  86. package/dist/collection/components/{picker-legacy-column → picker-column}/test/picker-column.spec.js +2 -2
  87. package/dist/collection/components/{picker-legacy-column → picker-column}/test/standalone/picker-column.e2e.js +3 -3
  88. package/dist/collection/components/picker-column-internal/picker-column-internal.ios.css +138 -0
  89. package/dist/collection/components/picker-column-internal/picker-column-internal.js +565 -0
  90. package/dist/collection/components/{picker-legacy-column/picker-column.md.css → picker-column-internal/picker-column-internal.md.css} +63 -113
  91. package/dist/collection/components/{picker-column/test/basic/picker-column.e2e.js → picker-column-internal/test/basic/picker-column-internal.e2e.js} +7 -7
  92. package/dist/collection/components/{picker-column/test/disabled/picker-column.e2e.js → picker-column-internal/test/disabled/picker-column-internal.e2e.js} +39 -39
  93. package/dist/collection/components/{picker-legacy/picker.md.css → picker-internal/picker-internal.ios.css} +100 -192
  94. package/dist/collection/components/picker-internal/picker-internal.js +544 -0
  95. package/dist/collection/components/{picker-legacy-column/picker-column.ios.css → picker-internal/picker-internal.md.css} +101 -98
  96. package/dist/collection/components/{picker/test/a11y/picker.e2e.js → picker-internal/test/a11y/picker-internal.e2e.js} +2 -2
  97. package/dist/collection/components/picker-internal/test/basic/picker-internal.e2e.js +118 -0
  98. package/dist/collection/components/{picker/test/keyboard-entry/picker.e2e.js → picker-internal/test/keyboard-entry/picker-internal.e2e.js} +20 -20
  99. package/dist/collection/utils/gesture/gesture-controller.js +1 -1
  100. package/dist/collection/utils/overlays.js +4 -11
  101. package/dist/docs.json +40 -322
  102. package/dist/esm/{button-active-5b0516e7.js → button-active-ce5cba4c.js} +1 -1
  103. package/dist/esm/{data-12e24f00.js → data-44d9e816.js} +1 -1
  104. package/dist/esm/{gesture-controller-3723db7c.js → gesture-controller-0fa396c4.js} +1 -1
  105. package/dist/esm/{index-c132c5f1.js → index-d1a56aed.js} +1 -1
  106. package/dist/esm/{index-32cbee52.js → index-ff313b19.js} +2 -2
  107. package/dist/esm/index.js +3 -3
  108. package/dist/esm/ion-accordion_2.entry.js +1 -1
  109. package/dist/esm/ion-action-sheet.entry.js +4 -4
  110. package/dist/esm/ion-alert.entry.js +4 -4
  111. package/dist/esm/ion-app_8.entry.js +2 -2
  112. package/dist/esm/ion-back-button.entry.js +1 -1
  113. package/dist/esm/ion-backdrop.entry.js +12 -0
  114. package/dist/esm/ion-breadcrumb_2.entry.js +1 -1
  115. package/dist/esm/ion-button_2.entry.js +14 -23
  116. package/dist/esm/ion-datetime-button.entry.js +1 -1
  117. package/dist/esm/ion-datetime_3.entry.js +39 -26
  118. package/dist/esm/ion-fab_3.entry.js +1 -1
  119. package/dist/esm/ion-input.entry.js +1 -1
  120. package/dist/esm/ion-item-option_3.entry.js +1 -1
  121. package/dist/esm/ion-item_8.entry.js +1 -1
  122. package/dist/esm/ion-loading.entry.js +1 -2
  123. package/dist/esm/ion-menu_3.entry.js +4 -4
  124. package/dist/esm/ion-modal.entry.js +3 -3
  125. package/dist/esm/ion-nav_2.entry.js +1 -1
  126. package/dist/esm/{ion-picker-column.entry.js → ion-picker-column-internal.entry.js} +9 -9
  127. package/dist/esm/{ion-picker.entry.js → ion-picker-internal.entry.js} +13 -13
  128. package/dist/esm/ion-popover.entry.js +1 -2
  129. package/dist/esm/ion-range.entry.js +1 -1
  130. package/dist/esm/ion-refresher_2.entry.js +4 -4
  131. package/dist/esm/ion-reorder_2.entry.js +2 -2
  132. package/dist/esm/ion-searchbar.entry.js +1 -1
  133. package/dist/esm/ion-segment_2.entry.js +1 -1
  134. package/dist/esm/ion-select_3.entry.js +2 -3
  135. package/dist/esm/ion-toast.entry.js +1 -2
  136. package/dist/esm/ion-toggle.entry.js +2 -2
  137. package/dist/esm/ionic.js +1 -1
  138. package/dist/esm/loader.js +1 -1
  139. package/dist/esm/{overlays-789cd7a7.js → overlays-6c9feb7e.js} +4 -11
  140. package/dist/esm/{swipe-back-cc4c2bcb.js → swipe-back-0f3bfc8e.js} +2 -2
  141. package/dist/esm-es5/{button-active-5b0516e7.js → button-active-ce5cba4c.js} +1 -1
  142. package/dist/esm-es5/{gesture-controller-3723db7c.js → gesture-controller-0fa396c4.js} +1 -1
  143. package/dist/esm-es5/{index-32cbee52.js → index-ff313b19.js} +1 -1
  144. package/dist/esm-es5/index.js +1 -1
  145. package/dist/esm-es5/ion-accordion_2.entry.js +1 -1
  146. package/dist/esm-es5/ion-action-sheet.entry.js +1 -1
  147. package/dist/esm-es5/ion-alert.entry.js +1 -1
  148. package/dist/esm-es5/ion-app_8.entry.js +1 -1
  149. package/dist/esm-es5/ion-back-button.entry.js +1 -1
  150. package/dist/esm-es5/ion-backdrop.entry.js +1 -1
  151. package/dist/esm-es5/ion-breadcrumb_2.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-fab_3.entry.js +1 -1
  156. package/dist/esm-es5/ion-input.entry.js +1 -1
  157. package/dist/esm-es5/ion-item-option_3.entry.js +1 -1
  158. package/dist/esm-es5/ion-item_8.entry.js +1 -1
  159. package/dist/esm-es5/ion-loading.entry.js +1 -1
  160. package/dist/esm-es5/ion-menu_3.entry.js +1 -1
  161. package/dist/esm-es5/ion-modal.entry.js +1 -1
  162. package/dist/esm-es5/ion-nav_2.entry.js +1 -1
  163. package/dist/esm-es5/ion-picker-column-internal.entry.js +4 -0
  164. package/dist/esm-es5/ion-picker-internal.entry.js +4 -0
  165. package/dist/esm-es5/ion-popover.entry.js +1 -1
  166. package/dist/esm-es5/ion-range.entry.js +1 -1
  167. package/dist/esm-es5/ion-refresher_2.entry.js +1 -1
  168. package/dist/esm-es5/ion-reorder_2.entry.js +1 -1
  169. package/dist/esm-es5/ion-searchbar.entry.js +1 -1
  170. package/dist/esm-es5/ion-segment_2.entry.js +1 -1
  171. package/dist/esm-es5/ion-select_3.entry.js +1 -1
  172. package/dist/esm-es5/ion-toast.entry.js +1 -1
  173. package/dist/esm-es5/ion-toggle.entry.js +1 -1
  174. package/dist/esm-es5/ionic.js +1 -1
  175. package/dist/esm-es5/loader.js +1 -1
  176. package/dist/esm-es5/overlays-6c9feb7e.js +4 -0
  177. package/dist/esm-es5/swipe-back-0f3bfc8e.js +4 -0
  178. package/dist/html.html-data.json +1 -96
  179. package/dist/ionic/index.esm.js +1 -1
  180. package/dist/ionic/ionic.esm.js +1 -1
  181. package/dist/ionic/{p-14aca3fb.entry.js → p-04dca48d.entry.js} +1 -1
  182. package/dist/ionic/{p-a8e68fd9.entry.js → p-0838e6bb.entry.js} +1 -1
  183. package/dist/ionic/{p-a57f223c.system.js → p-09d142b3.system.js} +1 -1
  184. package/dist/ionic/p-0d8e9393.entry.js +4 -0
  185. package/dist/ionic/{p-abacb44b.system.entry.js → p-14923cd7.system.entry.js} +1 -1
  186. package/dist/ionic/p-18e01b30.system.entry.js +4 -0
  187. package/dist/ionic/p-19a7c660.system.entry.js +4 -0
  188. package/dist/ionic/{p-9b5301cc.system.entry.js → p-1cb5f2f8.system.entry.js} +1 -1
  189. package/dist/ionic/p-1e5165db.system.entry.js +4 -0
  190. package/dist/ionic/p-29adc040.entry.js +4 -0
  191. package/dist/ionic/p-29fe18ef.entry.js +4 -0
  192. package/dist/ionic/{p-56224549.entry.js → p-3de79805.entry.js} +1 -1
  193. package/dist/ionic/p-40903d34.system.js +1 -1
  194. package/dist/ionic/{p-664d2b07.system.entry.js → p-42435018.system.entry.js} +1 -1
  195. package/dist/ionic/p-431151f2.entry.js +4 -0
  196. package/dist/ionic/{p-cb62e3fc.system.entry.js → p-4c80afe1.system.entry.js} +1 -1
  197. package/dist/ionic/{p-d3952bd5.system.entry.js → p-4d786d1f.system.entry.js} +1 -1
  198. package/dist/ionic/{p-b6a8588f.entry.js → p-4fa201a7.entry.js} +1 -1
  199. package/dist/ionic/{p-ee800093.entry.js → p-52360c7a.entry.js} +1 -1
  200. package/dist/ionic/p-5bd4e009.entry.js +4 -0
  201. package/dist/ionic/{p-b3e79338.system.entry.js → p-61c30156.system.entry.js} +1 -1
  202. package/dist/ionic/{p-f5a750e4.system.entry.js → p-640efee6.system.entry.js} +1 -1
  203. package/dist/ionic/p-64296b15.entry.js +4 -0
  204. package/dist/ionic/{p-5da0eb3e.system.entry.js → p-6594d76a.system.entry.js} +1 -1
  205. package/dist/ionic/{p-02d8fdba.system.entry.js → p-67e644bd.system.entry.js} +1 -1
  206. package/dist/ionic/{p-3f88eab8.system.entry.js → p-67ed452a.system.entry.js} +1 -1
  207. package/dist/ionic/{p-835e0346.entry.js → p-68166ba6.entry.js} +1 -1
  208. package/dist/ionic/{p-966cf574.system.entry.js → p-6d812360.system.entry.js} +1 -1
  209. package/dist/ionic/{p-a4cda7a8.system.entry.js → p-6e23777e.system.entry.js} +1 -1
  210. package/dist/ionic/{p-2ba9414e.entry.js → p-7176cea3.entry.js} +1 -1
  211. package/dist/ionic/{p-878c7aa5.system.entry.js → p-7b4cd5fc.system.entry.js} +1 -1
  212. package/dist/ionic/{p-4f3e2767.system.entry.js → p-7d7fdaf0.system.entry.js} +1 -1
  213. package/dist/ionic/p-800ef057.js +4 -0
  214. package/dist/ionic/{p-3fb57e1b.system.entry.js → p-8659f9a9.system.entry.js} +1 -1
  215. package/dist/ionic/p-86b2394a.entry.js +4 -0
  216. package/dist/ionic/{p-48d9faa7.entry.js → p-899fb2da.entry.js} +1 -1
  217. package/dist/ionic/{p-baa7cb1e.entry.js → p-8ad82eb3.entry.js} +1 -1
  218. package/dist/ionic/{p-a7e2ac5c.js → p-8b1be026.js} +1 -1
  219. package/dist/ionic/{p-a21b8d05.entry.js → p-8cbf0979.entry.js} +1 -1
  220. package/dist/ionic/{p-477a182e.entry.js → p-8d5a30dd.entry.js} +1 -1
  221. package/dist/ionic/p-8dbdb163.system.js +4 -0
  222. package/dist/ionic/{p-9e6bf9ed.entry.js → p-8e1bded3.entry.js} +1 -1
  223. package/dist/ionic/{p-5ce11143.entry.js → p-965677f1.entry.js} +1 -1
  224. package/dist/ionic/{p-f4cc91f6.entry.js → p-97a96f5f.entry.js} +1 -1
  225. package/dist/ionic/p-97e31c0a.system.js +4 -0
  226. package/dist/ionic/{p-6500b298.system.js → p-9e852ff1.system.js} +1 -1
  227. package/dist/ionic/{p-1e86a71b.entry.js → p-a43603ce.entry.js} +1 -1
  228. package/dist/ionic/{p-c7fd81ba.system.js → p-a936d224.system.js} +1 -1
  229. package/dist/ionic/p-a9c3699b.system.entry.js +4 -0
  230. package/dist/ionic/p-b91fe549.entry.js +4 -0
  231. package/dist/ionic/{p-c1229981.entry.js → p-bd76524d.entry.js} +1 -1
  232. package/dist/ionic/p-beb64be7.system.entry.js +4 -0
  233. package/dist/ionic/{p-07d9e9cd.system.entry.js → p-c429a314.system.entry.js} +1 -1
  234. package/dist/ionic/p-c56b6570.system.entry.js +4 -0
  235. package/dist/ionic/p-c6be7737.system.entry.js +4 -0
  236. package/dist/ionic/p-c919498d.entry.js +4 -0
  237. package/dist/ionic/{p-d21bfe66.system.entry.js → p-cd2808f5.system.entry.js} +1 -1
  238. package/dist/ionic/p-cf425ec5.system.entry.js +4 -0
  239. package/dist/ionic/{p-c31fc05f.system.entry.js → p-db5043df.system.entry.js} +1 -1
  240. package/dist/ionic/{p-22813b28.system.entry.js → p-dbf7d6e5.system.entry.js} +1 -1
  241. package/dist/ionic/p-ddfc4ef4.system.entry.js +4 -0
  242. package/dist/ionic/{p-dd837fa8.entry.js → p-deab76dc.entry.js} +1 -1
  243. package/dist/ionic/{p-100ef961.js → p-e0b06b65.js} +1 -1
  244. package/dist/ionic/{p-302091ab.js → p-e627ed84.js} +1 -1
  245. package/dist/ionic/p-e6b240a0.js +4 -0
  246. package/dist/ionic/{p-b6f8ee31.entry.js → p-ee2469c1.entry.js} +1 -1
  247. package/dist/ionic/{p-939d903b.entry.js → p-f37b4b79.entry.js} +1 -1
  248. package/dist/ionic/{p-06e6d235.system.entry.js → p-f3c82f74.system.entry.js} +2 -2
  249. package/dist/ionic/p-f54ddd19.entry.js +4 -0
  250. package/dist/ionic/{p-2e1794df.system.js → p-fa8d4788.system.js} +1 -1
  251. package/dist/node_modules/ionicons/dist/collection/components/icon/icon.css +1 -0
  252. package/dist/types/components/backdrop/backdrop.d.ts +3 -0
  253. package/dist/types/components/datetime/datetime.d.ts +1 -0
  254. package/dist/types/components/datetime/utils/data.d.ts +2 -2
  255. package/dist/types/components/menu/menu.d.ts +1 -1
  256. package/dist/types/components/picker/picker.d.ts +131 -74
  257. package/dist/types/components/picker-column/picker-column.d.ts +39 -94
  258. package/dist/types/components/picker-column-internal/picker-column-internal.d.ts +102 -0
  259. package/dist/types/components/picker-internal/picker-internal-interfaces.d.ts +8 -0
  260. package/dist/types/components/picker-internal/picker-internal.d.ts +102 -0
  261. package/dist/types/components.d.ts +122 -122
  262. package/dist/types/interface.d.ts +1 -1
  263. package/dist/types/utils/config.d.ts +2 -2
  264. package/dist/types/utils/gesture/gesture-controller.d.ts +0 -1
  265. package/dist/types/utils/overlays.d.ts +2 -5
  266. package/hydrate/index.js +1083 -1067
  267. package/package.json +2 -2
  268. package/components/ion-picker-legacy-column.d.ts +0 -11
  269. package/components/ion-picker-legacy-column.js +0 -9
  270. package/components/ion-picker-legacy.js +0 -309
  271. package/components/picker-column2.js +0 -379
  272. package/dist/collection/components/picker-legacy/picker.ios.css +0 -367
  273. package/dist/collection/components/picker-legacy/picker.js +0 -817
  274. package/dist/collection/components/picker-legacy/test/basic/picker.e2e.js +0 -25
  275. package/dist/collection/components/picker-legacy-column/picker-column.js +0 -419
  276. package/dist/collection/utils/test/overlays/overlays-scroll-blocking.spec.js +0 -65
  277. package/dist/esm-es5/ion-picker-column.entry.js +0 -4
  278. package/dist/esm-es5/ion-picker.entry.js +0 -4
  279. package/dist/esm-es5/overlays-789cd7a7.js +0 -4
  280. package/dist/esm-es5/swipe-back-cc4c2bcb.js +0 -4
  281. package/dist/ionic/p-0c244faf.entry.js +0 -4
  282. package/dist/ionic/p-1dc91702.entry.js +0 -4
  283. package/dist/ionic/p-234b9617.system.entry.js +0 -4
  284. package/dist/ionic/p-25c34422.system.entry.js +0 -4
  285. package/dist/ionic/p-2804781b.entry.js +0 -4
  286. package/dist/ionic/p-2ad38423.system.entry.js +0 -4
  287. package/dist/ionic/p-39074595.entry.js +0 -4
  288. package/dist/ionic/p-439e20ef.entry.js +0 -4
  289. package/dist/ionic/p-6893f6e4.entry.js +0 -4
  290. package/dist/ionic/p-7c66a566.system.entry.js +0 -4
  291. package/dist/ionic/p-8b4ab236.entry.js +0 -4
  292. package/dist/ionic/p-9403b297.system.entry.js +0 -4
  293. package/dist/ionic/p-992d3bad.entry.js +0 -4
  294. package/dist/ionic/p-9c967a65.system.entry.js +0 -4
  295. package/dist/ionic/p-b4cbb736.js +0 -4
  296. package/dist/ionic/p-ba70d455.entry.js +0 -4
  297. package/dist/ionic/p-c32bf078.system.entry.js +0 -4
  298. package/dist/ionic/p-dc565ca3.js +0 -4
  299. package/dist/ionic/p-e88ed07f.system.js +0 -4
  300. package/dist/ionic/p-eb07ec1a.system.entry.js +0 -4
  301. package/dist/ionic/p-eb5697b5.system.js +0 -4
  302. package/dist/ionic/p-f0559c5d.system.entry.js +0 -4
  303. package/dist/ionic/p-fdd22426.entry.js +0 -4
  304. package/dist/types/components/picker/picker-interfaces.d.ts +0 -8
  305. package/dist/types/components/picker-legacy/picker.d.ts +0 -158
  306. package/dist/types/components/picker-legacy-column/picker-column.d.ts +0 -46
  307. /package/dist/collection/components/{picker-legacy → picker}/animations/ios.enter.js +0 -0
  308. /package/dist/collection/components/{picker-legacy → picker}/animations/ios.leave.js +0 -0
  309. /package/dist/collection/components/picker/{picker-interfaces.js → picker-interface.js} +0 -0
  310. /package/dist/collection/components/{picker-legacy-column → picker-column}/test/test.utils.js +0 -0
  311. /package/dist/collection/components/{picker-column/picker-column-interfaces.js → picker-column-internal/picker-column-internal-interfaces.js} +0 -0
  312. /package/dist/collection/components/{picker-legacy/picker-interface.js → picker-internal/picker-internal-interfaces.js} +0 -0
  313. /package/dist/esm-es5/{data-12e24f00.js → data-44d9e816.js} +0 -0
  314. /package/dist/esm-es5/{index-c132c5f1.js → index-d1a56aed.js} +0 -0
  315. /package/dist/ionic/{p-bb849ebb.js → p-17240d90.js} +0 -0
  316. /package/dist/ionic/{p-ea96fa73.js → p-6e383534.js} +0 -0
  317. /package/dist/ionic/{p-8050b9b9.system.js → p-84c6dece.system.js} +0 -0
  318. /package/dist/ionic/{p-e4219e27.system.js → p-b8c3f071.system.js} +0 -0
  319. /package/dist/types/components/{picker-legacy → picker}/animations/ios.enter.d.ts +0 -0
  320. /package/dist/types/components/{picker-legacy → picker}/animations/ios.leave.d.ts +0 -0
  321. /package/dist/types/components/{picker-legacy → picker}/picker-interface.d.ts +0 -0
  322. /package/dist/types/components/{picker-legacy-column → picker-column}/test/test.utils.d.ts +0 -0
  323. /package/dist/types/components/{picker-column/picker-column-interfaces.d.ts → picker-column-internal/picker-column-internal-interfaces.d.ts} +0 -0
@@ -2,377 +2,366 @@
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 { r as raf, g as getElementRoot } from './helpers.js';
6
- import { a as hapticSelectionStart, b as hapticSelectionChanged, h as hapticSelectionEnd } from './haptic.js';
7
- import { a as isPlatform, b as getIonMode } from './ionic-global.js';
8
- import { c as createColorClasses } from './theme.js';
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';
9
9
 
10
- const pickerColumnIosCss = ":host{-webkit-padding-start:16px;padding-inline-start:16px;-webkit-padding-end:16px;padding-inline-end:16px;padding-top:0px;padding-bottom:0px;height:200px;outline:none;font-size:22px;-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;text-align:center}:host::-webkit-scrollbar{display:none}:host .picker-item{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;cursor:pointer;overflow:hidden;scroll-snap-align:center}:host .picker-item-empty,:host .picker-item[disabled]{cursor:default}:host .picker-item-empty,:host(:not([disabled])) .picker-item[disabled]{scroll-snap-align:none}:host([disabled]){overflow-y:hidden}:host .picker-item[disabled]{opacity:0.4}:host(.picker-column-active) .picker-item.picker-item-active{color:var(--ion-color-base)}@media (any-hover: hover){:host(:focus){outline:none;background:rgba(var(--ion-color-base-rgb), 0.2)}}";
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
11
 
12
- const pickerColumnMdCss = ":host{-webkit-padding-start:16px;padding-inline-start:16px;-webkit-padding-end:16px;padding-inline-end:16px;padding-top:0px;padding-bottom:0px;height:200px;outline:none;font-size:22px;-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;text-align:center}:host::-webkit-scrollbar{display:none}:host .picker-item{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;cursor:pointer;overflow:hidden;scroll-snap-align:center}:host .picker-item-empty,:host .picker-item[disabled]{cursor:default}:host .picker-item-empty,:host(:not([disabled])) .picker-item[disabled]{scroll-snap-align:none}:host([disabled]){overflow-y:hidden}:host .picker-item[disabled]{opacity:0.4}:host(.picker-column-active) .picker-item.picker-item-active{color:var(--ion-color-base)}@media (any-hover: hover){:host(:focus){outline:none;background:rgba(var(--ion-color-base-rgb), 0.2)}}:host .picker-item-active{color:var(--ion-color-base)}";
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
13
 
14
- const PickerColumn = /*@__PURE__*/ proxyCustomElement(class PickerColumn extends HTMLElement {
14
+ const PickerColumnCmp = /*@__PURE__*/ proxyCustomElement(class PickerColumnCmp extends HTMLElement {
15
15
  constructor() {
16
16
  super();
17
17
  this.__registerHost();
18
- this.__attachShadow();
19
- this.ionChange = createEvent(this, "ionChange", 7);
20
- this.isScrolling = false;
21
- this.isColumnVisible = false;
22
- this.canExitInputMode = true;
23
- this.centerPickerItemInView = (target, smooth = true, canExitInputMode = true) => {
24
- const { el, isColumnVisible } = this;
25
- if (isColumnVisible) {
26
- // (Vertical offset from parent) - (three empty picker rows) + (half the height of the target to ensure the scroll triggers)
27
- const top = target.offsetTop - 3 * target.clientHeight + target.clientHeight / 2;
28
- if (el.scrollTop !== top) {
29
- /**
30
- * Setting this flag prevents input
31
- * mode from exiting in the picker column's
32
- * scroll callback. This is useful when the user manually
33
- * taps an item or types on the keyboard as both
34
- * of these can cause a scroll to occur.
35
- */
36
- this.canExitInputMode = canExitInputMode;
37
- el.scroll({
38
- top,
39
- left: 0,
40
- behavior: smooth ? 'smooth' : undefined,
41
- });
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;
42
135
  }
43
- }
44
- };
45
- this.setPickerItemActiveState = (item, isActive) => {
46
- if (isActive) {
47
- item.classList.add(PICKER_ITEM_ACTIVE_CLASS);
48
- item.part.add(PICKER_ITEM_ACTIVE_PART);
49
136
  }
50
137
  else {
51
- item.classList.remove(PICKER_ITEM_ACTIVE_CLASS);
52
- item.part.remove(PICKER_ITEM_ACTIVE_PART);
138
+ translateZ = 0;
139
+ translateY = optOffset;
53
140
  }
54
- };
55
- /**
56
- * When ionInputModeChange is emitted, each column
57
- * needs to check if it is the one being made available
58
- * for text entry.
59
- */
60
- this.inputModeChange = (ev) => {
61
- if (!this.numericInput) {
62
- return;
141
+ const selected = selectedIndex === i;
142
+ transform += `translate3d(0px,${translateY}px,${translateZ}px) `;
143
+ if (this.scaleFactor !== 1 && !selected) {
144
+ transform += scaleStr;
63
145
  }
64
- const { useInputMode, inputModeColumn } = ev.detail;
65
- /**
66
- * If inputModeColumn is undefined then this means
67
- * all numericInput columns are being selected.
68
- */
69
- const isColumnActive = inputModeColumn === undefined || inputModeColumn === this.el;
70
- if (!useInputMode || !isColumnActive) {
71
- this.setInputModeActive(false);
72
- return;
146
+ // Update transition duration
147
+ if (this.noAnimate) {
148
+ opt.duration = 0;
149
+ button.style.transitionDuration = '';
73
150
  }
74
- this.setInputModeActive(true);
75
- };
76
- /**
77
- * Setting isActive will cause a re-render.
78
- * As a result, we do not want to cause the
79
- * re-render mid scroll as this will cause
80
- * the picker column to jump back to
81
- * whatever value was selected at the
82
- * start of the scroll interaction.
83
- */
84
- this.setInputModeActive = (state) => {
85
- if (this.isScrolling) {
86
- this.scrollEndCallback = () => {
87
- this.isActive = state;
88
- };
89
- return;
151
+ else if (duration !== opt.duration) {
152
+ opt.duration = duration;
153
+ button.style.transitionDuration = durationStr;
90
154
  }
91
- this.isActive = state;
92
- };
93
- /**
94
- * When the column scrolls, the component
95
- * needs to determine which item is centered
96
- * in the view and will emit an ionChange with
97
- * the item object.
98
- */
99
- this.initializeScrollListener = () => {
100
- /**
101
- * The haptics for the wheel picker are
102
- * an iOS-only feature. As a result, they should
103
- * be disabled on Android.
104
- */
105
- const enableHaptics = isPlatform('ios');
106
- const { el } = this;
107
- let timeout;
108
- let activeEl = this.activeItem;
109
- const scrollCallback = () => {
110
- raf(() => {
111
- if (timeout) {
112
- clearTimeout(timeout);
113
- timeout = undefined;
114
- }
115
- if (!this.isScrolling) {
116
- enableHaptics && hapticSelectionStart();
117
- this.isScrolling = true;
118
- }
119
- /**
120
- * Select item in the center of the column
121
- * which is the month/year that we want to select
122
- */
123
- const bbox = el.getBoundingClientRect();
124
- const centerX = bbox.x + bbox.width / 2;
125
- const centerY = bbox.y + bbox.height / 2;
126
- const activeElement = el.shadowRoot.elementFromPoint(centerX, centerY);
127
- if (activeEl !== null) {
128
- this.setPickerItemActiveState(activeEl, false);
129
- }
130
- if (activeElement === null || activeElement.disabled) {
131
- return;
132
- }
133
- /**
134
- * If we are selecting a new value,
135
- * we need to run haptics again.
136
- */
137
- if (activeElement !== activeEl) {
138
- enableHaptics && hapticSelectionChanged();
139
- if (this.canExitInputMode) {
140
- /**
141
- * The native iOS wheel picker
142
- * only dismisses the keyboard
143
- * once the selected item has changed
144
- * as a result of a swipe
145
- * from the user. If `canExitInputMode` is
146
- * `false` then this means that the
147
- * scroll is happening as a result of
148
- * the `value` property programmatically changing
149
- * either by an application or by the user via the keyboard.
150
- */
151
- this.exitInputMode();
152
- }
153
- }
154
- activeEl = activeElement;
155
- this.setPickerItemActiveState(activeElement, true);
156
- timeout = setTimeout(() => {
157
- this.isScrolling = false;
158
- enableHaptics && hapticSelectionEnd();
159
- /**
160
- * Certain tasks (such as those that
161
- * cause re-renders) should only be done
162
- * once scrolling has finished, otherwise
163
- * flickering may occur.
164
- */
165
- const { scrollEndCallback } = this;
166
- if (scrollEndCallback) {
167
- scrollEndCallback();
168
- this.scrollEndCallback = undefined;
169
- }
170
- /**
171
- * Reset this flag as the
172
- * next scroll interaction could
173
- * be a scroll from the user. In this
174
- * case, we should exit input mode.
175
- */
176
- this.canExitInputMode = true;
177
- const dataIndex = activeElement.getAttribute('data-index');
178
- /**
179
- * If no value it is
180
- * possible we hit one of the
181
- * empty padding columns.
182
- */
183
- if (dataIndex === null) {
184
- return;
185
- }
186
- const index = parseInt(dataIndex, 10);
187
- const selectedItem = this.items[index];
188
- if (selectedItem.value !== this.value) {
189
- this.setValue(selectedItem.value);
190
- }
191
- }, 250);
192
- });
193
- };
194
- /**
195
- * Wrap this in an raf so that the scroll callback
196
- * does not fire when component is initially shown.
197
- */
198
- raf(() => {
199
- el.addEventListener('scroll', scrollCallback);
200
- this.destroyScrollListener = () => {
201
- el.removeEventListener('scroll', scrollCallback);
202
- };
203
- });
204
- };
205
- /**
206
- * Tells the parent picker to
207
- * exit text entry mode. This is only called
208
- * when the selected item changes during scroll, so
209
- * we know that the user likely wants to scroll
210
- * instead of type.
211
- */
212
- this.exitInputMode = () => {
213
- const { parentEl } = this;
214
- if (parentEl == null)
215
- return;
216
- parentEl.exitInputMode();
217
- /**
218
- * setInputModeActive only takes
219
- * effect once scrolling stops to avoid
220
- * a component re-render while scrolling.
221
- * However, we want the visual active
222
- * indicator to go away immediately, so
223
- * we call classList.remove here.
224
- */
225
- this.el.classList.remove('picker-column-active');
226
- };
227
- this.isActive = false;
228
- this.disabled = false;
229
- this.items = [];
230
- this.value = undefined;
231
- this.color = 'primary';
232
- this.numericInput = false;
233
- }
234
- valueChange() {
235
- if (this.isColumnVisible) {
155
+ // Update transform
156
+ if (transform !== opt.transform) {
157
+ opt.transform = transform;
158
+ }
159
+ button.style.transform = transform;
236
160
  /**
237
- * Only scroll the active item into view when the picker column
238
- * is actively visible to the user.
161
+ * Ensure that the select column
162
+ * item has the selected class
239
163
  */
240
- this.scrollActiveItemIntoView();
164
+ opt.selected = selected;
165
+ if (selected) {
166
+ button.classList.add(PICKER_OPT_SELECTED);
167
+ }
168
+ else {
169
+ button.classList.remove(PICKER_OPT_SELECTED);
170
+ }
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;
241
180
  }
242
181
  }
243
- /**
244
- * Only setup scroll listeners
245
- * when the picker is visible, otherwise
246
- * the container will have a scroll
247
- * height of 0px.
248
- */
249
- componentWillLoad() {
250
- const visibleCallback = (entries) => {
251
- const ev = entries[0];
252
- if (ev.isIntersecting) {
253
- const { activeItem, el } = this;
254
- this.isColumnVisible = true;
255
- /**
256
- * Because this initial call to scrollActiveItemIntoView has to fire before
257
- * the scroll listener is set up, we need to manage the active class manually.
258
- */
259
- const oldActive = getElementRoot(el).querySelector(`.${PICKER_ITEM_ACTIVE_CLASS}`);
260
- if (oldActive) {
261
- this.setPickerItemActiveState(oldActive, false);
262
- }
263
- this.scrollActiveItemIntoView();
264
- if (activeItem) {
265
- this.setPickerItemActiveState(activeItem, true);
266
- }
267
- this.initializeScrollListener();
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());
268
204
  }
269
205
  else {
270
- this.isColumnVisible = false;
271
- if (this.destroyScrollListener) {
272
- this.destroyScrollListener();
273
- this.destroyScrollListener = undefined;
274
- }
206
+ this.velocity = 0;
207
+ this.emitColChange();
208
+ hapticSelectionEnd();
275
209
  }
276
- };
277
- new IntersectionObserver(visibleCallback, { threshold: 0.001 }).observe(this.el);
278
- const parentEl = (this.parentEl = this.el.closest('ion-picker'));
279
- if (parentEl !== null) {
280
- // TODO(FW-2832): type
281
- parentEl.addEventListener('ionInputModeChange', (ev) => this.inputModeChange(ev));
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();
282
217
  }
283
218
  }
284
- componentDidRender() {
285
- var _a;
286
- const { activeItem, items, isColumnVisible, value } = this;
287
- if (isColumnVisible) {
288
- if (activeItem) {
289
- this.scrollActiveItemIntoView();
290
- }
291
- else if (((_a = items[0]) === null || _a === void 0 ? void 0 : _a.value) !== value) {
292
- /**
293
- * If the picker column does not have an active item and the current value
294
- * does not match the first item in the picker column, that means
295
- * the value is out of bounds. In this case, we assign the value to the
296
- * first item to match the scroll position of the column.
297
- *
298
- */
299
- this.setValue(items[0].value);
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);
300
241
  }
301
242
  }
243
+ this.minY = -(minY * this.optHeight);
244
+ this.maxY = -(maxY * this.optHeight);
245
+ }
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;
257
+ }
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);
302
267
  }
303
- /** @internal */
304
- async scrollActiveItemIntoView() {
305
- const activeEl = this.activeItem;
306
- if (activeEl) {
307
- this.centerPickerItemInView(activeEl, false, false);
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();
279
+ return;
280
+ }
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();
308
301
  }
309
302
  }
310
- /**
311
- * Sets the value prop and fires the ionChange event.
312
- * This is used when we need to fire ionChange from
313
- * user-generated events that cannot be caught with normal
314
- * input/change event listeners.
315
- * @internal
316
- */
317
- async setValue(value) {
318
- const { items } = this;
319
- this.value = value;
320
- const findItem = items.find((item) => item.value === value && item.disabled !== true);
321
- if (findItem) {
322
- this.ionChange.emit(findItem);
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);
323
330
  }
324
331
  }
325
- get activeItem() {
326
- // If the whole picker column is disabled, the current value should appear active
327
- // If the current value item is specifically disabled, it should not appear active
328
- const selector = `.picker-item[data-value="${this.value}"]${this.disabled ? '' : ':not([disabled])'}`;
329
- return getElementRoot(this.el).querySelector(selector);
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);
330
340
  }
331
341
  render() {
332
- const { items, color, disabled: pickerDisabled, isActive, numericInput } = this;
342
+ const col = this.col;
333
343
  const mode = getIonMode(this);
334
- /**
335
- * exportparts is needed so ion-datetime can expose the parts
336
- * from two layers of shadow nesting. If this causes problems,
337
- * the attribute can be moved to datetime.tsx and set on every
338
- * instance of ion-picker-column there instead.
339
- */
340
- return (h(Host, { exportparts: `${PICKER_ITEM_PART}, ${PICKER_ITEM_ACTIVE_PART}`, disabled: pickerDisabled, tabindex: pickerDisabled ? null : 0, class: createColorClasses(color, {
341
- [mode]: true,
342
- ['picker-column-active']: isActive,
343
- ['picker-column-numeric-input']: numericInput,
344
- }) }, 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"), items.map((item, index) => {
345
- const isItemDisabled = pickerDisabled || item.disabled || false;
346
- return (h("button", { tabindex: "-1", class: {
347
- 'picker-item': true,
348
- }, "data-value": item.value, "data-index": index, onClick: (ev) => {
349
- this.centerPickerItemInView(ev.target, true);
350
- }, disabled: isItemDisabled, part: PICKER_ITEM_PART }, item.text));
351
- }), 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")));
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))));
352
347
  }
353
348
  get el() { return this; }
354
349
  static get watchers() { return {
355
- "value": ["valueChange"]
350
+ "col": ["colChanged"]
356
351
  }; }
357
352
  static get style() { return {
358
353
  ios: pickerColumnIosCss,
359
354
  md: pickerColumnMdCss
360
355
  }; }
361
- }, [33, "ion-picker-column", {
362
- "disabled": [4],
363
- "items": [16],
364
- "value": [1032],
365
- "color": [513],
366
- "numericInput": [4, "numeric-input"],
367
- "isActive": [32],
368
- "scrollActiveItemIntoView": [64],
369
- "setValue": [64]
356
+ }, [32, "ion-picker-column", {
357
+ "col": [16]
370
358
  }, undefined, {
371
- "value": ["valueChange"]
359
+ "col": ["colChanged"]
372
360
  }]);
373
- const PICKER_ITEM_ACTIVE_CLASS = 'picker-item-active';
374
- const PICKER_ITEM_PART = 'wheel-item';
375
- const PICKER_ITEM_ACTIVE_PART = 'active';
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;
376
365
  function defineCustomElement() {
377
366
  if (typeof customElements === "undefined") {
378
367
  return;
@@ -381,10 +370,10 @@ function defineCustomElement() {
381
370
  components.forEach(tagName => { switch (tagName) {
382
371
  case "ion-picker-column":
383
372
  if (!customElements.get(tagName)) {
384
- customElements.define(tagName, PickerColumn);
373
+ customElements.define(tagName, PickerColumnCmp);
385
374
  }
386
375
  break;
387
376
  } });
388
377
  }
389
378
 
390
- export { PickerColumn as P, defineCustomElement as d };
379
+ export { PickerColumnCmp as P, defineCustomElement as d };