voyager-ionic-core 7.7.3 → 7.8.6

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 (610) hide show
  1. package/components/action-sheet.js +3 -3
  2. package/components/alert.js +2 -2
  3. package/components/backdrop.js +1 -1
  4. package/components/button.js +4 -4
  5. package/components/buttons.js +1 -1
  6. package/components/checkbox.js +1 -1
  7. package/components/data.js +23 -38
  8. package/components/hardware-back-button.js +3 -3
  9. package/components/input-shims.js +5 -5
  10. package/components/ion-app.js +4 -4
  11. package/components/ion-avatar.js +1 -1
  12. package/components/ion-back-button.js +2 -2
  13. package/components/ion-badge.js +2 -2
  14. package/components/ion-breadcrumb.js +4 -4
  15. package/components/ion-breadcrumbs.js +2 -2
  16. package/components/ion-card-content.js +1 -1
  17. package/components/ion-card-header.js +2 -2
  18. package/components/ion-card-subtitle.js +2 -2
  19. package/components/ion-card-title.js +2 -2
  20. package/components/ion-card.js +1 -1
  21. package/components/ion-chip.js +2 -2
  22. package/components/ion-col.js +2 -2
  23. package/components/ion-content.js +3 -3
  24. package/components/ion-datetime-button.js +12 -11
  25. package/components/ion-datetime.js +75 -12
  26. package/components/ion-fab-button.js +2 -2
  27. package/components/ion-fab-list.js +2 -2
  28. package/components/ion-fab.js +2 -2
  29. package/components/ion-footer.js +2 -2
  30. package/components/ion-grid.js +2 -2
  31. package/components/ion-header.js +3 -3
  32. package/components/ion-img.js +1 -1
  33. package/components/ion-infinite-scroll-content.js +2 -2
  34. package/components/ion-infinite-scroll.js +1 -1
  35. package/components/ion-input.js +8 -0
  36. package/components/ion-item-divider.js +2 -2
  37. package/components/ion-item-group.js +1 -1
  38. package/components/ion-item-option.js +2 -2
  39. package/components/ion-item-options.js +1 -1
  40. package/components/ion-item-sliding.js +1 -1
  41. package/components/ion-loading.js +2 -2
  42. package/components/ion-menu-button.js +2 -2
  43. package/components/ion-menu-toggle.js +2 -2
  44. package/components/ion-menu.js +3 -3
  45. package/components/ion-modal.js +81 -25
  46. package/components/ion-nav-link.js +1 -1
  47. package/components/ion-nav.js +1 -1
  48. package/components/ion-picker.js +2 -2
  49. package/components/ion-progress-bar.js +1 -1
  50. package/components/ion-range.js +126 -21
  51. package/components/ion-refresher-content.js +1 -1
  52. package/components/ion-refresher.js +1 -1
  53. package/components/ion-reorder-group.js +1 -1
  54. package/components/ion-reorder.js +1 -1
  55. package/components/ion-router-link.js +2 -2
  56. package/components/ion-router-outlet.js +1 -1
  57. package/components/ion-row.js +1 -1
  58. package/components/ion-searchbar.js +35 -6
  59. package/components/ion-segment-button.js +3 -3
  60. package/components/ion-segment.js +2 -2
  61. package/components/ion-select-option.js +1 -1
  62. package/components/ion-skeleton-text.js +2 -2
  63. package/components/ion-split-pane.js +2 -2
  64. package/components/ion-tab-bar.js +2 -2
  65. package/components/ion-tab-button.js +2 -2
  66. package/components/ion-tab.js +2 -2
  67. package/components/ion-tabs.js +1 -1
  68. package/components/ion-text.js +2 -2
  69. package/components/ion-thumbnail.js +1 -1
  70. package/components/ion-title.js +2 -2
  71. package/components/ion-toast.js +2 -2
  72. package/components/ion-toolbar.js +2 -2
  73. package/components/item.js +1 -1
  74. package/components/label.js +1 -1
  75. package/components/list-header.js +2 -2
  76. package/components/list.js +1 -1
  77. package/components/note.js +2 -2
  78. package/components/overlays.js +61 -19
  79. package/components/picker-column-internal.js +8 -4
  80. package/components/picker-column.js +2 -2
  81. package/components/picker-internal.js +2 -2
  82. package/components/popover.js +4 -4
  83. package/components/radio-group.js +1 -1
  84. package/components/ripple-effect.js +1 -1
  85. package/components/select-popover.js +1 -1
  86. package/components/spinner.js +1 -1
  87. package/css/core.css +1 -561
  88. package/css/core.css.map +1 -1
  89. package/css/display.css +1 -131
  90. package/css/display.css.map +1 -1
  91. package/css/flex-utils.css +1 -81
  92. package/css/flex-utils.css.map +1 -1
  93. package/css/float-elements.css +1 -293
  94. package/css/float-elements.css.map +1 -1
  95. package/css/global.bundle.css +1 -457
  96. package/css/global.bundle.css.map +1 -1
  97. package/css/ionic-swiper.css +1 -127
  98. package/css/ionic-swiper.css.map +1 -1
  99. package/css/ionic.bundle.css +1 -1
  100. package/css/ionic.bundle.css.map +1 -1
  101. package/css/normalize.css +1 -150
  102. package/css/normalize.css.map +1 -1
  103. package/css/padding.css +1 -202
  104. package/css/padding.css.map +1 -1
  105. package/css/structure.css +1 -152
  106. package/css/structure.css.map +1 -1
  107. package/css/text-alignment.css +1 -243
  108. package/css/text-alignment.css.map +1 -1
  109. package/css/text-transformation.css +1 -158
  110. package/css/text-transformation.css.map +1 -1
  111. package/css/typography.css +1 -157
  112. package/css/typography.css.map +1 -1
  113. package/css/utils.bundle.css +1 -1100
  114. package/css/utils.bundle.css.map +1 -1
  115. package/dist/cjs/{app-globals-92ad1b3d.js → app-globals-c5eb104c.js} +1 -1
  116. package/dist/cjs/{button-active-2d6520ec.js → button-active-181d142e.js} +1 -1
  117. package/dist/cjs/{data-a5109f09.js → data-4487a815.js} +22 -39
  118. package/dist/cjs/{hardware-back-button-2696acaf.js → hardware-back-button-adba3ac7.js} +5 -5
  119. package/dist/cjs/{index-9bfcb6e8.js → index-1f7c54f8.js} +3 -3
  120. package/dist/cjs/{index-0ffe376d.js → index-22617dd6.js} +51 -7
  121. package/dist/cjs/{index-4c96691f.js → index-5c38afe7.js} +2 -2
  122. package/dist/cjs/index.cjs.js +8 -8
  123. package/dist/cjs/{input-shims-a9a85bb9.js → input-shims-05ac9905.js} +5 -5
  124. package/dist/cjs/ion-accordion_2.cjs.entry.js +2 -2
  125. package/dist/cjs/ion-action-sheet.cjs.entry.js +8 -8
  126. package/dist/cjs/ion-alert.cjs.entry.js +7 -7
  127. package/dist/cjs/ion-app_8.cjs.entry.js +24 -24
  128. package/dist/cjs/ion-avatar_3.cjs.entry.js +6 -6
  129. package/dist/cjs/ion-back-button.cjs.entry.js +4 -4
  130. package/dist/cjs/ion-backdrop.cjs.entry.js +3 -3
  131. package/dist/cjs/ion-breadcrumb_2.cjs.entry.js +8 -8
  132. package/dist/cjs/ion-button_2.cjs.entry.js +6 -6
  133. package/dist/cjs/ion-card_5.cjs.entry.js +10 -10
  134. package/dist/cjs/ion-checkbox.cjs.entry.js +3 -3
  135. package/dist/cjs/ion-chip.cjs.entry.js +4 -4
  136. package/dist/cjs/ion-col_3.cjs.entry.js +7 -7
  137. package/dist/cjs/ion-datetime-button.cjs.entry.js +14 -13
  138. package/dist/cjs/ion-datetime_3.cjs.entry.js +80 -20
  139. package/dist/cjs/ion-fab_3.cjs.entry.js +8 -8
  140. package/dist/cjs/ion-img.cjs.entry.js +3 -3
  141. package/dist/cjs/ion-infinite-scroll_2.cjs.entry.js +5 -5
  142. package/dist/cjs/ion-input.cjs.entry.js +10 -2
  143. package/dist/cjs/ion-item-option_3.cjs.entry.js +6 -6
  144. package/dist/cjs/ion-item_8.cjs.entry.js +14 -14
  145. package/dist/cjs/ion-loading.cjs.entry.js +6 -6
  146. package/dist/cjs/ion-menu_3.cjs.entry.js +11 -11
  147. package/dist/cjs/ion-modal.cjs.entry.js +86 -30
  148. package/dist/cjs/ion-nav_2.cjs.entry.js +5 -5
  149. package/dist/cjs/ion-picker-column-internal.cjs.entry.js +10 -6
  150. package/dist/cjs/ion-picker-internal.cjs.entry.js +3 -3
  151. package/dist/cjs/ion-popover.cjs.entry.js +9 -9
  152. package/dist/cjs/ion-progress-bar.cjs.entry.js +3 -3
  153. package/dist/cjs/ion-radio_2.cjs.entry.js +3 -3
  154. package/dist/cjs/ion-range.cjs.entry.js +128 -23
  155. package/dist/cjs/ion-refresher_2.cjs.entry.js +4 -4
  156. package/dist/cjs/ion-reorder_2.cjs.entry.js +4 -4
  157. package/dist/cjs/ion-ripple-effect.cjs.entry.js +3 -3
  158. package/dist/cjs/ion-route_4.cjs.entry.js +4 -4
  159. package/dist/cjs/ion-searchbar.cjs.entry.js +31 -7
  160. package/dist/cjs/ion-segment_2.cjs.entry.js +7 -7
  161. package/dist/cjs/ion-select_3.cjs.entry.js +6 -6
  162. package/dist/cjs/ion-spinner.cjs.entry.js +3 -3
  163. package/dist/cjs/ion-split-pane.cjs.entry.js +4 -4
  164. package/dist/cjs/ion-tab-bar_2.cjs.entry.js +6 -6
  165. package/dist/cjs/ion-tab_2.cjs.entry.js +4 -4
  166. package/dist/cjs/ion-text.cjs.entry.js +4 -4
  167. package/dist/cjs/ion-textarea.cjs.entry.js +2 -2
  168. package/dist/cjs/ion-toast.cjs.entry.js +6 -6
  169. package/dist/cjs/ion-toggle.cjs.entry.js +2 -2
  170. package/dist/cjs/{ionic-global-59a10130.js → ionic-global-c5503e93.js} +1 -1
  171. package/dist/cjs/ionic.cjs.js +5 -5
  172. package/dist/cjs/{ios.transition-96679580.js → ios.transition-30830fc4.js} +2 -2
  173. package/dist/cjs/loader.cjs.js +4 -4
  174. package/dist/cjs/{md.transition-d6c98822.js → md.transition-7f581866.js} +2 -2
  175. package/dist/cjs/{overlays-db5d96f3.js → overlays-129dfc13.js} +62 -20
  176. package/dist/cjs/{status-tap-7ad5f0fb.js → status-tap-03d82840.js} +1 -1
  177. package/dist/collection/collection-manifest.json +2 -2
  178. package/dist/collection/components/action-sheet/action-sheet.js +3 -3
  179. package/dist/collection/components/alert/alert.js +2 -2
  180. package/dist/collection/components/alert/test/a11y/alert.e2e.js +4 -0
  181. package/dist/collection/components/app/app.js +4 -4
  182. package/dist/collection/components/avatar/avatar.js +1 -1
  183. package/dist/collection/components/back-button/back-button.js +2 -2
  184. package/dist/collection/components/backdrop/backdrop.js +1 -1
  185. package/dist/collection/components/badge/badge.js +2 -2
  186. package/dist/collection/components/breadcrumb/breadcrumb.js +4 -4
  187. package/dist/collection/components/breadcrumbs/breadcrumbs.js +2 -2
  188. package/dist/collection/components/button/button.ios.css +5 -5
  189. package/dist/collection/components/button/button.js +2 -2
  190. package/dist/collection/components/button/button.md.css +4 -5
  191. package/dist/collection/components/buttons/buttons.js +1 -1
  192. package/dist/collection/components/card/card.js +1 -1
  193. package/dist/collection/components/card-content/card-content.js +1 -1
  194. package/dist/collection/components/card-header/card-header.js +2 -2
  195. package/dist/collection/components/card-subtitle/card-subtitle.js +2 -2
  196. package/dist/collection/components/card-title/card-title.js +2 -2
  197. package/dist/collection/components/checkbox/checkbox.js +1 -1
  198. package/dist/collection/components/checkbox/test/checkbox.spec.js +12 -0
  199. package/dist/collection/components/chip/chip.js +2 -2
  200. package/dist/collection/components/col/col.js +2 -2
  201. package/dist/collection/components/content/content.js +3 -3
  202. package/dist/collection/components/datetime/datetime.js +56 -12
  203. package/dist/collection/components/datetime/test/basic/datetime.e2e.js +80 -1
  204. package/dist/collection/components/datetime/test/format.spec.js +65 -15
  205. package/dist/collection/components/datetime/utils/format.js +24 -37
  206. package/dist/collection/components/datetime/utils/validate.js +45 -0
  207. package/dist/collection/components/datetime-button/datetime-button.js +12 -11
  208. package/dist/collection/components/datetime-button/test/basic/datetime-button.e2e.js +65 -0
  209. package/dist/collection/components/fab/fab.js +2 -2
  210. package/dist/collection/components/fab-button/fab-button.js +2 -2
  211. package/dist/collection/components/fab-list/fab-list.js +2 -2
  212. package/dist/collection/components/footer/footer.js +2 -2
  213. package/dist/collection/components/grid/grid.js +2 -2
  214. package/dist/collection/components/header/header.ios.css +5 -2
  215. package/dist/collection/components/header/header.js +2 -2
  216. package/dist/collection/components/header/test/basic/header.e2e.js +77 -0
  217. package/dist/collection/components/img/img.js +1 -1
  218. package/dist/collection/components/infinite-scroll/infinite-scroll.js +1 -1
  219. package/dist/collection/components/infinite-scroll-content/infinite-scroll-content.js +2 -2
  220. package/dist/collection/components/input/input.js +8 -0
  221. package/dist/collection/components/item/item.js +1 -1
  222. package/dist/collection/components/item/test/buttons/item.e2e.js +20 -4
  223. package/dist/collection/components/item-divider/item-divider.js +2 -2
  224. package/dist/collection/components/item-group/item-group.js +1 -1
  225. package/dist/collection/components/item-option/item-option.js +2 -2
  226. package/dist/collection/components/item-options/item-options.js +1 -1
  227. package/dist/collection/components/item-sliding/item-sliding.js +1 -1
  228. package/dist/collection/components/label/label.js +1 -1
  229. package/dist/collection/components/list/list.js +1 -1
  230. package/dist/collection/components/list-header/list-header.js +2 -2
  231. package/dist/collection/components/loading/loading.js +2 -2
  232. package/dist/collection/components/menu/menu.js +3 -3
  233. package/dist/collection/components/menu-button/menu-button.js +2 -2
  234. package/dist/collection/components/menu-toggle/menu-toggle.js +2 -2
  235. package/dist/collection/components/modal/gestures/sheet.js +45 -20
  236. package/dist/collection/components/modal/modal.js +38 -6
  237. package/dist/collection/components/modal/test/modal-attributes.spec.js +32 -0
  238. package/dist/collection/components/nav/nav.js +1 -1
  239. package/dist/collection/components/nav-link/nav-link.js +1 -1
  240. package/dist/collection/components/note/note.js +2 -2
  241. package/dist/collection/components/picker/picker.js +2 -2
  242. package/dist/collection/components/picker-column/picker-column.js +2 -2
  243. package/dist/collection/components/picker-column-internal/picker-column-internal.js +8 -4
  244. package/dist/collection/components/picker-internal/picker-internal.js +2 -2
  245. package/dist/collection/components/popover/popover.ios.css +0 -1
  246. package/dist/collection/components/popover/popover.js +2 -2
  247. package/dist/collection/components/popover/popover.md.css +0 -1
  248. package/dist/collection/components/popover/test/basic/popover.e2e.js +76 -0
  249. package/dist/collection/components/progress-bar/progress-bar.js +1 -1
  250. package/dist/collection/components/radio-group/radio-group.js +1 -1
  251. package/dist/collection/components/range/range.js +126 -21
  252. package/dist/collection/components/range/test/range-events.e2e.js +27 -0
  253. package/dist/collection/components/refresher/refresher.js +1 -1
  254. package/dist/collection/components/refresher-content/refresher-content.js +1 -1
  255. package/dist/collection/components/reorder/reorder.js +1 -1
  256. package/dist/collection/components/reorder-group/reorder-group.js +1 -1
  257. package/dist/collection/components/ripple-effect/ripple-effect.js +1 -1
  258. package/dist/collection/components/router-link/router-link.js +2 -2
  259. package/dist/collection/components/router-outlet/router-outlet.js +1 -1
  260. package/dist/collection/components/row/row.js +1 -1
  261. package/dist/collection/components/searchbar/searchbar.js +86 -6
  262. package/dist/collection/components/searchbar/test/searchbar.spec.js +20 -2
  263. package/dist/collection/components/segment/segment.js +2 -2
  264. package/dist/collection/components/segment-button/segment-button.js +3 -3
  265. package/dist/collection/components/select-option/select-option.js +1 -1
  266. package/dist/collection/components/select-popover/select-popover.js +1 -1
  267. package/dist/collection/components/skeleton-text/skeleton-text.js +2 -2
  268. package/dist/collection/components/spinner/spinner.js +1 -1
  269. package/dist/collection/components/split-pane/split-pane.js +2 -2
  270. package/dist/collection/components/tab/tab.js +2 -2
  271. package/dist/collection/components/tab-bar/tab-bar.js +2 -2
  272. package/dist/collection/components/tab-button/tab-button.js +2 -2
  273. package/dist/collection/components/tabs/tabs.js +1 -1
  274. package/dist/collection/components/text/text.js +2 -2
  275. package/dist/collection/components/thumbnail/thumbnail.js +1 -1
  276. package/dist/collection/components/title/title.js +2 -2
  277. package/dist/collection/components/toast/toast.js +2 -2
  278. package/dist/collection/components/toggle/toggle.js +1 -1
  279. package/dist/collection/components/toolbar/test/basic/toolbar.e2e.js +133 -5
  280. package/dist/collection/components/toolbar/toolbar.js +2 -2
  281. package/dist/collection/utils/hardware-back-button.js +2 -2
  282. package/dist/collection/utils/input-shims/hacks/scroll-assist.js +5 -5
  283. package/dist/collection/utils/overlays.js +61 -19
  284. package/dist/collection/utils/test/overlays/overlays.spec.js +53 -0
  285. package/dist/docs.json +117 -4
  286. package/dist/esm/{app-globals-5cf6195b.js → app-globals-318eef52.js} +1 -1
  287. package/dist/esm/{button-active-47ac8092.js → button-active-414be235.js} +1 -1
  288. package/dist/esm/{data-0f3ab200.js → data-bb424ba8.js} +23 -38
  289. package/dist/esm/{hardware-back-button-b410a047.js → hardware-back-button-6107a37c.js} +5 -5
  290. package/dist/esm/{index-e1b622e3.js → index-6e05b96e.js} +2 -2
  291. package/dist/esm/{index-4c30cddd.js → index-a1a47f01.js} +51 -7
  292. package/dist/esm/{index-348ed70a.js → index-fae1515c.js} +3 -3
  293. package/dist/esm/index.js +8 -8
  294. package/dist/esm/{input-shims-5329bbe8.js → input-shims-a52daa3a.js} +5 -5
  295. package/dist/esm/ion-accordion_2.entry.js +2 -2
  296. package/dist/esm/ion-action-sheet.entry.js +8 -8
  297. package/dist/esm/ion-alert.entry.js +7 -7
  298. package/dist/esm/ion-app_8.entry.js +24 -24
  299. package/dist/esm/ion-avatar_3.entry.js +6 -6
  300. package/dist/esm/ion-back-button.entry.js +4 -4
  301. package/dist/esm/ion-backdrop.entry.js +3 -3
  302. package/dist/esm/ion-breadcrumb_2.entry.js +8 -8
  303. package/dist/esm/ion-button_2.entry.js +6 -6
  304. package/dist/esm/ion-card_5.entry.js +10 -10
  305. package/dist/esm/ion-checkbox.entry.js +3 -3
  306. package/dist/esm/ion-chip.entry.js +4 -4
  307. package/dist/esm/ion-col_3.entry.js +7 -7
  308. package/dist/esm/ion-datetime-button.entry.js +14 -13
  309. package/dist/esm/ion-datetime_3.entry.js +80 -20
  310. package/dist/esm/ion-fab_3.entry.js +8 -8
  311. package/dist/esm/ion-img.entry.js +3 -3
  312. package/dist/esm/ion-infinite-scroll_2.entry.js +5 -5
  313. package/dist/esm/ion-input.entry.js +10 -2
  314. package/dist/esm/ion-item-option_3.entry.js +6 -6
  315. package/dist/esm/ion-item_8.entry.js +14 -14
  316. package/dist/esm/ion-loading.entry.js +6 -6
  317. package/dist/esm/ion-menu_3.entry.js +11 -11
  318. package/dist/esm/ion-modal.entry.js +86 -30
  319. package/dist/esm/ion-nav_2.entry.js +5 -5
  320. package/dist/esm/ion-picker-column-internal.entry.js +10 -6
  321. package/dist/esm/ion-picker-internal.entry.js +3 -3
  322. package/dist/esm/ion-popover.entry.js +9 -9
  323. package/dist/esm/ion-progress-bar.entry.js +3 -3
  324. package/dist/esm/ion-radio_2.entry.js +3 -3
  325. package/dist/esm/ion-range.entry.js +128 -23
  326. package/dist/esm/ion-refresher_2.entry.js +4 -4
  327. package/dist/esm/ion-reorder_2.entry.js +4 -4
  328. package/dist/esm/ion-ripple-effect.entry.js +3 -3
  329. package/dist/esm/ion-route_4.entry.js +4 -4
  330. package/dist/esm/ion-searchbar.entry.js +32 -8
  331. package/dist/esm/ion-segment_2.entry.js +7 -7
  332. package/dist/esm/ion-select_3.entry.js +6 -6
  333. package/dist/esm/ion-spinner.entry.js +3 -3
  334. package/dist/esm/ion-split-pane.entry.js +4 -4
  335. package/dist/esm/ion-tab-bar_2.entry.js +6 -6
  336. package/dist/esm/ion-tab_2.entry.js +4 -4
  337. package/dist/esm/ion-text.entry.js +4 -4
  338. package/dist/esm/ion-textarea.entry.js +2 -2
  339. package/dist/esm/ion-toast.entry.js +6 -6
  340. package/dist/esm/ion-toggle.entry.js +2 -2
  341. package/dist/esm/{ionic-global-ad9a1810.js → ionic-global-94f25d1b.js} +1 -1
  342. package/dist/esm/ionic.js +6 -6
  343. package/dist/esm/{ios.transition-7459f819.js → ios.transition-a50a9a55.js} +2 -2
  344. package/dist/esm/loader.js +5 -5
  345. package/dist/esm/{md.transition-b8224313.js → md.transition-0da92976.js} +2 -2
  346. package/dist/esm/{overlays-19b26885.js → overlays-b874c3c3.js} +62 -20
  347. package/dist/esm/{status-tap-b41ece3c.js → status-tap-dfea3607.js} +1 -1
  348. package/dist/esm-es5/app-globals-318eef52.js +4 -0
  349. package/dist/esm-es5/{button-active-47ac8092.js → button-active-414be235.js} +1 -1
  350. package/dist/esm-es5/data-bb424ba8.js +4 -0
  351. package/dist/esm-es5/framework-delegate-ed4ba327.js +2 -2
  352. package/dist/esm-es5/hardware-back-button-6107a37c.js +4 -0
  353. package/dist/esm-es5/index-6e05b96e.js +4 -0
  354. package/dist/esm-es5/index-a1a47f01.js +5 -0
  355. package/dist/esm-es5/{index-348ed70a.js → index-fae1515c.js} +1 -1
  356. package/dist/esm-es5/index.js +1 -1
  357. package/dist/esm-es5/input-shims-a52daa3a.js +4 -0
  358. package/dist/esm-es5/ion-accordion_2.entry.js +1 -1
  359. package/dist/esm-es5/ion-action-sheet.entry.js +1 -1
  360. package/dist/esm-es5/ion-alert.entry.js +1 -1
  361. package/dist/esm-es5/ion-app_8.entry.js +1 -1
  362. package/dist/esm-es5/ion-avatar_3.entry.js +1 -1
  363. package/dist/esm-es5/ion-back-button.entry.js +1 -1
  364. package/dist/esm-es5/ion-backdrop.entry.js +1 -1
  365. package/dist/esm-es5/ion-breadcrumb_2.entry.js +1 -1
  366. package/dist/esm-es5/ion-button_2.entry.js +1 -1
  367. package/dist/esm-es5/ion-card_5.entry.js +1 -1
  368. package/dist/esm-es5/ion-checkbox.entry.js +1 -1
  369. package/dist/esm-es5/ion-chip.entry.js +1 -1
  370. package/dist/esm-es5/ion-col_3.entry.js +1 -1
  371. package/dist/esm-es5/ion-datetime-button.entry.js +1 -1
  372. package/dist/esm-es5/ion-datetime_3.entry.js +1 -1
  373. package/dist/esm-es5/ion-fab_3.entry.js +1 -1
  374. package/dist/esm-es5/ion-img.entry.js +1 -1
  375. package/dist/esm-es5/ion-infinite-scroll_2.entry.js +1 -1
  376. package/dist/esm-es5/ion-input.entry.js +1 -1
  377. package/dist/esm-es5/ion-item-option_3.entry.js +1 -1
  378. package/dist/esm-es5/ion-item_8.entry.js +1 -1
  379. package/dist/esm-es5/ion-loading.entry.js +1 -1
  380. package/dist/esm-es5/ion-menu_3.entry.js +1 -1
  381. package/dist/esm-es5/ion-modal.entry.js +1 -1
  382. package/dist/esm-es5/ion-nav_2.entry.js +1 -1
  383. package/dist/esm-es5/ion-picker-column-internal.entry.js +1 -1
  384. package/dist/esm-es5/ion-picker-internal.entry.js +1 -1
  385. package/dist/esm-es5/ion-popover.entry.js +1 -1
  386. package/dist/esm-es5/ion-progress-bar.entry.js +1 -1
  387. package/dist/esm-es5/ion-radio_2.entry.js +1 -1
  388. package/dist/esm-es5/ion-range.entry.js +1 -1
  389. package/dist/esm-es5/ion-refresher_2.entry.js +1 -1
  390. package/dist/esm-es5/ion-reorder_2.entry.js +1 -1
  391. package/dist/esm-es5/ion-ripple-effect.entry.js +1 -1
  392. package/dist/esm-es5/ion-route_4.entry.js +1 -1
  393. package/dist/esm-es5/ion-searchbar.entry.js +1 -1
  394. package/dist/esm-es5/ion-segment_2.entry.js +1 -1
  395. package/dist/esm-es5/ion-select_3.entry.js +1 -1
  396. package/dist/esm-es5/ion-spinner.entry.js +1 -1
  397. package/dist/esm-es5/ion-split-pane.entry.js +1 -1
  398. package/dist/esm-es5/ion-tab-bar_2.entry.js +1 -1
  399. package/dist/esm-es5/ion-tab_2.entry.js +1 -1
  400. package/dist/esm-es5/ion-text.entry.js +1 -1
  401. package/dist/esm-es5/ion-textarea.entry.js +1 -1
  402. package/dist/esm-es5/ion-toast.entry.js +1 -1
  403. package/dist/esm-es5/ion-toggle.entry.js +1 -1
  404. package/dist/esm-es5/{ionic-global-ad9a1810.js → ionic-global-94f25d1b.js} +1 -1
  405. package/dist/esm-es5/ionic.js +1 -1
  406. package/dist/esm-es5/{ios.transition-7459f819.js → ios.transition-a50a9a55.js} +1 -1
  407. package/dist/esm-es5/loader.js +1 -1
  408. package/dist/esm-es5/md.transition-0da92976.js +4 -0
  409. package/dist/esm-es5/overlays-b874c3c3.js +4 -0
  410. package/dist/esm-es5/{status-tap-b41ece3c.js → status-tap-dfea3607.js} +1 -1
  411. package/dist/html.html-data.json +13 -1
  412. package/dist/ionic/index.esm.js +1 -1
  413. package/dist/ionic/ionic.esm.js +1 -1
  414. package/dist/ionic/ionic.js +1 -1
  415. package/dist/ionic/{p-05253db9.js → p-0047bd0e.js} +1 -1
  416. package/dist/ionic/{p-ebc86ce9.system.entry.js → p-01a1ff55.system.entry.js} +1 -1
  417. package/dist/ionic/{p-2178329b.entry.js → p-01de45e4.entry.js} +1 -1
  418. package/dist/ionic/{p-125f8cdd.system.js → p-0609a7d8.system.js} +1 -1
  419. package/dist/ionic/{p-cfb4d7e0.js → p-08ab4c96.js} +1 -1
  420. package/dist/ionic/{p-76b8bcb8.system.entry.js → p-094cb5ba.system.entry.js} +1 -1
  421. package/dist/ionic/{p-6812d37d.js → p-0aac3a1c.js} +1 -1
  422. package/dist/ionic/{p-de55ec45.js → p-0b743628.js} +1 -1
  423. package/dist/ionic/p-185d82fc.entry.js +4 -0
  424. package/dist/ionic/p-193921ce.entry.js +4 -0
  425. package/dist/ionic/p-1cd372ed.js +4 -0
  426. package/dist/ionic/{p-a6c0a380.js → p-1e151efb.js} +1 -1
  427. package/dist/ionic/{p-7f30ad48.entry.js → p-211d8901.entry.js} +1 -1
  428. package/dist/ionic/p-212f2c37.entry.js +4 -0
  429. package/dist/ionic/p-2433bf5e.system.js +4 -0
  430. package/dist/ionic/p-2732a6ce.entry.js +4 -0
  431. package/dist/ionic/{p-89ca4c4b.system.js → p-280f1fe7.system.js} +1 -1
  432. package/dist/ionic/p-2c1408df.system.js +5 -0
  433. package/dist/ionic/p-2e2808f3.entry.js +4 -0
  434. package/dist/ionic/{p-70fbf4e2.entry.js → p-32086ea4.entry.js} +1 -1
  435. package/dist/ionic/{p-16a61810.entry.js → p-339dee28.entry.js} +1 -1
  436. package/dist/ionic/{p-88e9052d.entry.js → p-34e2b446.entry.js} +1 -1
  437. package/dist/ionic/{p-6e23d039.entry.js → p-374838e4.entry.js} +1 -1
  438. package/dist/ionic/p-3789920e.js +4 -0
  439. package/dist/ionic/{p-bdca4784.js → p-37aab7f7.js} +1 -1
  440. package/dist/ionic/p-3b7d328b.system.entry.js +4 -0
  441. package/dist/ionic/{p-02542247.system.entry.js → p-3b9edd02.system.entry.js} +1 -1
  442. package/dist/ionic/{p-d143fefa.system.entry.js → p-3d23a234.system.entry.js} +1 -1
  443. package/dist/ionic/{p-717e2526.system.entry.js → p-3f75319a.system.entry.js} +2 -2
  444. package/dist/ionic/p-47686f0a.system.entry.js +4 -0
  445. package/dist/ionic/{p-18918a24.system.entry.js → p-47d7ffb4.system.entry.js} +1 -1
  446. package/dist/ionic/{p-7e838f43.system.entry.js → p-48331301.system.entry.js} +1 -1
  447. package/dist/ionic/{p-a3df16b9.system.entry.js → p-491ec3d6.system.entry.js} +1 -1
  448. package/dist/ionic/p-495aabd4.system.entry.js +4 -0
  449. package/dist/ionic/{p-b0aa3806.system.entry.js → p-49616da4.system.entry.js} +1 -1
  450. package/dist/ionic/p-4c68b459.system.entry.js +4 -0
  451. package/dist/ionic/{p-5cb5f63d.system.entry.js → p-4cc54847.system.entry.js} +1 -1
  452. package/dist/ionic/p-4da978ac.entry.js +4 -0
  453. package/dist/ionic/{p-5de920f4.system.entry.js → p-4f9018d4.system.entry.js} +1 -1
  454. package/dist/ionic/{p-baf8eeac.system.entry.js → p-55ae3e14.system.entry.js} +1 -1
  455. package/dist/ionic/{p-9de75bac.system.entry.js → p-56271222.system.entry.js} +1 -1
  456. package/dist/ionic/{p-80aed9fb.system.entry.js → p-565a12d7.system.entry.js} +1 -1
  457. package/dist/ionic/{p-7e16220b.entry.js → p-56b810d5.entry.js} +1 -1
  458. package/dist/ionic/{p-a85d9047.system.entry.js → p-5a0345f7.system.entry.js} +1 -1
  459. package/dist/ionic/{p-f0e54781.system.entry.js → p-5b8d7cdb.system.entry.js} +1 -1
  460. package/dist/ionic/p-5d2011e1.entry.js +4 -0
  461. package/dist/ionic/p-5f3d659f.entry.js +4 -0
  462. package/dist/ionic/p-6236eae6.entry.js +4 -0
  463. package/dist/ionic/{p-4b8a620f.system.entry.js → p-625ef2fb.system.entry.js} +1 -1
  464. package/dist/ionic/{p-6525a8cd.system.js → p-638865d1.system.js} +1 -1
  465. package/dist/ionic/p-662cccde.entry.js +4 -0
  466. package/dist/ionic/p-68416ff0.entry.js +4 -0
  467. package/dist/ionic/{p-91f4e611.system.entry.js → p-686ddecb.system.entry.js} +2 -2
  468. package/dist/ionic/p-6a6550fa.js +4 -0
  469. package/dist/ionic/p-6a6c61b1.system.entry.js +4 -0
  470. package/dist/ionic/p-6afef6c1.system.js +2 -2
  471. package/dist/ionic/{p-abcedc15.system.entry.js → p-6b178502.system.entry.js} +1 -1
  472. package/dist/ionic/{p-2c86025e.system.js → p-6ecddf53.system.js} +1 -1
  473. package/dist/ionic/{p-822730c4.entry.js → p-70929384.entry.js} +1 -1
  474. package/dist/ionic/p-73d70509.system.js +4 -0
  475. package/dist/ionic/{p-c1a871ff.system.entry.js → p-776f7b9e.system.entry.js} +1 -1
  476. package/dist/ionic/p-7872e970.system.entry.js +4 -0
  477. package/dist/ionic/{p-657ccdd6.entry.js → p-804ffec9.entry.js} +1 -1
  478. package/dist/ionic/{p-b27bba38.system.entry.js → p-81c8fa81.system.entry.js} +1 -1
  479. package/dist/ionic/{p-8e651c29.entry.js → p-8294b727.entry.js} +1 -1
  480. package/dist/ionic/p-8528c070.entry.js +4 -0
  481. package/dist/ionic/p-87e81684.system.entry.js +4 -0
  482. package/dist/ionic/p-8954015c.entry.js +4 -0
  483. package/dist/ionic/p-8a1b0abb.system.js +4 -0
  484. package/dist/ionic/{p-2765a571.system.entry.js → p-8a335b91.system.entry.js} +1 -1
  485. package/dist/ionic/{p-479f5926.system.entry.js → p-8eba832c.system.entry.js} +1 -1
  486. package/dist/ionic/{p-b58686e0.entry.js → p-8ed4de58.entry.js} +1 -1
  487. package/dist/ionic/{p-a02ea777.entry.js → p-917bb906.entry.js} +1 -1
  488. package/dist/ionic/{p-ae2b3a7a.system.entry.js → p-93f86b06.system.entry.js} +1 -1
  489. package/dist/ionic/p-9625a2e6.entry.js +4 -0
  490. package/dist/ionic/{p-288649db.system.entry.js → p-9bc8bd0c.system.entry.js} +1 -1
  491. package/dist/ionic/{p-6f59cdbc.system.entry.js → p-9d53b773.system.entry.js} +2 -2
  492. package/dist/ionic/{p-dff97cfa.entry.js → p-9fbfbaef.entry.js} +1 -1
  493. package/dist/ionic/p-a04ecf1a.system.js +4 -0
  494. package/dist/ionic/{p-9998cb62.system.entry.js → p-a3b2d4a7.system.entry.js} +2 -2
  495. package/dist/ionic/{p-973b4db3.entry.js → p-a5cd2e1f.entry.js} +1 -1
  496. package/dist/ionic/p-a5d9fafe.entry.js +4 -0
  497. package/dist/ionic/{p-df504a37.system.js → p-a875459d.system.js} +1 -1
  498. package/dist/ionic/p-ad60590b.entry.js +4 -0
  499. package/dist/ionic/{p-c7288e78.system.entry.js → p-b1bebf4a.system.entry.js} +1 -1
  500. package/dist/ionic/p-b535c93a.entry.js +4 -0
  501. package/dist/ionic/p-b8735394.entry.js +4 -0
  502. package/dist/ionic/p-bb5bbcdf.js +4 -0
  503. package/dist/ionic/p-c379d010.system.entry.js +4 -0
  504. package/dist/ionic/{p-ce1c0a0e.system.entry.js → p-c5ce0862.system.entry.js} +2 -2
  505. package/dist/ionic/p-c76ef1ea.entry.js +4 -0
  506. package/dist/ionic/p-c8580577.system.js +4 -0
  507. package/dist/ionic/{p-2c4bfe1c.entry.js → p-cc0cf2d1.entry.js} +1 -1
  508. package/dist/ionic/{p-15a40a0b.system.entry.js → p-d3a95477.system.entry.js} +1 -1
  509. package/dist/ionic/{p-ceceac26.js → p-d68ecea4.js} +1 -1
  510. package/dist/ionic/p-d873a8c2.system.entry.js +4 -0
  511. package/dist/ionic/{p-079da3df.entry.js → p-dbd77435.entry.js} +1 -1
  512. package/dist/ionic/p-dc2d302c.entry.js +4 -0
  513. package/dist/ionic/{p-7670acd8.entry.js → p-dd2996cf.entry.js} +1 -1
  514. package/dist/ionic/{p-4788693d.entry.js → p-dec423a3.entry.js} +1 -1
  515. package/dist/ionic/{p-2ea71956.system.entry.js → p-deeae694.system.entry.js} +1 -1
  516. package/dist/ionic/p-e06d65b3.system.entry.js +4 -0
  517. package/dist/ionic/{p-cbcffe6e.system.js → p-e0948431.system.js} +1 -1
  518. package/dist/ionic/{p-86813176.system.entry.js → p-e15cfec4.system.entry.js} +1 -1
  519. package/dist/ionic/p-e1bd8d9c.system.entry.js +4 -0
  520. package/dist/ionic/{p-1636923f.system.js → p-e34eefb5.system.js} +1 -1
  521. package/dist/ionic/{p-b6279412.entry.js → p-e57a212a.entry.js} +1 -1
  522. package/dist/ionic/{p-437f4d02.system.entry.js → p-e6ee6ead.system.entry.js} +1 -1
  523. package/dist/ionic/p-e7055fb8.entry.js +4 -0
  524. package/dist/ionic/p-ea723fc4.entry.js +4 -0
  525. package/dist/ionic/p-ead0d463.js +5 -0
  526. package/dist/ionic/p-ed3ad350.entry.js +4 -0
  527. package/dist/ionic/{p-5d7e32ce.js → p-efef9f3a.js} +1 -1
  528. package/dist/ionic/p-f4ccaa64.entry.js +4 -0
  529. package/dist/ionic/{p-bcd9cad8.system.js → p-f4fb429a.system.js} +1 -1
  530. package/dist/ionic/p-f549716b.system.js +4 -0
  531. package/dist/ionic/p-f6a50d5c.entry.js +4 -0
  532. package/dist/ionic/p-fc053a55.entry.js +4 -0
  533. package/dist/ionic/{p-1f19958f.system.entry.js → p-fd059a23.system.entry.js} +1 -1
  534. package/dist/ionic/{p-e4e74b5f.system.entry.js → p-fdcf1482.system.entry.js} +1 -1
  535. package/dist/ionic/{p-3079950e.entry.js → p-fe3ae39d.entry.js} +1 -1
  536. package/dist/types/components/datetime/datetime-interface.d.ts +10 -0
  537. package/dist/types/components/datetime/datetime.d.ts +10 -1
  538. package/dist/types/components/datetime/utils/format.d.ts +7 -13
  539. package/dist/types/components/datetime/utils/manipulation.d.ts +7 -7
  540. package/dist/types/components/datetime/utils/state.d.ts +2 -2
  541. package/dist/types/components/datetime/utils/validate.d.ts +8 -0
  542. package/dist/types/components/input/input.utils.d.ts +1 -1
  543. package/dist/types/components/range/range.d.ts +29 -0
  544. package/dist/types/components/searchbar/searchbar.d.ts +37 -0
  545. package/dist/types/components/toggle/toggle.d.ts +1 -1
  546. package/dist/types/components.d.ts +36 -4
  547. package/dist/types/utils/framework-delegate.d.ts +1 -1
  548. package/dist/types/utils/hardware-back-button.d.ts +1 -1
  549. package/dist/types/utils/keyboard/keyboard-controller.d.ts +1 -1
  550. package/dist/types/utils/overlays.d.ts +2 -2
  551. package/hydrate/index.js +667 -316
  552. package/package.json +9 -5
  553. package/dist/collection/components/modal/test/a11y/modal.spec.js +0 -22
  554. package/dist/esm-es5/app-globals-5cf6195b.js +0 -4
  555. package/dist/esm-es5/data-0f3ab200.js +0 -4
  556. package/dist/esm-es5/hardware-back-button-b410a047.js +0 -4
  557. package/dist/esm-es5/index-4c30cddd.js +0 -5
  558. package/dist/esm-es5/index-e1b622e3.js +0 -4
  559. package/dist/esm-es5/input-shims-5329bbe8.js +0 -4
  560. package/dist/esm-es5/md.transition-b8224313.js +0 -4
  561. package/dist/esm-es5/overlays-19b26885.js +0 -4
  562. package/dist/ionic/p-021f9d72.entry.js +0 -4
  563. package/dist/ionic/p-02ad4bbe.js +0 -4
  564. package/dist/ionic/p-0b34d3a7.system.js +0 -4
  565. package/dist/ionic/p-12527c4b.entry.js +0 -4
  566. package/dist/ionic/p-1846513c.js +0 -4
  567. package/dist/ionic/p-1a680496.entry.js +0 -4
  568. package/dist/ionic/p-1f16d040.entry.js +0 -4
  569. package/dist/ionic/p-257046d2.system.js +0 -4
  570. package/dist/ionic/p-262024fd.entry.js +0 -4
  571. package/dist/ionic/p-2fd3c3dd.entry.js +0 -4
  572. package/dist/ionic/p-337ac0f5.entry.js +0 -4
  573. package/dist/ionic/p-36be3332.js +0 -4
  574. package/dist/ionic/p-482ea916.system.entry.js +0 -4
  575. package/dist/ionic/p-49f481cc.system.entry.js +0 -4
  576. package/dist/ionic/p-521b3971.entry.js +0 -4
  577. package/dist/ionic/p-644d03d7.system.entry.js +0 -4
  578. package/dist/ionic/p-6b6ca3f5.system.entry.js +0 -4
  579. package/dist/ionic/p-72fa96bf.system.js +0 -5
  580. package/dist/ionic/p-7330c044.system.js +0 -4
  581. package/dist/ionic/p-741a0f0d.system.entry.js +0 -4
  582. package/dist/ionic/p-7a615a5a.entry.js +0 -4
  583. package/dist/ionic/p-84b85535.entry.js +0 -4
  584. package/dist/ionic/p-85f66c3c.entry.js +0 -4
  585. package/dist/ionic/p-860e2539.system.entry.js +0 -4
  586. package/dist/ionic/p-8cc34120.entry.js +0 -4
  587. package/dist/ionic/p-9056778e.system.entry.js +0 -4
  588. package/dist/ionic/p-96084f36.entry.js +0 -4
  589. package/dist/ionic/p-97ca0cb9.system.js +0 -4
  590. package/dist/ionic/p-98aa0553.entry.js +0 -4
  591. package/dist/ionic/p-a1222c24.entry.js +0 -4
  592. package/dist/ionic/p-a4aa6dd2.system.entry.js +0 -4
  593. package/dist/ionic/p-a8459bfb.entry.js +0 -4
  594. package/dist/ionic/p-ae828bd9.system.entry.js +0 -4
  595. package/dist/ionic/p-b4d2f43c.system.js +0 -4
  596. package/dist/ionic/p-b727af6a.entry.js +0 -4
  597. package/dist/ionic/p-ba0fbecc.entry.js +0 -4
  598. package/dist/ionic/p-c1c7309e.entry.js +0 -4
  599. package/dist/ionic/p-cb3065b8.entry.js +0 -4
  600. package/dist/ionic/p-cb9812f7.entry.js +0 -4
  601. package/dist/ionic/p-d425b1de.entry.js +0 -4
  602. package/dist/ionic/p-d6c6541b.system.entry.js +0 -4
  603. package/dist/ionic/p-e1c52dc6.entry.js +0 -4
  604. package/dist/ionic/p-e626800f.system.entry.js +0 -4
  605. package/dist/ionic/p-e94c1402.entry.js +0 -4
  606. package/dist/ionic/p-ed4760ef.entry.js +0 -4
  607. package/dist/ionic/p-ed7a529f.js +0 -5
  608. package/dist/ionic/p-f02c41af.system.js +0 -4
  609. package/dist/ionic/p-f7dce541.js +0 -4
  610. package/dist/ionic/p-fa8d3b01.entry.js +0 -4
@@ -184,11 +184,11 @@ export class Picker {
184
184
  render() {
185
185
  const { htmlAttributes } = this;
186
186
  const mode = getIonMode(this);
187
- return (h(Host, Object.assign({ key: 'c266cc072afaba2da22f70d8b62dc4bc6756d188', "aria-modal": "true", tabindex: "-1" }, htmlAttributes, { style: {
187
+ return (h(Host, Object.assign({ key: 'eb5f91ea74fb11daa6942f779ef461742cad9ecb', "aria-modal": "true", tabindex: "-1" }, htmlAttributes, { style: {
188
188
  zIndex: `${20000 + this.overlayIndex}`,
189
189
  }, class: Object.assign({ [mode]: true,
190
190
  // Used internally for styling
191
- [`picker-${mode}`]: true, 'overlay-hidden': true }, getClassMap(this.cssClass)), onIonBackdropTap: this.onBackdropTap, onIonPickerWillDismiss: this.dispatchCancelHandler }), h("ion-backdrop", { key: '35ee3e5028028835580e28ac2c8db65a924d5d6a', visible: this.showBackdrop, tappable: this.backdropDismiss }), h("div", { key: '8b454e6edbcfc45c57d3d8baf7c14b7905921a6e', tabindex: "0" }), h("div", { key: 'e0fee78ec6d097bf0963190f748e5daad602e0f7', class: "picker-wrapper ion-overlay-wrapper", role: "dialog" }, h("div", { key: 'ce66bca18fc3e982ad7d6660f27cb1a03fb8247b', class: "picker-toolbar" }, this.buttons.map((b) => (h("div", { class: buttonWrapperClass(b) }, h("button", { type: "button", onClick: () => this.buttonClick(b), class: buttonClass(b) }, b.text))))), h("div", { key: 'a58b9523fe16f109dd6de0610717c5077fed964b', class: "picker-columns" }, h("div", { key: 'acd54c0314cff51e8513a08dd9755c4b847c0617', class: "picker-above-highlight" }), this.presented && this.columns.map((c) => h("ion-picker-column", { col: c })), h("div", { key: '604730bd87582d048d850c6e0a0f29ba33258918', class: "picker-below-highlight" }))), h("div", { key: '93baf5e6e57aec5f084d7d5b24af14e7d8126b5a', tabindex: "0" })));
191
+ [`picker-${mode}`]: true, 'overlay-hidden': true }, getClassMap(this.cssClass)), onIonBackdropTap: this.onBackdropTap, onIonPickerWillDismiss: this.dispatchCancelHandler }), h("ion-backdrop", { key: '7ea872d939e62f14129fff15334b2822ad2360c9', visible: this.showBackdrop, tappable: this.backdropDismiss }), h("div", { key: '2d77c225091eacab0207e28c96b966122afafef0', tabindex: "0" }), h("div", { key: '630d21e0c60ad97b71462cdc540858bb6ced0b8f', class: "picker-wrapper ion-overlay-wrapper", role: "dialog" }, h("div", { key: 'fa8553ec8d2ce8bf93e16e02334b6475cb51b5d4', class: "picker-toolbar" }, this.buttons.map((b) => (h("div", { class: buttonWrapperClass(b) }, h("button", { type: "button", onClick: () => this.buttonClick(b), class: buttonClass(b) }, b.text))))), h("div", { key: '177d1bcbd0ce38f16d9c936295a917fb981d02d7', class: "picker-columns" }, h("div", { key: 'be99b6e0279c210ef91a88ccc81acc7d37917a53', class: "picker-above-highlight" }), this.presented && this.columns.map((c) => h("ion-picker-column", { col: c })), h("div", { key: 'b36b21e8133b59e873e1d3447a1279f1b971c854', class: "picker-below-highlight" }))), h("div", { key: '17cea6dd24dbb0a08073ca4a84bfe027eb24833d', tabindex: "0" })));
192
192
  }
193
193
  static get is() { return "ion-picker"; }
194
194
  static get encapsulation() { return "scoped"; }
@@ -336,9 +336,9 @@ export class PickerColumnCmp {
336
336
  render() {
337
337
  const col = this.col;
338
338
  const mode = getIonMode(this);
339
- return (h(Host, { key: '06e2ae483a3bcf4fe721ad0c48cded6a1efdc6c0', 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: {
339
+ return (h(Host, { key: '49bb4c67a67c7318d4c305df78ceabae36355112', 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
340
  'max-width': this.col.columnWidth,
341
- } }, col.prefix && (h("div", { class: "picker-prefix", style: { width: col.prefixWidth } }, col.prefix)), h("div", { key: '14bea013788d899edf7155eb3cc10f79fe8e4690', 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))));
341
+ } }, col.prefix && (h("div", { key: '7e65761d24473e4ba0ce2d4fc707a5c5e8127903', class: "picker-prefix", style: { width: col.prefixWidth } }, col.prefix)), h("div", { key: '65c3aea609401e8ae4ea6d363a1b9436796c0a86', 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", { key: 'c2e5a324ba95dd8832d3eb81b139e1f674d74a35', class: "picker-suffix", style: { width: col.suffixWidth } }, col.suffix))));
342
342
  }
343
343
  static get is() { return "ion-picker-column"; }
344
344
  static get originalStyleUrls() {
@@ -244,7 +244,11 @@ export class PickerColumnInternal {
244
244
  */
245
245
  componentWillLoad() {
246
246
  const visibleCallback = (entries) => {
247
- const ev = entries[0];
247
+ /**
248
+ * Browsers will sometimes group multiple IO events into a single callback.
249
+ * As a result, we want to grab the last/most recent event in case there are multiple events.
250
+ */
251
+ const ev = entries[entries.length - 1];
248
252
  if (ev.isIntersecting) {
249
253
  const { activeItem, el } = this;
250
254
  this.isColumnVisible = true;
@@ -333,11 +337,11 @@ export class PickerColumnInternal {
333
337
  * the attribute can be moved to datetime.tsx and set on every
334
338
  * instance of ion-picker-column-internal there instead.
335
339
  */
336
- return (h(Host, { key: 'd0e3818aa4ab06aefd988d1b42ae754244727b8f', exportparts: `${PICKER_ITEM_PART}, ${PICKER_ITEM_ACTIVE_PART}`, disabled: pickerDisabled, tabindex: pickerDisabled ? null : 0, class: createColorClasses(color, {
340
+ return (h(Host, { key: '42a034f2533d30d19f96a121eb74d5f757e1c684', exportparts: `${PICKER_ITEM_PART}, ${PICKER_ITEM_ACTIVE_PART}`, disabled: pickerDisabled, tabindex: pickerDisabled ? null : 0, class: createColorClasses(color, {
337
341
  [mode]: true,
338
342
  ['picker-column-active']: isActive,
339
343
  ['picker-column-numeric-input']: numericInput,
340
- }) }, h("div", { key: 'ec3b16415db5f64e3fab37fda023560ebcdc9423', class: "picker-item picker-item-empty", "aria-hidden": "true" }, "\u00A0"), h("div", { key: '40c78c9a1277807572d73e23048c2730cab88f5a', class: "picker-item picker-item-empty", "aria-hidden": "true" }, "\u00A0"), h("div", { key: 'c51fa817f6999356cf3568a46098e954936b45d5', class: "picker-item picker-item-empty", "aria-hidden": "true" }, "\u00A0"), items.map((item, index) => {
344
+ }) }, h("div", { key: '85efccb40c87d473c06026b8041d57b40d2369c3', class: "picker-item picker-item-empty", "aria-hidden": "true" }, "\u00A0"), h("div", { key: '9fae4dd6697f23acba18c218ba250ea77954b18d', class: "picker-item picker-item-empty", "aria-hidden": "true" }, "\u00A0"), h("div", { key: 'f117afeb204a4f6bb34a1cd0e1b786fa479d8b32', class: "picker-item picker-item-empty", "aria-hidden": "true" }, "\u00A0"), items.map((item, index) => {
341
345
  const isItemDisabled = pickerDisabled || item.disabled || false;
342
346
  {
343
347
  /*
@@ -354,7 +358,7 @@ export class PickerColumnInternal {
354
358
  }, "data-value": item.value, "data-index": index, onClick: (ev) => {
355
359
  this.centerPickerItemInView(ev.target, true);
356
360
  }, disabled: isItemDisabled, part: PICKER_ITEM_PART }, item.text));
357
- }), h("div", { key: '80a7461dfe571f46466219b05007b021711aed32', class: "picker-item picker-item-empty", "aria-hidden": "true" }, "\u00A0"), h("div", { key: 'fed82263295f58c51e2b753d0c06c7d71872b8a7', class: "picker-item picker-item-empty", "aria-hidden": "true" }, "\u00A0"), h("div", { key: 'e805dff4122cc4e5fb4d7dcb96054fee8ad3bd07', class: "picker-item picker-item-empty", "aria-hidden": "true" }, "\u00A0")));
361
+ }), h("div", { key: '28aa37f9ce90e88b9c3a5b2c399e3066e9f339e1', class: "picker-item picker-item-empty", "aria-hidden": "true" }, "\u00A0"), h("div", { key: 'ef4ae6bee2b17918f0c2aba9d5c720c1d95987e4', class: "picker-item picker-item-empty", "aria-hidden": "true" }, "\u00A0"), h("div", { key: '564967bc8e42a9018163850da3a967a933b3de7b', class: "picker-item picker-item-empty", "aria-hidden": "true" }, "\u00A0")));
358
362
  }
359
363
  static get is() { return "ion-picker-column-internal"; }
360
364
  static get encapsulation() { return "shadow"; }
@@ -468,7 +468,7 @@ export class PickerInternal {
468
468
  this.emitInputModeChange();
469
469
  }
470
470
  render() {
471
- return (h(Host, { key: 'f6b301345583f5ccfc31cce536176af7aeefd193', onPointerDown: (ev) => this.onPointerDown(ev), onClick: () => this.onClick() }, h("input", { key: 'e57fd191d49cc500b719d5b9ad35054d55e96c43', "aria-hidden": "true", tabindex: -1, inputmode: "numeric", type: "number", onKeyDown: (ev) => {
471
+ return (h(Host, { key: '01cbd466787242ad070b01909714089570b4d67f', onPointerDown: (ev) => this.onPointerDown(ev), onClick: () => this.onClick() }, h("input", { key: '7ff8c0a74c107610a6f0dd9fbc2fc7a4a6dc2468', "aria-hidden": "true", tabindex: -1, inputmode: "numeric", type: "number", onKeyDown: (ev) => {
472
472
  var _a;
473
473
  /**
474
474
  * The "Enter" key represents
@@ -483,7 +483,7 @@ export class PickerInternal {
483
483
  if (ev.key === 'Enter') {
484
484
  (_a = this.inputEl) === null || _a === void 0 ? void 0 : _a.blur();
485
485
  }
486
- }, ref: (el) => (this.inputEl = el), onInput: () => this.onInputChange(), onBlur: () => this.exitInputMode() }), h("div", { key: '3360e7d913f87293844928e430acde69d399f68e', class: "picker-before" }), h("div", { key: '4db89e681458d4eec5d60ff47d3e0ba9fd116682', class: "picker-after" }), h("div", { key: 'a21b20d77dac8141623995b5a53f416d3d9fc1ef', class: "picker-highlight", ref: (el) => (this.highlightEl = el) }), h("slot", { key: '86c7d926523b615b4769bd1a4e9713b351089369' })));
486
+ }, ref: (el) => (this.inputEl = el), onInput: () => this.onInputChange(), onBlur: () => this.exitInputMode() }), h("div", { key: '4700c9d877f54ae8f3fb173122193c27637f70a4', class: "picker-before" }), h("div", { key: '7ceae834b15d559f3819ec2116f83669cf6665fc', class: "picker-after" }), h("div", { key: '2d3bfda76279c2ee14edc067c53651be23b8b525', class: "picker-highlight", ref: (el) => (this.highlightEl = el) }), h("slot", { key: '4797def7a3882a8a911ad47949b76f58a9f448d1' })));
487
487
  }
488
488
  static get is() { return "ion-picker-internal"; }
489
489
  static get encapsulation() { return "shadow"; }
@@ -141,7 +141,6 @@
141
141
  --ion-safe-area-left: 0px;
142
142
  display: flex;
143
143
  flex-direction: column;
144
- overflow: hidden;
145
144
  }
146
145
 
147
146
  :host(.popover-nested.popover-side-left) {
@@ -335,9 +335,9 @@ export class Popover {
335
335
  const { onLifecycle, parentPopover, dismissOnSelect, side, arrow, htmlAttributes } = this;
336
336
  const desktop = isPlatform('desktop');
337
337
  const enableArrow = arrow && !parentPopover;
338
- return (h(Host, Object.assign({ key: '104a5bf92a9bbd2efc71d499a8500e5d55f81711', "aria-modal": "true", "no-router": true, tabindex: "-1" }, htmlAttributes, { style: {
338
+ return (h(Host, Object.assign({ key: 'f3b86c7bc6ef6b1b27a6ac78e7ddd98e46223bd4', "aria-modal": "true", "no-router": true, tabindex: "-1" }, htmlAttributes, { style: {
339
339
  zIndex: `${20000 + this.overlayIndex}`,
340
- }, class: Object.assign(Object.assign({}, getClassMap(this.cssClass)), { [mode]: true, 'popover-translucent': this.translucent, 'overlay-hidden': true, 'popover-desktop': desktop, [`popover-side-${side}`]: true, 'popover-nested': !!parentPopover }), onIonPopoverDidPresent: onLifecycle, onIonPopoverWillPresent: onLifecycle, onIonPopoverWillDismiss: onLifecycle, onIonPopoverDidDismiss: onLifecycle, onIonBackdropTap: this.onBackdropTap }), !parentPopover && h("ion-backdrop", { tappable: this.backdropDismiss, visible: this.showBackdrop, part: "backdrop" }), h("div", { key: 'ef0baa04c22444d4bc705220235a892308d67586', class: "popover-wrapper ion-overlay-wrapper", onClick: dismissOnSelect ? () => this.dismiss() : undefined }, enableArrow && h("div", { class: "popover-arrow", part: "arrow" }), h("div", { key: '5cc5f5c353de614e484e9cfeacecfca9fbfde0e0', class: "popover-content", part: "content" }, h("slot", { key: '2d85c591cdc85efa98afbf40f676525f1402efcf' })))));
340
+ }, class: Object.assign(Object.assign({}, getClassMap(this.cssClass)), { [mode]: true, 'popover-translucent': this.translucent, 'overlay-hidden': true, 'popover-desktop': desktop, [`popover-side-${side}`]: true, 'popover-nested': !!parentPopover }), onIonPopoverDidPresent: onLifecycle, onIonPopoverWillPresent: onLifecycle, onIonPopoverWillDismiss: onLifecycle, onIonPopoverDidDismiss: onLifecycle, onIonBackdropTap: this.onBackdropTap }), !parentPopover && h("ion-backdrop", { key: 'f7fbd914100838ed7d419eedd19e6b1efa691127', tappable: this.backdropDismiss, visible: this.showBackdrop, part: "backdrop" }), h("div", { key: 'a651cb4daa6556e761c2e2b672306ad25e4c9429', class: "popover-wrapper ion-overlay-wrapper", onClick: dismissOnSelect ? () => this.dismiss() : undefined }, enableArrow && h("div", { key: '7c5c7d8d6f9530535124e3fc75a38055f68b7589', class: "popover-arrow", part: "arrow" }), h("div", { key: '9f92fff4f36941e8f7de9774aef7d7508ca5cfe5', class: "popover-content", part: "content" }, h("slot", { key: '26c4e3df40a4832caff996ead3321c656eb5704f' })))));
341
341
  }
342
342
  static get is() { return "ion-popover"; }
343
343
  static get encapsulation() { return "shadow"; }
@@ -141,7 +141,6 @@
141
141
  --ion-safe-area-left: 0px;
142
142
  display: flex;
143
143
  flex-direction: column;
144
- overflow: hidden;
145
144
  }
146
145
 
147
146
  :host(.popover-nested.popover-side-left) {
@@ -46,6 +46,82 @@ configs({ directions: ['ltr'] }).forEach(({ title, screenshot, config }) => {
46
46
  * Translucent popovers are only available on iOS
47
47
  */
48
48
  configs({ modes: ['ios'], directions: ['ltr'] }).forEach(({ title, screenshot, config }) => {
49
+ test.describe(title('popover: scrolling'), async () => {
50
+ test.beforeEach(({ skip }) => {
51
+ test.info().annotations.push({
52
+ type: 'issue',
53
+ description: 'https://github.com/ionic-team/ionic-framework/issues/29211',
54
+ });
55
+ // We are testing if Ionic sets overflow is set correctly on elements,
56
+ // so we do not need to test across browsers
57
+ skip.browser('webkit', 'Behavior does not vary across browsers');
58
+ skip.browser('firefox', 'Behavior does not vary across browsers');
59
+ });
60
+ test('should scroll to bottom without IonContent', async ({ page }) => {
61
+ await page.setContent(`
62
+ <style>
63
+ ion-popover {
64
+ --height: 150px;
65
+ }
66
+ </style>
67
+ <ion-popover>
68
+ <p>Text</p>
69
+ <p>Text</p>
70
+ <p>Text</p>
71
+ <p>Text</p>
72
+ <p>Text</p>
73
+ <p>Text</p>
74
+ <p>Text</p>
75
+ <p>Text</p>
76
+ <p>Text</p>
77
+ <p>Text</p>
78
+ </ion-popover>
79
+ `, config);
80
+ const popover = page.locator('ion-popover');
81
+ const viewport = popover.locator('.popover-viewport');
82
+ const p = popover.locator('p');
83
+ const lastP = await p.last();
84
+ await popover.evaluate((el) => el.present());
85
+ await expect(lastP).not.toBeInViewport();
86
+ // hover over viewport and scroll to bottom
87
+ await viewport.hover();
88
+ await page.mouse.wheel(0, 500);
89
+ await expect(lastP).toBeInViewport();
90
+ });
91
+ test('should scroll to bottom with IonContent', async ({ page }) => {
92
+ await page.setContent(`
93
+ <style>
94
+ ion-popover {
95
+ --height: 150px;
96
+ }
97
+ </style>
98
+ <ion-popover>
99
+ <ion-content>
100
+ <p>Text</p>
101
+ <p>Text</p>
102
+ <p>Text</p>
103
+ <p>Text</p>
104
+ <p>Text</p>
105
+ <p>Text</p>
106
+ <p>Text</p>
107
+ <p>Text</p>
108
+ <p>Text</p>
109
+ <p>Text</p>
110
+ </ion-content>
111
+ </ion-popover>
112
+ `, config);
113
+ const popover = page.locator('ion-popover');
114
+ const content = popover.locator('ion-content');
115
+ const p = popover.locator('p');
116
+ const lastP = await p.last();
117
+ await popover.evaluate((el) => el.present());
118
+ await expect(lastP).not.toBeInViewport();
119
+ // hover over viewport and scroll to bottom
120
+ await content.hover();
121
+ await page.mouse.wheel(0, 500);
122
+ await expect(lastP).toBeInViewport();
123
+ });
124
+ });
49
125
  test.describe(title('popover: translucent variants'), async () => {
50
126
  let popoverFixture;
51
127
  test.beforeEach(async ({ page }) => {
@@ -26,7 +26,7 @@ export class ProgressBar {
26
26
  const { color, type, reversed, value, buffer } = this;
27
27
  const paused = config.getBoolean('_testing');
28
28
  const mode = getIonMode(this);
29
- return (h(Host, { key: '384d09558f91dc8119e689c3a8923e67c54c7eb2', role: "progressbar", "aria-valuenow": type === 'determinate' ? value : null, "aria-valuemin": "0", "aria-valuemax": "1", class: createColorClasses(color, {
29
+ return (h(Host, { key: '944b79ed6fce1b2c0ed48681cd8517a5abbddd80', role: "progressbar", "aria-valuenow": type === 'determinate' ? value : null, "aria-valuemin": "0", "aria-valuemax": "1", class: createColorClasses(color, {
30
30
  [mode]: true,
31
31
  [`progress-bar-${type}`]: true,
32
32
  'progress-paused': paused,
@@ -153,7 +153,7 @@ export class RadioGroup {
153
153
  const { label, labelId, el, name, value } = this;
154
154
  const mode = getIonMode(this);
155
155
  renderHiddenInput(true, el, name, value, false);
156
- return h(Host, { key: 'd8e84feca8f4dbe7605bc4ad096b6e68b482ba68', role: "radiogroup", "aria-labelledby": label ? labelId : null, onClick: this.onClick, class: mode });
156
+ return h(Host, { key: '6065674a08ac2ead25e87219b5628879a759b75a', role: "radiogroup", "aria-labelledby": label ? labelId : null, onClick: this.onClick, class: mode });
157
157
  }
158
158
  static get is() { return "ion-radio-group"; }
159
159
  static get properties() {
@@ -58,8 +58,14 @@ export class Range {
58
58
  el: rangeSlider,
59
59
  gestureName: 'range',
60
60
  gesturePriority: 100,
61
- threshold: 0,
62
- onStart: (ev) => this.onStart(ev),
61
+ /**
62
+ * Provide a threshold since the drag movement
63
+ * might be a user scrolling the view.
64
+ * If this is true, then the range
65
+ * should not move.
66
+ */
67
+ threshold: 10,
68
+ onStart: () => this.onStart(),
63
69
  onMove: (ev) => this.onMove(ev),
64
70
  onEnd: (ev) => this.onEnd(ev),
65
71
  });
@@ -242,33 +248,93 @@ export class Range {
242
248
  this.value = this.ensureValueInBounds(this.value);
243
249
  this.ionChange.emit({ value: this.value });
244
250
  }
245
- onStart(detail) {
246
- const { contentEl } = this;
247
- if (contentEl) {
251
+ /**
252
+ * The value should be updated on touch end or
253
+ * when the component is being dragged.
254
+ * This follows the native behavior of mobile devices.
255
+ *
256
+ * For example: When the user lifts their finger from the
257
+ * screen after tapping the bar or dragging the bar or knob.
258
+ */
259
+ onStart() {
260
+ this.ionKnobMoveStart.emit({ value: this.ensureValueInBounds(this.value) });
261
+ }
262
+ /**
263
+ * The value should be updated while dragging the
264
+ * bar or knob.
265
+ *
266
+ * While the user is dragging, the view
267
+ * should not scroll. This is to prevent the user from
268
+ * feeling disoriented while dragging.
269
+ *
270
+ * The user can scroll on the view if the knob or
271
+ * bar is not being dragged.
272
+ *
273
+ * @param detail The details of the gesture event.
274
+ */
275
+ onMove(detail) {
276
+ const { contentEl, pressedKnob } = this;
277
+ const currentX = detail.currentX;
278
+ /**
279
+ * Since the user is dragging on the bar or knob, the view should not scroll.
280
+ *
281
+ * This only needs to be done once.
282
+ */
283
+ if (contentEl && this.initialContentScrollY === undefined) {
248
284
  this.initialContentScrollY = disableContentScrollY(contentEl);
249
285
  }
250
- const rect = (this.rect = this.rangeSlider.getBoundingClientRect());
251
- const currentX = detail.currentX;
252
- // figure out which knob they started closer to
253
- let ratio = clamp(0, (currentX - rect.left) / rect.width, 1);
254
- if (isRTL(this.el)) {
255
- ratio = 1 - ratio;
286
+ /**
287
+ * The `pressedKnob` can be undefined if the user just
288
+ * started dragging the knob.
289
+ *
290
+ * This is necessary to determine which knob the user is dragging,
291
+ * especially when it's a dual knob.
292
+ * Plus, it determines when to apply certain styles.
293
+ *
294
+ * This only needs to be done once since the knob won't change
295
+ * while the user is dragging.
296
+ */
297
+ if (pressedKnob === undefined) {
298
+ this.setPressedKnob(currentX);
256
299
  }
257
- this.pressedKnob = !this.dualKnobs || Math.abs(this.ratioA - ratio) < Math.abs(this.ratioB - ratio) ? 'A' : 'B';
258
- this.setFocus(this.pressedKnob);
259
- // update the active knob's position
260
300
  this.update(currentX);
261
- this.ionKnobMoveStart.emit({ value: this.ensureValueInBounds(this.value) });
262
- }
263
- onMove(detail) {
264
- this.update(detail.currentX);
265
301
  }
302
+ /**
303
+ * The value should be updated on touch end:
304
+ * - When the user lifts their finger from the screen after
305
+ * tapping the bar.
306
+ *
307
+ * @param detail The details of the gesture or mouse event.
308
+ */
266
309
  onEnd(detail) {
267
310
  const { contentEl, initialContentScrollY } = this;
268
- if (contentEl) {
311
+ const currentX = detail.currentX || detail.clientX;
312
+ /**
313
+ * The `pressedKnob` can be undefined if the user never
314
+ * dragged the knob. They just tapped on the bar.
315
+ *
316
+ * This is necessary to determine which knob the user is changing,
317
+ * especially when it's a dual knob.
318
+ * Plus, it determines when to apply certain styles.
319
+ */
320
+ if (this.pressedKnob === undefined) {
321
+ this.setPressedKnob(currentX);
322
+ }
323
+ /**
324
+ * The user is no longer dragging the bar or
325
+ * knob (if they were dragging it).
326
+ *
327
+ * The user can now scroll on the view in the next gesture event.
328
+ */
329
+ if (contentEl && initialContentScrollY !== undefined) {
269
330
  resetContentScrollY(contentEl, initialContentScrollY);
270
331
  }
271
- this.update(detail.currentX);
332
+ // update the active knob's position
333
+ this.update(currentX);
334
+ /**
335
+ * Reset the pressed knob to undefined since the user
336
+ * may start dragging a different knob in the next gesture event.
337
+ */
272
338
  this.pressedKnob = undefined;
273
339
  this.emitValueChange();
274
340
  this.ionKnobMoveEnd.emit({ value: this.ensureValueInBounds(this.value) });
@@ -295,6 +361,16 @@ export class Range {
295
361
  // Update input value
296
362
  this.updateValue();
297
363
  }
364
+ setPressedKnob(currentX) {
365
+ const rect = (this.rect = this.rangeSlider.getBoundingClientRect());
366
+ // figure out which knob they started closer to
367
+ let ratio = clamp(0, (currentX - rect.left) / rect.width, 1);
368
+ if (isRTL(this.el)) {
369
+ ratio = 1 - ratio;
370
+ }
371
+ this.pressedKnob = !this.dualKnobs || Math.abs(this.ratioA - ratio) < Math.abs(this.ratioB - ratio) ? 'A' : 'B';
372
+ this.setFocus(this.pressedKnob);
373
+ }
298
374
  get valA() {
299
375
  return ratioToValue(this.ratioA, this.min, this.max, this.step);
300
376
  }
@@ -497,7 +573,36 @@ Developers can dismiss this warning by removing their usage of the "legacy" prop
497
573
  if (!this.legacyFormController.hasLegacyControl() && this.hasLabel) {
498
574
  labelledBy = 'range-label';
499
575
  }
500
- return (h("div", { class: "range-slider", ref: (rangeEl) => (this.rangeSlider = rangeEl) }, ticks.map((tick) => (h("div", { style: tickStyle(tick), role: "presentation", class: {
576
+ return (h("div", { class: "range-slider", ref: (rangeEl) => (this.rangeSlider = rangeEl),
577
+ /**
578
+ * Since the gesture has a threshold, the value
579
+ * won't change until the user has dragged past
580
+ * the threshold. This is to prevent the range
581
+ * from moving when the user is scrolling.
582
+ *
583
+ * This results in the value not being updated
584
+ * and the event emitters not being triggered
585
+ * if the user taps on the range. This is why
586
+ * we need to listen for the "pointerUp" event.
587
+ */
588
+ onPointerUp: (ev) => {
589
+ /**
590
+ * If the user drags the knob on the web
591
+ * version (does not occur on mobile),
592
+ * the "pointerUp" event will be triggered
593
+ * along with the gesture's events.
594
+ * This leads to duplicate events.
595
+ *
596
+ * By checking if the pressedKnob is undefined,
597
+ * we can determine if the "pointerUp" event was
598
+ * triggered by a tap or a drag. If it was
599
+ * dragged, the pressedKnob will be defined.
600
+ */
601
+ if (this.pressedKnob === undefined) {
602
+ this.onStart();
603
+ this.onEnd(ev);
604
+ }
605
+ } }, ticks.map((tick) => (h("div", { style: tickStyle(tick), role: "presentation", class: {
501
606
  'range-tick': true,
502
607
  'range-tick-active': tick.active,
503
608
  }, part: tick.active ? 'tick-active' : 'tick' }))), h("div", { class: "range-bar-container" }, h("div", { class: "range-bar", role: "presentation", part: "bar" }), h("div", { class: {
@@ -54,6 +54,33 @@ configs({ modes: ['ios'], directions: ['ltr'] }).forEach(({ title, config }) =>
54
54
  expect(rangeStart).toHaveReceivedEventDetail({ value: 20 });
55
55
  expect(rangeEnd).toHaveReceivedEventDetail({ value: 21 });
56
56
  });
57
+ test('should emit end event on tap', async ({ page }, testInfo) => {
58
+ testInfo.annotations.push({
59
+ type: 'issue',
60
+ description: 'https://github.com/ionic-team/ionic-framework/issues/28487',
61
+ });
62
+ await page.setContent(`<ion-range aria-label="Range" value="20"></ion-range>`, config);
63
+ const range = page.locator('ion-range');
64
+ const rangeEndSpy = await page.spyOnEvent('ionKnobMoveEnd');
65
+ const rangeBoundingBox = await range.boundingBox();
66
+ /**
67
+ * Coordinates for the click event.
68
+ * These need to be near the end of the range
69
+ * (or anything that isn't the current value).
70
+ *
71
+ * The number 50 is arbitrary, but it should be
72
+ * less than the width of the range.
73
+ */
74
+ const x = rangeBoundingBox.width - 50;
75
+ // The y coordinate is the middle of the range.
76
+ const y = rangeBoundingBox.height / 2;
77
+ // Click near the end of the range.
78
+ await range.click({
79
+ position: { x, y },
80
+ });
81
+ await rangeEndSpy.next();
82
+ expect(rangeEndSpy.length).toBe(1);
83
+ });
57
84
  // TODO FW-2873
58
85
  test.skip('should not scroll when the knob is swiped', async ({ page, skip }) => {
59
86
  skip.browser('webkit', 'mouse.wheel is not available in WebKit');
@@ -594,7 +594,7 @@ export class Refresher {
594
594
  }
595
595
  render() {
596
596
  const mode = getIonMode(this);
597
- return (h(Host, { key: '9cf8e306e367e0ffd99f8a242dce0c9d78f96317', slot: "fixed", class: {
597
+ return (h(Host, { key: '96f4f595ebdb92a12755b642398691bcaab9f7c1', slot: "fixed", class: {
598
598
  [mode]: true,
599
599
  // Used internally for styling
600
600
  [`refresher-${mode}`]: true,
@@ -52,7 +52,7 @@ export class RefresherContent {
52
52
  const pullingIcon = this.pullingIcon;
53
53
  const hasSpinner = pullingIcon != null && SPINNERS[pullingIcon] !== undefined;
54
54
  const mode = getIonMode(this);
55
- return (h(Host, { key: '537e4d601fd09804d072e9fed9b2c6ba8d890548', class: mode }, h("div", { key: '67f46df746f7da2fc60c47da9216a2920c25166f', class: "refresher-pulling" }, this.pullingIcon && hasSpinner && (h("div", { class: "refresher-pulling-icon" }, h("div", { class: "spinner-arrow-container" }, h("ion-spinner", { name: this.pullingIcon, paused: true }), mode === 'md' && this.pullingIcon === 'circular' && (h("div", { class: "arrow-container" }, h("ion-icon", { icon: caretBackSharp, "aria-hidden": "true" })))))), this.pullingIcon && !hasSpinner && (h("div", { class: "refresher-pulling-icon" }, h("ion-icon", { icon: this.pullingIcon, lazy: false, "aria-hidden": "true" }))), this.pullingText !== undefined && this.renderPullingText()), h("div", { key: '216f96af452e1567df7906c4d9e6fbf8c397ad21', class: "refresher-refreshing" }, this.refreshingSpinner && (h("div", { class: "refresher-refreshing-icon" }, h("ion-spinner", { name: this.refreshingSpinner }))), this.refreshingText !== undefined && this.renderRefreshingText())));
55
+ return (h(Host, { key: 'cf3caa51c4aba8a95622f6d32cafa90b683b9d6e', class: mode }, h("div", { key: '5ad70801104bbea873d3525206660c52e4447903', class: "refresher-pulling" }, this.pullingIcon && hasSpinner && (h("div", { key: '0f95df169fd367528bfaa5d9ccf6690a613609c4', class: "refresher-pulling-icon" }, h("div", { key: '4b8f0465a19f017751b207807c32e1fe00fda433', class: "spinner-arrow-container" }, h("ion-spinner", { key: '77e60179d76f0d17f8f2dc3518f97a2a924418e6', name: this.pullingIcon, paused: true }), mode === 'md' && this.pullingIcon === 'circular' && (h("div", { key: 'f78f63f08f071bead1bfe655bae6394f8a219d91', class: "arrow-container" }, h("ion-icon", { key: '4d833d134d2b221cae2dfb0611d4029f2d664db5', icon: caretBackSharp, "aria-hidden": "true" })))))), this.pullingIcon && !hasSpinner && (h("div", { key: 'e6db19d7fa324363d2a7c3c046510f4c8461f7e6', class: "refresher-pulling-icon" }, h("ion-icon", { key: '66c2ef1a53c5809f49891de515da5f55d9bf8dcc', icon: this.pullingIcon, lazy: false, "aria-hidden": "true" }))), this.pullingText !== undefined && this.renderPullingText()), h("div", { key: '80c413e21d362a5bb0419fcd13092453b3445cee', class: "refresher-refreshing" }, this.refreshingSpinner && (h("div", { key: '0d5511f9644de26332a1a9ed39b160691fab74d9', class: "refresher-refreshing-icon" }, h("ion-spinner", { key: '54e4a96b081c7b453a98e00cceea7c086268a450', name: this.refreshingSpinner }))), this.refreshingText !== undefined && this.renderRefreshingText())));
56
56
  }
57
57
  static get is() { return "ion-refresher-content"; }
58
58
  static get properties() {
@@ -20,7 +20,7 @@ export class Reorder {
20
20
  render() {
21
21
  const mode = getIonMode(this);
22
22
  const reorderIcon = mode === 'ios' ? reorderThreeOutline : reorderTwoSharp;
23
- return (h(Host, { key: 'e625707b1810f93f5c667e38b8e2904988a3cff0', class: mode }, h("slot", { key: 'fd0c3167e8a7955a6f841b338345de0528535ff5' }, h("ion-icon", { key: '3fc7bb1adb0dde839ec4898361e359c640e81067', icon: reorderIcon, lazy: false, class: "reorder-icon", part: "icon", "aria-hidden": "true" }))));
23
+ return (h(Host, { key: '5747b63aa64b05bfed96bbce8087186c7e14c6d5', class: mode }, h("slot", { key: 'a745f29a23c905cd0bff572acb755b597a3fb3c3' }, h("ion-icon", { key: '48f433e85a3a68c16bc426623b2b74957b4b2eb7', icon: reorderIcon, lazy: false, class: "reorder-icon", part: "icon", "aria-hidden": "true" }))));
24
24
  }
25
25
  static get is() { return "ion-reorder"; }
26
26
  static get encapsulation() { return "shadow"; }
@@ -238,7 +238,7 @@ export class ReorderGroup {
238
238
  }
239
239
  render() {
240
240
  const mode = getIonMode(this);
241
- return (h(Host, { key: '067b8ff26887c4e458163f70f7308723c90a53f8', class: {
241
+ return (h(Host, { key: '68b5e5fa00a0531c74597964d84c82da8bc3252f', class: {
242
242
  [mode]: true,
243
243
  'reorder-enabled': !this.disabled,
244
244
  'reorder-list-active': this.state !== 0 /* ReorderGroupState.Idle */,
@@ -59,7 +59,7 @@ export class RippleEffect {
59
59
  }
60
60
  render() {
61
61
  const mode = getIonMode(this);
62
- return (h(Host, { key: 'a9ff1956627908ee4071002ca018eaa80f87cd59', role: "presentation", class: {
62
+ return (h(Host, { key: 'f1129019a6d556b008c754aeb79618c69baea9f8', role: "presentation", class: {
63
63
  [mode]: true,
64
64
  unbounded: this.unbounded,
65
65
  } }));
@@ -23,10 +23,10 @@ export class RouterLink {
23
23
  rel: this.rel,
24
24
  target: this.target,
25
25
  };
26
- return (h(Host, { key: '9944573e56abecc47afd2df03b386e38fc7ed2f3', onClick: this.onClick, class: createColorClasses(this.color, {
26
+ return (h(Host, { key: 'e69892f4c6a6baf040a20c429afdec0e4db2dc0e', onClick: this.onClick, class: createColorClasses(this.color, {
27
27
  [mode]: true,
28
28
  'ion-activatable': true,
29
- }) }, h("a", Object.assign({ key: '383de10c02eb9ab87e27890548ef681dccf2a765' }, attrs), h("slot", { key: '584a5a52e2b116f3827596cc5869a3557d6bcb6b' }))));
29
+ }) }, h("a", Object.assign({ key: '648cb22526f2933abe0865c86da6f30eac3ccb87' }, attrs), h("slot", { key: 'd6bc2e28b7c5cc228caedffebe653bde35934b67' }))));
30
30
  }
31
31
  static get is() { return "ion-router-link"; }
32
32
  static get encapsulation() { return "shadow"; }
@@ -178,7 +178,7 @@ export class RouterOutlet {
178
178
  return true;
179
179
  }
180
180
  render() {
181
- return h("slot", { key: '5e31ebd99536453783f5b6f9119d7fa2bf8a5aad' });
181
+ return h("slot", { key: '3fe520ecae37af68e07a51f3a3223ea454035a59' });
182
182
  }
183
183
  static get is() { return "ion-router-outlet"; }
184
184
  static get encapsulation() { return "shadow"; }
@@ -5,7 +5,7 @@ import { Host, h } from "@stencil/core";
5
5
  import { getIonMode } from "../../global/ionic-global";
6
6
  export class Row {
7
7
  render() {
8
- return (h(Host, { key: 'de94b93c001a93b2a88bcb8e959f421fd5ad4a65', class: getIonMode(this) }, h("slot", { key: '41fa951758d3644bb77d80002caf6e25a79393ce' })));
8
+ return (h(Host, { key: '242c9a45b0bb39af2aebf412fdfa9a176babc834', class: getIonMode(this) }, h("slot", { key: 'd9015d663d631bbf20bd3e0821fed874cd6c5156' })));
9
9
  }
10
10
  static get is() { return "ion-row"; }
11
11
  static get encapsulation() { return "shadow"; }