voyager-ionic-core 7.6.5 → 7.7.2

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 (722) hide show
  1. package/components/action-sheet.js +12 -6
  2. package/components/alert.js +11 -5
  3. package/components/backdrop.js +5 -3
  4. package/components/button.js +6 -4
  5. package/components/buttons.js +5 -3
  6. package/components/checkbox.js +4 -2
  7. package/components/data.js +1 -1
  8. package/components/hardware-back-button.js +47 -3
  9. package/components/helpers.js +1 -1
  10. package/components/icon.js +2 -1
  11. package/components/ion-accordion-group.js +6 -4
  12. package/components/ion-accordion.js +9 -5
  13. package/components/ion-app.js +14 -3
  14. package/components/ion-avatar.js +5 -3
  15. package/components/ion-back-button.js +6 -4
  16. package/components/ion-badge.js +6 -4
  17. package/components/ion-breadcrumb.js +6 -4
  18. package/components/ion-breadcrumbs.js +6 -4
  19. package/components/ion-card-content.js +5 -3
  20. package/components/ion-card-header.js +6 -4
  21. package/components/ion-card-subtitle.js +6 -4
  22. package/components/ion-card-title.js +6 -4
  23. package/components/ion-card.js +5 -3
  24. package/components/ion-chip.js +6 -4
  25. package/components/ion-col.js +4 -3
  26. package/components/ion-content.js +5 -4
  27. package/components/ion-datetime-button.js +6 -4
  28. package/components/ion-datetime.js +40 -19
  29. package/components/ion-fab-button.js +6 -4
  30. package/components/ion-fab-list.js +4 -3
  31. package/components/ion-fab.js +4 -3
  32. package/components/ion-footer.js +6 -4
  33. package/components/ion-grid.js +4 -3
  34. package/components/ion-header.js +6 -4
  35. package/components/ion-img.js +3 -2
  36. package/components/ion-infinite-scroll-content.js +6 -4
  37. package/components/ion-infinite-scroll.js +3 -2
  38. package/components/ion-input.js +4 -2
  39. package/components/ion-item-divider.js +6 -4
  40. package/components/ion-item-group.js +5 -3
  41. package/components/ion-item-option.js +6 -4
  42. package/components/ion-item-options.js +5 -3
  43. package/components/ion-item-sliding.js +3 -2
  44. package/components/ion-loading.js +10 -4
  45. package/components/ion-menu-button.js +6 -4
  46. package/components/ion-menu-toggle.js +4 -3
  47. package/components/ion-menu.js +13 -5
  48. package/components/ion-modal.js +13 -10
  49. package/components/ion-nav-link.js +1 -1
  50. package/components/ion-nav.js +3 -2
  51. package/components/ion-picker.js +10 -4
  52. package/components/ion-progress-bar.js +5 -3
  53. package/components/ion-range.js +4 -2
  54. package/components/ion-refresher-content.js +1 -1
  55. package/components/ion-refresher.js +5 -3
  56. package/components/ion-reorder-group.js +3 -2
  57. package/components/ion-reorder.js +5 -3
  58. package/components/ion-router-link.js +4 -3
  59. package/components/ion-router-outlet.js +3 -2
  60. package/components/ion-row.js +3 -2
  61. package/components/ion-searchbar.js +8 -6
  62. package/components/ion-segment-button.js +7 -5
  63. package/components/ion-segment.js +13 -4
  64. package/components/ion-select-option.js +3 -2
  65. package/components/ion-select.js +24 -3
  66. package/components/ion-skeleton-text.js +4 -3
  67. package/components/ion-split-pane.js +15 -14
  68. package/components/ion-tab-bar.js +6 -4
  69. package/components/ion-tab-button.js +6 -4
  70. package/components/ion-tab.js +4 -3
  71. package/components/ion-tabs.js +3 -2
  72. package/components/ion-text.js +4 -3
  73. package/components/ion-textarea.js +4 -2
  74. package/components/ion-thumbnail.js +3 -2
  75. package/components/ion-title.js +6 -4
  76. package/components/ion-toast.js +10 -4
  77. package/components/ion-toggle.js +4 -2
  78. package/components/ion-toolbar.js +6 -4
  79. package/components/item.js +15 -16
  80. package/components/label.js +5 -3
  81. package/components/list-header.js +6 -4
  82. package/components/list.js +5 -3
  83. package/components/note.js +6 -4
  84. package/components/overlays.js +83 -19
  85. package/components/picker-column-internal.js +7 -5
  86. package/components/picker-column.js +6 -4
  87. package/components/picker-internal.js +21 -3
  88. package/components/popover.js +12 -6
  89. package/components/radio-group.js +1 -1
  90. package/components/radio.js +4 -2
  91. package/components/ripple-effect.js +3 -2
  92. package/components/select-popover.js +7 -5
  93. package/components/spinner.js +3 -2
  94. package/css/core.css +28 -0
  95. package/css/core.css.map +1 -1
  96. package/css/ionic.bundle.css +1 -1
  97. package/css/ionic.bundle.css.map +1 -1
  98. package/dist/cjs/{animation-9b401d39.js → animation-fdab9de5.js} +1 -1
  99. package/dist/cjs/{app-globals-07127773.js → app-globals-92ad1b3d.js} +1 -1
  100. package/dist/cjs/{button-active-85665616.js → button-active-2d6520ec.js} +1 -1
  101. package/dist/cjs/{form-controller-7d42a722.js → form-controller-7b90d7b7.js} +1 -1
  102. package/dist/cjs/{framework-delegate-1c29b14a.js → framework-delegate-a3e6d060.js} +1 -1
  103. package/dist/cjs/{hardware-back-button-76833cac.js → hardware-back-button-2696acaf.js} +48 -2
  104. package/dist/cjs/{helpers-76bb7efb.js → helpers-2e1028fa.js} +1 -1
  105. package/dist/cjs/{index-71f41461.js → index-0ffe376d.js} +56 -23
  106. package/dist/cjs/{index-b4f986cd.js → index-10da82ce.js} +1 -1
  107. package/dist/cjs/{index-da15e99c.js → index-53d162b2.js} +1 -1
  108. package/dist/cjs/{index-96a721a7.js → index-a43f7a0f.js} +4 -4
  109. package/dist/cjs/{index-6bb6b651.js → index-c3580a90.js} +4 -4
  110. package/dist/cjs/index.cjs.js +11 -11
  111. package/dist/cjs/{input-shims-a23bb0f4.js → input-shims-6f804705.js} +2 -2
  112. package/dist/cjs/{input.utils-3d0166a2.js → input.utils-d693d18a.js} +1 -1
  113. package/dist/cjs/ion-accordion_2.cjs.entry.js +18 -12
  114. package/dist/cjs/ion-action-sheet.cjs.entry.js +20 -14
  115. package/dist/cjs/ion-alert.cjs.entry.js +19 -13
  116. package/dist/cjs/ion-app_8.cjs.entry.js +72 -50
  117. package/dist/cjs/ion-avatar_3.cjs.entry.js +16 -11
  118. package/dist/cjs/ion-back-button.cjs.entry.js +9 -7
  119. package/dist/cjs/ion-backdrop.cjs.entry.js +7 -5
  120. package/dist/cjs/ion-breadcrumb_2.cjs.entry.js +15 -11
  121. package/dist/cjs/ion-button_2.cjs.entry.js +11 -8
  122. package/dist/cjs/ion-card_5.cjs.entry.js +31 -21
  123. package/dist/cjs/ion-checkbox.cjs.entry.js +8 -6
  124. package/dist/cjs/ion-chip.cjs.entry.js +8 -6
  125. package/dist/cjs/ion-col_3.cjs.entry.js +13 -10
  126. package/dist/cjs/ion-datetime-button.cjs.entry.js +8 -6
  127. package/dist/cjs/ion-datetime_3.cjs.entry.js +62 -33
  128. package/dist/cjs/ion-fab_3.cjs.entry.js +17 -13
  129. package/dist/cjs/ion-img.cjs.entry.js +6 -5
  130. package/dist/cjs/ion-infinite-scroll_2.cjs.entry.js +13 -10
  131. package/dist/cjs/ion-input.cjs.entry.js +10 -8
  132. package/dist/cjs/ion-item-option_3.cjs.entry.js +18 -13
  133. package/dist/cjs/ion-item_8.cjs.entry.js +53 -33
  134. package/dist/cjs/ion-loading.cjs.entry.js +17 -11
  135. package/dist/cjs/ion-menu_3.cjs.entry.js +29 -19
  136. package/dist/cjs/ion-modal.cjs.entry.js +21 -18
  137. package/dist/cjs/ion-nav_2.cjs.entry.js +10 -9
  138. package/dist/cjs/ion-picker-column-internal.cjs.entry.js +10 -8
  139. package/dist/cjs/ion-picker-internal.cjs.entry.js +23 -5
  140. package/dist/cjs/ion-popover.cjs.entry.js +20 -14
  141. package/dist/cjs/ion-progress-bar.cjs.entry.js +8 -6
  142. package/dist/cjs/ion-radio_2.cjs.entry.js +9 -7
  143. package/dist/cjs/ion-range.cjs.entry.js +9 -7
  144. package/dist/cjs/ion-refresher_2.cjs.entry.js +11 -9
  145. package/dist/cjs/ion-reorder_2.cjs.entry.js +12 -9
  146. package/dist/cjs/ion-ripple-effect.cjs.entry.js +5 -4
  147. package/dist/cjs/ion-route_4.cjs.entry.js +7 -6
  148. package/dist/cjs/ion-searchbar.cjs.entry.js +11 -9
  149. package/dist/cjs/ion-segment_2.cjs.entry.js +23 -12
  150. package/dist/cjs/ion-select_3.cjs.entry.js +42 -18
  151. package/dist/cjs/ion-spinner.cjs.entry.js +5 -4
  152. package/dist/cjs/ion-split-pane.cjs.entry.js +17 -16
  153. package/dist/cjs/ion-tab-bar_2.cjs.entry.js +15 -11
  154. package/dist/cjs/ion-tab_2.cjs.entry.js +10 -8
  155. package/dist/cjs/ion-text.cjs.entry.js +6 -5
  156. package/dist/cjs/ion-textarea.cjs.entry.js +10 -8
  157. package/dist/cjs/ion-toast.cjs.entry.js +17 -11
  158. package/dist/cjs/ion-toggle.cjs.entry.js +8 -6
  159. package/dist/cjs/{ionic-global-c70c3fb5.js → ionic-global-59a10130.js} +1 -1
  160. package/dist/cjs/ionic.cjs.js +7 -7
  161. package/dist/cjs/{ios.transition-9624a175.js → ios.transition-c3b11cc3.js} +4 -4
  162. package/dist/cjs/loader.cjs.js +6 -6
  163. package/dist/cjs/{md.transition-786baf9a.js → md.transition-82a8c649.js} +4 -4
  164. package/dist/cjs/{notch-controller-9735e7ac.js → notch-controller-db0127c4.js} +1 -1
  165. package/dist/cjs/{overlays-4c97edb0.js → overlays-fb7ca451.js} +85 -22
  166. package/dist/cjs/{status-tap-66296dcb.js → status-tap-692f6d32.js} +3 -3
  167. package/dist/cjs/{swipe-back-e37a1a5c.js → swipe-back-7a848bb8.js} +1 -1
  168. package/dist/collection/collection-manifest.json +1 -1
  169. package/dist/collection/components/accordion/accordion.js +5 -3
  170. package/dist/collection/components/accordion/test/disabled/accordion.e2e.js +94 -0
  171. package/dist/collection/components/accordion/test/readonly/accordion.e2e.js +94 -0
  172. package/dist/collection/components/accordion-group/accordion-group.js +2 -2
  173. package/dist/collection/components/action-sheet/action-sheet.ios.css +13 -1
  174. package/dist/collection/components/action-sheet/action-sheet.js +9 -5
  175. package/dist/collection/components/alert/alert.ios.css +23 -0
  176. package/dist/collection/components/alert/alert.js +8 -4
  177. package/dist/collection/components/alert/test/basic/alert.e2e.js +29 -4
  178. package/dist/collection/components/app/app.js +12 -2
  179. package/dist/collection/components/avatar/avatar.js +1 -1
  180. package/dist/collection/components/back-button/back-button.js +2 -2
  181. package/dist/collection/components/backdrop/backdrop.js +1 -1
  182. package/dist/collection/components/badge/badge.js +2 -2
  183. package/dist/collection/components/breadcrumb/breadcrumb.js +2 -2
  184. package/dist/collection/components/breadcrumbs/breadcrumbs.js +2 -2
  185. package/dist/collection/components/button/button.js +2 -2
  186. package/dist/collection/components/button/test/basic/button.e2e.js +1 -1
  187. package/dist/collection/components/buttons/buttons.js +1 -1
  188. package/dist/collection/components/card/card.js +1 -1
  189. package/dist/collection/components/card-content/card-content.js +1 -1
  190. package/dist/collection/components/card-header/card-header.js +2 -2
  191. package/dist/collection/components/card-subtitle/card-subtitle.js +2 -2
  192. package/dist/collection/components/card-title/card-title.js +2 -2
  193. package/dist/collection/components/chip/chip.js +2 -2
  194. package/dist/collection/components/col/col.js +2 -2
  195. package/dist/collection/components/content/content.js +3 -3
  196. package/dist/collection/components/datetime/datetime.js +35 -16
  197. package/dist/collection/components/datetime/test/a11y/datetime.e2e.js +3 -3
  198. package/dist/collection/components/datetime/test/basic/datetime.e2e.js +12 -12
  199. package/dist/collection/components/datetime/test/datetime.e2e.js +1 -1
  200. package/dist/collection/components/datetime/test/disable-dates/datetime.e2e.js +1 -1
  201. package/dist/collection/components/datetime/test/disabled/datetime.e2e.js +4 -4
  202. package/dist/collection/components/datetime/test/display/datetime.e2e.js +9 -9
  203. package/dist/collection/components/datetime/test/locale/datetime.e2e.js +3 -3
  204. package/dist/collection/components/datetime/test/minmax/datetime.e2e.js +11 -11
  205. package/dist/collection/components/datetime/test/month-year-picker/datetime.e2e.js +1 -1
  206. package/dist/collection/components/datetime/test/multiple/datetime.e2e.js +22 -5
  207. package/dist/collection/components/datetime/test/position/datetime.e2e.js +1 -1
  208. package/dist/collection/components/datetime/test/prefer-wheel/datetime.e2e.js +32 -32
  209. package/dist/collection/components/datetime/test/presentation/datetime.e2e.js +3 -3
  210. package/dist/collection/components/datetime/test/readonly/datetime.e2e.js +4 -4
  211. package/dist/collection/components/datetime/test/set-value/datetime.e2e.js +4 -4
  212. package/dist/collection/components/datetime/test/time-label/datetime.e2e.js +2 -2
  213. package/dist/collection/components/datetime/test/values/datetime.e2e.js +4 -4
  214. package/dist/collection/components/datetime-button/datetime-button.js +1 -1
  215. package/dist/collection/components/datetime-button/test/basic/datetime-button.e2e.js +14 -14
  216. package/dist/collection/components/datetime-button/test/disabled/datetime-button.e2e.js +2 -2
  217. package/dist/collection/components/datetime-button/test/multiple/datetime-button.e2e.js +6 -6
  218. package/dist/collection/components/fab/fab.js +2 -2
  219. package/dist/collection/components/fab-button/fab-button.js +2 -2
  220. package/dist/collection/components/fab-list/fab-list.js +2 -2
  221. package/dist/collection/components/footer/footer.js +2 -2
  222. package/dist/collection/components/grid/grid.js +2 -2
  223. package/dist/collection/components/header/header.js +2 -2
  224. package/dist/collection/components/header/test/condense/header.e2e.js +2 -2
  225. package/dist/collection/components/img/img.js +1 -1
  226. package/dist/collection/components/infinite-scroll/infinite-scroll.js +1 -1
  227. package/dist/collection/components/infinite-scroll-content/infinite-scroll-content.js +2 -2
  228. package/dist/collection/components/item/item.ios.css +2 -39
  229. package/dist/collection/components/item/item.js +10 -12
  230. package/dist/collection/components/item/item.md.css +2 -39
  231. package/dist/collection/components/item/test/item.spec.js +20 -0
  232. package/dist/collection/components/item-divider/item-divider.js +2 -2
  233. package/dist/collection/components/item-group/item-group.js +1 -1
  234. package/dist/collection/components/item-option/item-option.js +2 -2
  235. package/dist/collection/components/item-options/item-options.js +1 -1
  236. package/dist/collection/components/item-sliding/item-sliding.js +1 -1
  237. package/dist/collection/components/label/label.js +1 -1
  238. package/dist/collection/components/label/test/basic/label.e2e.js +2 -2
  239. package/dist/collection/components/list/list.js +1 -1
  240. package/dist/collection/components/list-header/list-header.js +2 -2
  241. package/dist/collection/components/loading/loading.js +8 -4
  242. package/dist/collection/components/menu/menu.js +8 -8
  243. package/dist/collection/components/menu-button/menu-button.js +2 -2
  244. package/dist/collection/components/menu-toggle/menu-toggle.js +2 -2
  245. package/dist/collection/components/modal/modal.js +11 -10
  246. package/dist/collection/components/modal/test/animations/modal.e2e.js +36 -0
  247. package/dist/collection/components/modal/test/sheet/modal.e2e.js +1 -1
  248. package/dist/collection/components/modal/test/standalone/modal.e2e.js +1 -1
  249. package/dist/collection/components/nav/nav.js +1 -1
  250. package/dist/collection/components/nav-link/nav-link.js +1 -1
  251. package/dist/collection/components/note/note.js +2 -2
  252. package/dist/collection/components/note/test/a11y/note.e2e.js +6 -6
  253. package/dist/collection/components/picker/picker.js +8 -4
  254. package/dist/collection/components/picker-column/picker-column.js +2 -2
  255. package/dist/collection/components/picker-column-internal/picker-column-internal.js +3 -3
  256. package/dist/collection/components/picker-internal/picker-internal.js +17 -1
  257. package/dist/collection/components/picker-internal/test/keyboard-entry/picker-internal.e2e.js +32 -0
  258. package/dist/collection/components/popover/popover.ios.css +8 -1
  259. package/dist/collection/components/popover/popover.js +8 -4
  260. package/dist/collection/components/popover/popover.md.css +1 -1
  261. package/dist/collection/components/progress-bar/progress-bar.js +1 -1
  262. package/dist/collection/components/radio-group/radio-group.js +1 -1
  263. package/dist/collection/components/radio-group/test/radio-group-events.e2e.js +15 -15
  264. package/dist/collection/components/range/test/label/range.e2e.js +2 -2
  265. package/dist/collection/components/range/test/range-events.e2e.js +2 -2
  266. package/dist/collection/components/refresher/refresher.js +1 -1
  267. package/dist/collection/components/refresher/test/test.utils.js +1 -1
  268. package/dist/collection/components/refresher-content/refresher-content.js +1 -1
  269. package/dist/collection/components/reorder/reorder.js +1 -1
  270. package/dist/collection/components/reorder-group/reorder-group.js +1 -1
  271. package/dist/collection/components/ripple-effect/ripple-effect.js +1 -1
  272. package/dist/collection/components/ripple-effect/test/basic/ripple-effect.e2e.js +2 -2
  273. package/dist/collection/components/router-link/router-link.js +2 -2
  274. package/dist/collection/components/router-outlet/router-outlet.js +1 -1
  275. package/dist/collection/components/row/row.js +1 -1
  276. package/dist/collection/components/searchbar/searchbar.js +4 -4
  277. package/dist/collection/components/segment/segment.js +9 -2
  278. package/dist/collection/components/segment-button/segment-button.js +3 -3
  279. package/dist/collection/components/select/select.js +20 -1
  280. package/dist/collection/components/select/test/disabled/select.e2e.js +1 -1
  281. package/dist/collection/components/select/test/select.spec.js +15 -0
  282. package/dist/collection/components/select-option/select-option.js +1 -1
  283. package/dist/collection/components/select-popover/select-popover.ios.css +10 -0
  284. package/dist/collection/components/select-popover/select-popover.js +1 -1
  285. package/dist/collection/components/select-popover/select-popover.md.css +10 -0
  286. package/dist/collection/components/skeleton-text/skeleton-text.js +2 -2
  287. package/dist/collection/components/spinner/spinner.js +1 -1
  288. package/dist/collection/components/split-pane/split-pane.js +11 -12
  289. package/dist/collection/components/tab/tab.js +2 -2
  290. package/dist/collection/components/tab-bar/tab-bar.js +2 -2
  291. package/dist/collection/components/tab-button/tab-button.js +2 -2
  292. package/dist/collection/components/tabs/tabs.js +1 -1
  293. package/dist/collection/components/text/text.js +2 -2
  294. package/dist/collection/components/textarea/test/textarea-events.e2e.js +4 -4
  295. package/dist/collection/components/thumbnail/thumbnail.js +1 -1
  296. package/dist/collection/components/title/title.js +2 -2
  297. package/dist/collection/components/toast/test/toast.spec.js +12 -0
  298. package/dist/collection/components/toast/toast.js +8 -4
  299. package/dist/collection/components/toolbar/toolbar.js +2 -2
  300. package/dist/collection/utils/hardware-back-button.js +45 -2
  301. package/dist/collection/utils/helpers.js +1 -1
  302. package/dist/collection/utils/overlays.js +82 -17
  303. package/dist/collection/utils/test/hardware-back-button.spec.js +38 -0
  304. package/dist/collection/utils/test/overlays/overlays.e2e.js +33 -0
  305. package/dist/collection/utils/test/overlays/overlays.spec.js +51 -0
  306. package/dist/docs.json +26 -31
  307. package/dist/esm/{animation-dde8cc0d.js → animation-60dbdd13.js} +1 -1
  308. package/dist/esm/{app-globals-52c78291.js → app-globals-5cf6195b.js} +1 -1
  309. package/dist/esm/{button-active-b62776db.js → button-active-47ac8092.js} +1 -1
  310. package/dist/esm/{data-775093f5.js → data-0f3ab200.js} +1 -1
  311. package/dist/esm/{form-controller-548aa79c.js → form-controller-014aa89f.js} +1 -1
  312. package/dist/esm/{framework-delegate-bc1fd82a.js → framework-delegate-fed7fe7c.js} +1 -1
  313. package/dist/esm/{hardware-back-button-b2bc76db.js → hardware-back-button-b410a047.js} +48 -3
  314. package/dist/esm/{helpers-ae653409.js → helpers-c0b9ca37.js} +1 -1
  315. package/dist/esm/{index-a97c95a7.js → index-0b4beb69.js} +4 -4
  316. package/dist/esm/{index-01cb9192.js → index-47b2066d.js} +4 -4
  317. package/dist/esm/{index-27668d5b.js → index-4c30cddd.js} +56 -23
  318. package/dist/esm/{index-82eeb47f.js → index-d64f34ea.js} +1 -1
  319. package/dist/esm/{index-b9e742e5.js → index-eb12ef92.js} +1 -1
  320. package/dist/esm/index.js +11 -11
  321. package/dist/esm/{input-shims-6539ce13.js → input-shims-b90ca55f.js} +2 -2
  322. package/dist/esm/{input.utils-a5a2d164.js → input.utils-6e9b0046.js} +1 -1
  323. package/dist/esm/ion-accordion_2.entry.js +18 -12
  324. package/dist/esm/ion-action-sheet.entry.js +20 -14
  325. package/dist/esm/ion-alert.entry.js +19 -13
  326. package/dist/esm/ion-app_8.entry.js +62 -40
  327. package/dist/esm/ion-avatar_3.entry.js +16 -11
  328. package/dist/esm/ion-back-button.entry.js +9 -7
  329. package/dist/esm/ion-backdrop.entry.js +7 -5
  330. package/dist/esm/ion-breadcrumb_2.entry.js +15 -11
  331. package/dist/esm/ion-button_2.entry.js +11 -8
  332. package/dist/esm/ion-card_5.entry.js +31 -21
  333. package/dist/esm/ion-checkbox.entry.js +8 -6
  334. package/dist/esm/ion-chip.entry.js +8 -6
  335. package/dist/esm/ion-col_3.entry.js +13 -10
  336. package/dist/esm/ion-datetime-button.entry.js +9 -7
  337. package/dist/esm/ion-datetime_3.entry.js +63 -34
  338. package/dist/esm/ion-fab_3.entry.js +17 -13
  339. package/dist/esm/ion-img.entry.js +6 -5
  340. package/dist/esm/ion-infinite-scroll_2.entry.js +13 -10
  341. package/dist/esm/ion-input.entry.js +10 -8
  342. package/dist/esm/ion-item-option_3.entry.js +18 -13
  343. package/dist/esm/ion-item_8.entry.js +53 -33
  344. package/dist/esm/ion-loading.entry.js +17 -11
  345. package/dist/esm/ion-menu_3.entry.js +29 -19
  346. package/dist/esm/ion-modal.entry.js +21 -18
  347. package/dist/esm/ion-nav_2.entry.js +10 -9
  348. package/dist/esm/ion-picker-column-internal.entry.js +10 -8
  349. package/dist/esm/ion-picker-internal.entry.js +23 -5
  350. package/dist/esm/ion-popover.entry.js +20 -14
  351. package/dist/esm/ion-progress-bar.entry.js +8 -6
  352. package/dist/esm/ion-radio_2.entry.js +9 -7
  353. package/dist/esm/ion-range.entry.js +9 -7
  354. package/dist/esm/ion-refresher_2.entry.js +11 -9
  355. package/dist/esm/ion-reorder_2.entry.js +12 -9
  356. package/dist/esm/ion-ripple-effect.entry.js +5 -4
  357. package/dist/esm/ion-route_4.entry.js +7 -6
  358. package/dist/esm/ion-searchbar.entry.js +11 -9
  359. package/dist/esm/ion-segment_2.entry.js +23 -12
  360. package/dist/esm/ion-select_3.entry.js +42 -18
  361. package/dist/esm/ion-spinner.entry.js +5 -4
  362. package/dist/esm/ion-split-pane.entry.js +17 -16
  363. package/dist/esm/ion-tab-bar_2.entry.js +15 -11
  364. package/dist/esm/ion-tab_2.entry.js +10 -8
  365. package/dist/esm/ion-text.entry.js +6 -5
  366. package/dist/esm/ion-textarea.entry.js +10 -8
  367. package/dist/esm/ion-toast.entry.js +17 -11
  368. package/dist/esm/ion-toggle.entry.js +8 -6
  369. package/dist/esm/{ionic-global-8fa0f940.js → ionic-global-ad9a1810.js} +1 -1
  370. package/dist/esm/ionic.js +8 -8
  371. package/dist/esm/{ios.transition-62fd50ab.js → ios.transition-b76c7020.js} +4 -4
  372. package/dist/esm/loader.js +7 -7
  373. package/dist/esm/{md.transition-7e56966a.js → md.transition-564937a7.js} +4 -4
  374. package/dist/esm/{notch-controller-fea7f9c5.js → notch-controller-15d281a4.js} +1 -1
  375. package/dist/esm/{overlays-8414359b.js → overlays-04a9a43f.js} +86 -22
  376. package/dist/esm/{status-tap-129c01cf.js → status-tap-5a95077d.js} +3 -3
  377. package/dist/esm/{swipe-back-18cb49f7.js → swipe-back-fa0ec5cd.js} +1 -1
  378. package/dist/esm-es5/{animation-dde8cc0d.js → animation-60dbdd13.js} +1 -1
  379. package/dist/esm-es5/app-globals-5cf6195b.js +4 -0
  380. package/dist/esm-es5/{button-active-b62776db.js → button-active-47ac8092.js} +1 -1
  381. package/dist/esm-es5/{data-775093f5.js → data-0f3ab200.js} +1 -1
  382. package/dist/esm-es5/{form-controller-548aa79c.js → form-controller-014aa89f.js} +1 -1
  383. package/dist/esm-es5/{framework-delegate-bc1fd82a.js → framework-delegate-fed7fe7c.js} +1 -1
  384. package/dist/esm-es5/hardware-back-button-b410a047.js +4 -0
  385. package/dist/esm-es5/helpers-c0b9ca37.js +4 -0
  386. package/dist/esm-es5/{index-a97c95a7.js → index-0b4beb69.js} +1 -1
  387. package/dist/esm-es5/{index-01cb9192.js → index-47b2066d.js} +1 -1
  388. package/dist/esm-es5/index-4c30cddd.js +5 -0
  389. package/dist/esm-es5/index-d64f34ea.js +4 -0
  390. package/dist/esm-es5/{index-b9e742e5.js → index-eb12ef92.js} +1 -1
  391. package/dist/esm-es5/index.js +1 -1
  392. package/dist/esm-es5/{input-shims-6539ce13.js → input-shims-b90ca55f.js} +1 -1
  393. package/dist/esm-es5/{input.utils-a5a2d164.js → input.utils-6e9b0046.js} +1 -1
  394. package/dist/esm-es5/ion-accordion_2.entry.js +1 -1
  395. package/dist/esm-es5/ion-action-sheet.entry.js +1 -1
  396. package/dist/esm-es5/ion-alert.entry.js +1 -1
  397. package/dist/esm-es5/ion-app_8.entry.js +1 -1
  398. package/dist/esm-es5/ion-avatar_3.entry.js +1 -1
  399. package/dist/esm-es5/ion-back-button.entry.js +1 -1
  400. package/dist/esm-es5/ion-backdrop.entry.js +1 -1
  401. package/dist/esm-es5/ion-breadcrumb_2.entry.js +1 -1
  402. package/dist/esm-es5/ion-button_2.entry.js +1 -1
  403. package/dist/esm-es5/ion-card_5.entry.js +1 -1
  404. package/dist/esm-es5/ion-checkbox.entry.js +1 -1
  405. package/dist/esm-es5/ion-chip.entry.js +1 -1
  406. package/dist/esm-es5/ion-col_3.entry.js +1 -1
  407. package/dist/esm-es5/ion-datetime-button.entry.js +1 -1
  408. package/dist/esm-es5/ion-datetime_3.entry.js +1 -1
  409. package/dist/esm-es5/ion-fab_3.entry.js +1 -1
  410. package/dist/esm-es5/ion-img.entry.js +1 -1
  411. package/dist/esm-es5/ion-infinite-scroll_2.entry.js +1 -1
  412. package/dist/esm-es5/ion-input.entry.js +1 -1
  413. package/dist/esm-es5/ion-item-option_3.entry.js +1 -1
  414. package/dist/esm-es5/ion-item_8.entry.js +1 -1
  415. package/dist/esm-es5/ion-loading.entry.js +1 -1
  416. package/dist/esm-es5/ion-menu_3.entry.js +1 -1
  417. package/dist/esm-es5/ion-modal.entry.js +1 -1
  418. package/dist/esm-es5/ion-nav_2.entry.js +1 -1
  419. package/dist/esm-es5/ion-picker-column-internal.entry.js +1 -1
  420. package/dist/esm-es5/ion-picker-internal.entry.js +1 -1
  421. package/dist/esm-es5/ion-popover.entry.js +1 -1
  422. package/dist/esm-es5/ion-progress-bar.entry.js +1 -1
  423. package/dist/esm-es5/ion-radio_2.entry.js +1 -1
  424. package/dist/esm-es5/ion-range.entry.js +1 -1
  425. package/dist/esm-es5/ion-refresher_2.entry.js +1 -1
  426. package/dist/esm-es5/ion-reorder_2.entry.js +1 -1
  427. package/dist/esm-es5/ion-ripple-effect.entry.js +1 -1
  428. package/dist/esm-es5/ion-route_4.entry.js +1 -1
  429. package/dist/esm-es5/ion-searchbar.entry.js +1 -1
  430. package/dist/esm-es5/ion-segment_2.entry.js +1 -1
  431. package/dist/esm-es5/ion-select_3.entry.js +1 -1
  432. package/dist/esm-es5/ion-spinner.entry.js +1 -1
  433. package/dist/esm-es5/ion-split-pane.entry.js +1 -1
  434. package/dist/esm-es5/ion-tab-bar_2.entry.js +1 -1
  435. package/dist/esm-es5/ion-tab_2.entry.js +1 -1
  436. package/dist/esm-es5/ion-text.entry.js +1 -1
  437. package/dist/esm-es5/ion-textarea.entry.js +1 -1
  438. package/dist/esm-es5/ion-toast.entry.js +1 -1
  439. package/dist/esm-es5/ion-toggle.entry.js +1 -1
  440. package/dist/esm-es5/{ionic-global-8fa0f940.js → ionic-global-ad9a1810.js} +1 -1
  441. package/dist/esm-es5/ionic.js +2 -2
  442. package/dist/esm-es5/{ios.transition-62fd50ab.js → ios.transition-b76c7020.js} +1 -1
  443. package/dist/esm-es5/loader.js +2 -2
  444. package/dist/esm-es5/md.transition-564937a7.js +4 -0
  445. package/dist/esm-es5/{notch-controller-fea7f9c5.js → notch-controller-15d281a4.js} +1 -1
  446. package/dist/esm-es5/overlays-04a9a43f.js +4 -0
  447. package/dist/esm-es5/{status-tap-129c01cf.js → status-tap-5a95077d.js} +1 -1
  448. package/dist/esm-es5/{swipe-back-18cb49f7.js → swipe-back-fa0ec5cd.js} +1 -1
  449. package/dist/ionic/index.esm.js +1 -1
  450. package/dist/ionic/ionic.esm.js +1 -1
  451. package/dist/ionic/ionic.js +1 -1
  452. package/dist/ionic/p-027f3674.entry.js +4 -0
  453. package/dist/ionic/p-0457213c.entry.js +4 -0
  454. package/dist/ionic/p-05d560ec.entry.js +4 -0
  455. package/dist/ionic/p-0b34d3a7.system.js +4 -0
  456. package/dist/ionic/p-0e23c289.system.entry.js +4 -0
  457. package/dist/ionic/p-1131946f.system.entry.js +4 -0
  458. package/dist/ionic/{p-25221a73.js → p-123b4809.js} +1 -1
  459. package/dist/ionic/{p-d2707f9d.system.js → p-1636923f.system.js} +1 -1
  460. package/dist/ionic/p-16a61810.entry.js +4 -0
  461. package/dist/ionic/p-18beebdf.system.entry.js +4 -0
  462. package/dist/ionic/p-1924f2e0.system.entry.js +4 -0
  463. package/dist/ionic/{p-53ec4f1c.system.js → p-1dfc11b3.system.js} +1 -1
  464. package/dist/ionic/p-1f16d040.entry.js +4 -0
  465. package/dist/ionic/p-1f19958f.system.entry.js +4 -0
  466. package/dist/ionic/p-21ca1f1c.js +4 -0
  467. package/dist/ionic/p-2327064c.entry.js +4 -0
  468. package/dist/ionic/{p-7bae84aa.entry.js → p-23c73017.entry.js} +1 -1
  469. package/dist/ionic/p-275705e5.entry.js +4 -0
  470. package/dist/ionic/{p-32b8e50d.system.js → p-2e14c533.system.js} +1 -1
  471. package/dist/ionic/p-2e1f014a.system.entry.js +4 -0
  472. package/dist/ionic/p-3079950e.entry.js +4 -0
  473. package/dist/ionic/{p-03e00f90.js → p-30cd5e7b.js} +1 -1
  474. package/dist/ionic/p-30d77a91.system.js +4 -0
  475. package/dist/ionic/{p-376a6063.js → p-31c495c2.js} +1 -1
  476. package/dist/ionic/p-337ac0f5.entry.js +4 -0
  477. package/dist/ionic/p-3471a7c0.system.entry.js +4 -0
  478. package/dist/ionic/p-3481d54e.system.entry.js +4 -0
  479. package/dist/ionic/{p-cabad15b.system.js → p-37c33319.system.js} +1 -1
  480. package/dist/ionic/p-396083cc.entry.js +4 -0
  481. package/dist/ionic/{p-e814f9c0.entry.js → p-3a7de59c.entry.js} +1 -1
  482. package/dist/ionic/{p-d51674c5.system.js → p-3c6f02cf.system.js} +1 -1
  483. package/dist/ionic/p-3d961d93.entry.js +4 -0
  484. package/dist/ionic/p-3e9ad72a.system.entry.js +4 -0
  485. package/dist/ionic/p-42a9f663.system.entry.js +4 -0
  486. package/dist/ionic/p-43a5edee.entry.js +4 -0
  487. package/dist/ionic/{p-8aa1d0b7.system.js → p-49543c9c.system.js} +1 -1
  488. package/dist/ionic/p-49aba878.js +4 -0
  489. package/dist/ionic/{p-88d5fbd3.js → p-4f777b5e.js} +1 -1
  490. package/dist/ionic/p-4fda5c35.entry.js +4 -0
  491. package/dist/ionic/{p-249633a4.entry.js → p-502780e4.entry.js} +1 -1
  492. package/dist/ionic/{p-436bd99a.entry.js → p-508a4c87.entry.js} +1 -1
  493. package/dist/ionic/p-5928fac9.system.entry.js +4 -0
  494. package/dist/ionic/{p-d5216086.entry.js → p-5b40d967.entry.js} +1 -1
  495. package/dist/ionic/p-5c2ae448.js +4 -0
  496. package/dist/ionic/p-5c580e89.entry.js +4 -0
  497. package/dist/ionic/p-5c6a04bd.entry.js +4 -0
  498. package/dist/ionic/p-5cb5f63d.system.entry.js +4 -0
  499. package/dist/ionic/{p-fd41bd8a.js → p-5d7e32ce.js} +1 -1
  500. package/dist/ionic/p-5e23bea8.system.entry.js +4 -0
  501. package/dist/ionic/{p-ed60d571.entry.js → p-5f169eba.entry.js} +1 -1
  502. package/dist/ionic/{p-13387c28.entry.js → p-601e17b4.entry.js} +1 -1
  503. package/dist/ionic/p-61ba2137.system.js +4 -0
  504. package/dist/ionic/p-64761c90.entry.js +4 -0
  505. package/dist/ionic/{p-c1c57873.system.entry.js → p-64856c3c.system.entry.js} +1 -1
  506. package/dist/ionic/p-6486e393.system.entry.js +4 -0
  507. package/dist/ionic/p-64db1331.entry.js +4 -0
  508. package/dist/ionic/{p-ef3a6b51.system.js → p-6525a8cd.system.js} +1 -1
  509. package/dist/ionic/p-657ccdd6.entry.js +4 -0
  510. package/dist/ionic/p-667e3e2d.entry.js +4 -0
  511. package/dist/ionic/p-6871553b.system.js +4 -0
  512. package/dist/ionic/p-68ba8e77.system.entry.js +4 -0
  513. package/dist/ionic/p-70e34286.system.entry.js +4 -0
  514. package/dist/ionic/p-7173ba59.system.entry.js +4 -0
  515. package/dist/ionic/p-717e2526.system.entry.js +4 -0
  516. package/dist/ionic/p-72fa96bf.system.js +5 -0
  517. package/dist/ionic/{p-87bb3735.system.js → p-7330c044.system.js} +1 -1
  518. package/dist/ionic/{p-ae638cb5.system.js → p-74deb358.system.js} +1 -1
  519. package/dist/ionic/p-7b1ed642.system.entry.js +4 -0
  520. package/dist/ionic/{p-b6f6f00e.entry.js → p-7ce40e7b.entry.js} +1 -1
  521. package/dist/ionic/p-86813176.system.entry.js +4 -0
  522. package/dist/ionic/p-8794fa00.system.entry.js +4 -0
  523. package/dist/ionic/p-88e9052d.entry.js +4 -0
  524. package/dist/ionic/{p-3c33dc30.system.js → p-89ca4c4b.system.js} +1 -1
  525. package/dist/ionic/p-8e651c29.entry.js +4 -0
  526. package/dist/ionic/p-9056778e.system.entry.js +4 -0
  527. package/dist/ionic/p-91cb3f9a.entry.js +4 -0
  528. package/dist/ionic/{p-29d03b3a.js → p-9393a49f.js} +1 -1
  529. package/dist/ionic/{p-3a75d7fd.js → p-94be3ad7.js} +1 -1
  530. package/dist/ionic/p-95d5a097.entry.js +4 -0
  531. package/dist/ionic/p-9cd7ba27.system.js +4 -0
  532. package/dist/ionic/p-9ec7208d.system.js +4 -0
  533. package/dist/ionic/p-a022b684.system.entry.js +4 -0
  534. package/dist/ionic/p-a0b28c69.system.entry.js +4 -0
  535. package/dist/ionic/p-a3df16b9.system.entry.js +4 -0
  536. package/dist/ionic/{p-4180a747.js → p-a3f572a7.js} +1 -1
  537. package/dist/ionic/{p-4a4bbcc5.system.js → p-a5951821.system.js} +2 -2
  538. package/dist/ionic/p-a6e465f5.entry.js +4 -0
  539. package/dist/ionic/{p-bb41c476.system.entry.js → p-a85d9047.system.entry.js} +1 -1
  540. package/dist/ionic/p-a8a56449.entry.js +4 -0
  541. package/dist/ionic/p-aaaa615c.system.entry.js +4 -0
  542. package/dist/ionic/p-abcedc15.system.entry.js +4 -0
  543. package/dist/ionic/{p-0bd51c34.system.js → p-abe101da.system.js} +1 -1
  544. package/dist/ionic/p-ae35294f.system.entry.js +4 -0
  545. package/dist/ionic/p-afd6d696.system.entry.js +4 -0
  546. package/dist/ionic/p-b06ac4a5.system.js +4 -0
  547. package/dist/ionic/p-b0ff8075.entry.js +4 -0
  548. package/dist/ionic/{p-66d633fb.js → p-b253ad7f.js} +1 -1
  549. package/dist/ionic/p-b2595011.system.entry.js +4 -0
  550. package/dist/ionic/p-b5839dc2.js +4 -0
  551. package/dist/ionic/p-b6279412.entry.js +4 -0
  552. package/dist/ionic/p-b8c685a7.system.js +4 -0
  553. package/dist/ionic/p-ba97a133.system.entry.js +4 -0
  554. package/dist/ionic/p-bd4787eb.entry.js +4 -0
  555. package/dist/ionic/p-bdca4784.js +4 -0
  556. package/dist/ionic/p-bf05cbc7.entry.js +4 -0
  557. package/dist/ionic/p-c11bab7e.entry.js +4 -0
  558. package/dist/ionic/p-c1797ec5.system.entry.js +4 -0
  559. package/dist/ionic/{p-36d187af.js → p-c2289cd1.js} +1 -1
  560. package/dist/ionic/p-c308f773.entry.js +4 -0
  561. package/dist/ionic/p-c39cc96d.system.entry.js +4 -0
  562. package/dist/ionic/p-c747f89b.system.entry.js +4 -0
  563. package/dist/ionic/{p-7798c78a.system.js → p-c80c7e90.system.js} +1 -1
  564. package/dist/ionic/{p-013013a3.js → p-c858f685.js} +1 -1
  565. package/dist/ionic/p-c995da88.system.js +4 -0
  566. package/dist/ionic/p-cb9e71e0.entry.js +4 -0
  567. package/dist/ionic/p-cd9a7017.system.entry.js +4 -0
  568. package/dist/ionic/p-cde3ac34.system.entry.js +4 -0
  569. package/dist/ionic/p-ceceac26.js +4 -0
  570. package/dist/ionic/{p-803ad1e3.entry.js → p-d39ab63d.entry.js} +1 -1
  571. package/dist/ionic/{p-43afd001.system.js → p-d4cadd34.system.js} +1 -1
  572. package/dist/ionic/p-db30f71b.entry.js +4 -0
  573. package/dist/ionic/p-dbcba5a2.js +4 -0
  574. package/dist/ionic/{p-1052ef2b.entry.js → p-dcb5711d.entry.js} +1 -1
  575. package/dist/ionic/{p-23ce95e8.js → p-de55ec45.js} +1 -1
  576. package/dist/ionic/p-df504a37.system.js +4 -0
  577. package/dist/ionic/p-e04b9647.system.entry.js +4 -0
  578. package/dist/ionic/{p-38f2c6bb.system.js → p-e2bb92ed.system.js} +1 -1
  579. package/dist/ionic/p-e81bf09e.system.entry.js +4 -0
  580. package/dist/ionic/p-e9f9388e.system.js +4 -0
  581. package/dist/ionic/p-ea25b4c8.system.entry.js +4 -0
  582. package/dist/ionic/p-eb07b88f.entry.js +4 -0
  583. package/dist/ionic/p-ed7a529f.js +5 -0
  584. package/dist/ionic/p-edcada2b.system.entry.js +4 -0
  585. package/dist/ionic/p-f0194418.system.entry.js +4 -0
  586. package/dist/ionic/p-f460c7ae.entry.js +4 -0
  587. package/dist/ionic/p-f53d074d.system.entry.js +4 -0
  588. package/dist/ionic/{p-18cae04f.js → p-f7dce541.js} +1 -1
  589. package/dist/ionic/p-f840d817.entry.js +4 -0
  590. package/dist/ionic/p-f8c96502.system.entry.js +4 -0
  591. package/dist/ionic/p-fb9f8495.system.entry.js +4 -0
  592. package/dist/ionic/p-fd2aa50c.js +4 -0
  593. package/dist/ionic/p-fd8ced99.system.js +4 -0
  594. package/dist/types/components/action-sheet/action-sheet-interface.d.ts +2 -2
  595. package/dist/types/components/action-sheet/action-sheet.d.ts +4 -0
  596. package/dist/types/components/alert/alert-interface.d.ts +2 -2
  597. package/dist/types/components/alert/alert.d.ts +4 -0
  598. package/dist/types/components/item/item.d.ts +1 -0
  599. package/dist/types/components/loading/loading.d.ts +4 -0
  600. package/dist/types/components/modal/modal.d.ts +4 -0
  601. package/dist/types/components/picker/picker.d.ts +4 -0
  602. package/dist/types/components/popover/popover.d.ts +4 -0
  603. package/dist/types/components/toast/toast-interface.d.ts +2 -2
  604. package/dist/types/components/toast/toast.d.ts +4 -0
  605. package/dist/types/components.d.ts +7 -7
  606. package/dist/types/interface.d.ts +1 -1
  607. package/dist/types/utils/browser/index.d.ts +22 -1
  608. package/dist/types/utils/config.d.ts +7 -0
  609. package/dist/types/utils/hardware-back-button.d.ts +13 -0
  610. package/hydrate/index.d.ts +1 -1
  611. package/hydrate/index.js +794 -373
  612. package/package.json +9 -9
  613. package/dist/collection/components/accordion/test/accordion.e2e.js +0 -39
  614. package/dist/esm-es5/app-globals-52c78291.js +0 -4
  615. package/dist/esm-es5/hardware-back-button-b2bc76db.js +0 -4
  616. package/dist/esm-es5/helpers-ae653409.js +0 -4
  617. package/dist/esm-es5/index-27668d5b.js +0 -5
  618. package/dist/esm-es5/index-82eeb47f.js +0 -4
  619. package/dist/esm-es5/md.transition-7e56966a.js +0 -4
  620. package/dist/esm-es5/overlays-8414359b.js +0 -4
  621. package/dist/ionic/p-005e0ad0.js +0 -4
  622. package/dist/ionic/p-01438d78.entry.js +0 -4
  623. package/dist/ionic/p-02e530f5.system.js +0 -4
  624. package/dist/ionic/p-0abedd22.entry.js +0 -4
  625. package/dist/ionic/p-0d2b6901.entry.js +0 -4
  626. package/dist/ionic/p-127ff448.entry.js +0 -4
  627. package/dist/ionic/p-1a0bf247.system.entry.js +0 -4
  628. package/dist/ionic/p-1a5f0313.system.js +0 -4
  629. package/dist/ionic/p-1cca10d6.system.js +0 -4
  630. package/dist/ionic/p-1f7fc88d.entry.js +0 -4
  631. package/dist/ionic/p-1ffb40d0.system.entry.js +0 -4
  632. package/dist/ionic/p-23a9d086.js +0 -4
  633. package/dist/ionic/p-25553eba.system.entry.js +0 -4
  634. package/dist/ionic/p-2a496995.js +0 -4
  635. package/dist/ionic/p-3197dbf7.entry.js +0 -4
  636. package/dist/ionic/p-32ad210f.system.js +0 -4
  637. package/dist/ionic/p-35e1a80f.system.entry.js +0 -4
  638. package/dist/ionic/p-38c337e7.system.js +0 -4
  639. package/dist/ionic/p-3b83e483.system.entry.js +0 -4
  640. package/dist/ionic/p-3bcbbf43.system.entry.js +0 -4
  641. package/dist/ionic/p-3f0afc6f.entry.js +0 -4
  642. package/dist/ionic/p-40f68333.system.js +0 -4
  643. package/dist/ionic/p-41040a92.system.entry.js +0 -4
  644. package/dist/ionic/p-41aa2662.entry.js +0 -4
  645. package/dist/ionic/p-48f7e8cc.system.entry.js +0 -4
  646. package/dist/ionic/p-4b3623da.js +0 -4
  647. package/dist/ionic/p-4cd6a04c.system.entry.js +0 -4
  648. package/dist/ionic/p-525b6ac4.system.entry.js +0 -4
  649. package/dist/ionic/p-54c92c77.entry.js +0 -4
  650. package/dist/ionic/p-5a85d71d.entry.js +0 -4
  651. package/dist/ionic/p-5aecd304.system.entry.js +0 -4
  652. package/dist/ionic/p-5c2da581.system.entry.js +0 -4
  653. package/dist/ionic/p-619fafe3.system.entry.js +0 -4
  654. package/dist/ionic/p-61bf9f6f.system.entry.js +0 -4
  655. package/dist/ionic/p-677cb2f7.js +0 -4
  656. package/dist/ionic/p-67c3a2a8.system.js +0 -5
  657. package/dist/ionic/p-688a36c7.entry.js +0 -4
  658. package/dist/ionic/p-6a257379.entry.js +0 -4
  659. package/dist/ionic/p-6b9eee40.system.entry.js +0 -4
  660. package/dist/ionic/p-6ba863b1.system.entry.js +0 -4
  661. package/dist/ionic/p-6e165986.system.entry.js +0 -4
  662. package/dist/ionic/p-7510e462.entry.js +0 -4
  663. package/dist/ionic/p-76b6b42e.system.entry.js +0 -4
  664. package/dist/ionic/p-770f5b43.system.js +0 -4
  665. package/dist/ionic/p-7751def0.system.entry.js +0 -4
  666. package/dist/ionic/p-788942c8.system.entry.js +0 -4
  667. package/dist/ionic/p-790220fd.system.js +0 -4
  668. package/dist/ionic/p-7de774dd.entry.js +0 -4
  669. package/dist/ionic/p-8084e9cb.entry.js +0 -4
  670. package/dist/ionic/p-80ddd0c1.entry.js +0 -4
  671. package/dist/ionic/p-85e04029.entry.js +0 -4
  672. package/dist/ionic/p-87e10168.system.entry.js +0 -4
  673. package/dist/ionic/p-888db766.system.js +0 -4
  674. package/dist/ionic/p-88d99112.system.entry.js +0 -4
  675. package/dist/ionic/p-89c28901.system.entry.js +0 -4
  676. package/dist/ionic/p-928e945d.system.entry.js +0 -4
  677. package/dist/ionic/p-978c6799.system.entry.js +0 -4
  678. package/dist/ionic/p-9a0b9b64.entry.js +0 -4
  679. package/dist/ionic/p-a2d75455.entry.js +0 -4
  680. package/dist/ionic/p-a706cf11.system.entry.js +0 -4
  681. package/dist/ionic/p-a78d17e2.entry.js +0 -4
  682. package/dist/ionic/p-aca77953.entry.js +0 -4
  683. package/dist/ionic/p-b09c8228.entry.js +0 -4
  684. package/dist/ionic/p-b2205a7c.system.entry.js +0 -4
  685. package/dist/ionic/p-b43cf55f.entry.js +0 -4
  686. package/dist/ionic/p-bc59962f.system.entry.js +0 -4
  687. package/dist/ionic/p-be04fcd8.system.entry.js +0 -4
  688. package/dist/ionic/p-bf595ef8.system.entry.js +0 -4
  689. package/dist/ionic/p-bf80f9d1.entry.js +0 -4
  690. package/dist/ionic/p-c0f62b42.system.js +0 -4
  691. package/dist/ionic/p-c16d9f2c.system.entry.js +0 -4
  692. package/dist/ionic/p-c48a9ef3.system.entry.js +0 -4
  693. package/dist/ionic/p-c9219299.entry.js +0 -4
  694. package/dist/ionic/p-cae77add.system.entry.js +0 -4
  695. package/dist/ionic/p-cd6bb7f5.system.entry.js +0 -4
  696. package/dist/ionic/p-cdce5ba3.system.entry.js +0 -4
  697. package/dist/ionic/p-d6129c6e.js +0 -5
  698. package/dist/ionic/p-d6beb1c9.system.entry.js +0 -4
  699. package/dist/ionic/p-db798370.system.entry.js +0 -4
  700. package/dist/ionic/p-dc1d883c.system.entry.js +0 -4
  701. package/dist/ionic/p-dd9dff11.entry.js +0 -4
  702. package/dist/ionic/p-ddbb2d5b.system.js +0 -4
  703. package/dist/ionic/p-de6f8b28.system.js +0 -4
  704. package/dist/ionic/p-df62accd.entry.js +0 -4
  705. package/dist/ionic/p-e1e05489.system.entry.js +0 -4
  706. package/dist/ionic/p-e3ff3cde.system.entry.js +0 -4
  707. package/dist/ionic/p-e8294cc1.entry.js +0 -4
  708. package/dist/ionic/p-e87564bc.entry.js +0 -4
  709. package/dist/ionic/p-ea7f77e7.entry.js +0 -4
  710. package/dist/ionic/p-eb210b21.system.entry.js +0 -4
  711. package/dist/ionic/p-eb80ca40.entry.js +0 -4
  712. package/dist/ionic/p-eba17ff5.system.entry.js +0 -4
  713. package/dist/ionic/p-eef72e06.js +0 -4
  714. package/dist/ionic/p-efcc4b66.entry.js +0 -4
  715. package/dist/ionic/p-f08d8865.js +0 -4
  716. package/dist/ionic/p-f3478ed6.system.entry.js +0 -4
  717. package/dist/ionic/p-f4bf2448.entry.js +0 -4
  718. package/dist/ionic/p-f4e37ba7.entry.js +0 -4
  719. package/dist/ionic/p-f56d53bd.entry.js +0 -4
  720. package/dist/ionic/p-f8564a9b.system.entry.js +0 -4
  721. package/dist/ionic/p-f865bc9a.entry.js +0 -4
  722. package/dist/ionic/p-fd1a0431.js +0 -4
@@ -5,7 +5,7 @@ import { Host, h } from "@stencil/core";
5
5
  import { getIonMode } from "../../global/ionic-global";
6
6
  export class Thumbnail {
7
7
  render() {
8
- return (h(Host, { class: getIonMode(this) }, h("slot", null)));
8
+ return (h(Host, { key: '2b3d5139161f4b9075dce537c14b4087986b37c4', class: getIonMode(this) }, h("slot", { key: '3c4838c43e1230f9413a3cb66584417fd11382b2' })));
9
9
  }
10
10
  static get is() { return "ion-thumbnail"; }
11
11
  static get encapsulation() { return "shadow"; }
@@ -27,11 +27,11 @@ export class ToolbarTitle {
27
27
  render() {
28
28
  const mode = getIonMode(this);
29
29
  const size = this.getSize();
30
- return (h(Host, { class: createColorClasses(this.color, {
30
+ return (h(Host, { key: 'b68a272a33ec81d282629a569676f64d3215a0c7', class: createColorClasses(this.color, {
31
31
  [mode]: true,
32
32
  [`title-${size}`]: true,
33
33
  'title-rtl': document.dir === 'rtl',
34
- }) }, h("div", { class: "toolbar-title" }, h("slot", null))));
34
+ }) }, h("div", { key: '9069816a14e6e358695c5bd465787cf297c761bc', class: "toolbar-title" }, h("slot", { key: '8894bd04f2292b54050ee864abb5396deadf9874' }))));
35
35
  }
36
36
  static get is() { return "ion-title"; }
37
37
  static get encapsulation() { return "shadow"; }
@@ -80,6 +80,18 @@ describe('toast: a11y smoke test', () => {
80
80
  });
81
81
  });
82
82
  describe('toast: duration config', () => {
83
+ afterEach(() => {
84
+ /**
85
+ * Important: Reset the config
86
+ * after each test as it is not
87
+ * automatically reset.
88
+ * Otherwise, toasts in other tests
89
+ * will take on any toastDuration value
90
+ * set and timeouts will potentially run
91
+ * after tests are finished.
92
+ */
93
+ config.reset({});
94
+ });
83
95
  it('should have duration set to 0', async () => {
84
96
  const page = await newSpecPage({
85
97
  components: [Toast],
@@ -217,6 +217,10 @@ export class Toast {
217
217
  * This can be useful in a button handler for determining which button was
218
218
  * clicked to dismiss the toast.
219
219
  * Some examples include: ``"cancel"`, `"destructive"`, "selected"`, and `"backdrop"`.
220
+ *
221
+ * This is a no-op if the overlay has not been presented yet. If you want
222
+ * to remove an overlay from the DOM that was never presented, use the
223
+ * [remove](https://developer.mozilla.org/en-US/docs/Web/API/Element/remove) method.
220
224
  */
221
225
  async dismiss(data, role) {
222
226
  var _a, _b;
@@ -384,9 +388,9 @@ export class Toast {
384
388
  if (layout === 'stacked' && startButtons.length > 0 && endButtons.length > 0) {
385
389
  printIonWarning('This toast is using start and end buttons with the stacked toast layout. We recommend following the best practice of using either start or end buttons with the stacked toast layout.', el);
386
390
  }
387
- return (h(Host, Object.assign({ tabindex: "-1" }, this.htmlAttributes, { style: {
391
+ return (h(Host, Object.assign({ key: 'c8d7e7d2baa01d3ed5d65a845bc61acf087c0b18', tabindex: "-1" }, this.htmlAttributes, { style: {
388
392
  zIndex: `${60000 + this.overlayIndex}`,
389
- }, class: createColorClasses(this.color, Object.assign(Object.assign({ [mode]: true }, getClassMap(this.cssClass)), { 'overlay-hidden': true, 'toast-translucent': this.translucent })), onIonToastWillDismiss: this.dispatchCancelHandler }), h("div", { class: wrapperClass }, h("div", { class: "toast-container", part: "container" }, this.renderButtons(startButtons, 'start'), this.icon !== undefined && (h("ion-icon", { class: "toast-icon", part: "icon", icon: this.icon, lazy: false, "aria-hidden": "true" })), h("div", { class: "toast-content", role: "status", "aria-atomic": "true", "aria-live": "polite" }, !revealContentToScreenReader && header !== undefined && this.renderHeader('oldHeader', 'true'), !revealContentToScreenReader && message !== undefined && this.renderToastMessage('oldMessage', 'true'), revealContentToScreenReader && header !== undefined && this.renderHeader('header'), revealContentToScreenReader && message !== undefined && this.renderToastMessage('header')), this.renderButtons(endButtons, 'end')))));
393
+ }, class: createColorClasses(this.color, Object.assign(Object.assign({ [mode]: true }, getClassMap(this.cssClass)), { 'overlay-hidden': true, 'toast-translucent': this.translucent })), onIonToastWillDismiss: this.dispatchCancelHandler }), h("div", { key: '27c0feeb89c4efb47c42623a4b036ed84338ed10', class: wrapperClass }, h("div", { key: '41d5a3069f92e4a6acef2793fa4e236cdbdaae88', class: "toast-container", part: "container" }, this.renderButtons(startButtons, 'start'), this.icon !== undefined && (h("ion-icon", { class: "toast-icon", part: "icon", icon: this.icon, lazy: false, "aria-hidden": "true" })), h("div", { key: '176f497bc990ef2ecc14c7fa90dd3a54a912030a', class: "toast-content", role: "status", "aria-atomic": "true", "aria-live": "polite" }, !revealContentToScreenReader && header !== undefined && this.renderHeader('oldHeader', 'true'), !revealContentToScreenReader && message !== undefined && this.renderToastMessage('oldMessage', 'true'), revealContentToScreenReader && header !== undefined && this.renderHeader('header'), revealContentToScreenReader && message !== undefined && this.renderToastMessage('header')), this.renderButtons(endButtons, 'end')))));
390
394
  }
391
395
  static get is() { return "ion-toast"; }
392
396
  static get encapsulation() { return "shadow"; }
@@ -1032,7 +1036,7 @@ export class Toast {
1032
1036
  }, {
1033
1037
  "name": "role",
1034
1038
  "type": "string | undefined",
1035
- "docs": "The role of the element that is dismissing the toast.\nThis can be useful in a button handler for determining which button was\nclicked to dismiss the toast.\nSome examples include: ``\"cancel\"`, `\"destructive\"`, \"selected\"`, and `\"backdrop\"`."
1039
+ "docs": "The role of the element that is dismissing the toast.\nThis can be useful in a button handler for determining which button was\nclicked to dismiss the toast.\nSome examples include: ``\"cancel\"`, `\"destructive\"`, \"selected\"`, and `\"backdrop\"`.\n\nThis is a no-op if the overlay has not been presented yet. If you want\nto remove an overlay from the DOM that was never presented, use the\n[remove](https://developer.mozilla.org/en-US/docs/Web/API/Element/remove) method."
1036
1040
  }],
1037
1041
  "references": {
1038
1042
  "Promise": {
@@ -1054,7 +1058,7 @@ export class Toast {
1054
1058
  "text": "data Any data to emit in the dismiss events."
1055
1059
  }, {
1056
1060
  "name": "param",
1057
- "text": "role The role of the element that is dismissing the toast.\nThis can be useful in a button handler for determining which button was\nclicked to dismiss the toast.\nSome examples include: ``\"cancel\"`, `\"destructive\"`, \"selected\"`, and `\"backdrop\"`."
1061
+ "text": "role The role of the element that is dismissing the toast.\nThis can be useful in a button handler for determining which button was\nclicked to dismiss the toast.\nSome examples include: ``\"cancel\"`, `\"destructive\"`, \"selected\"`, and `\"backdrop\"`.\n\nThis is a no-op if the overlay has not been presented yet. If you want\nto remove an overlay from the DOM that was never presented, use the\n[remove](https://developer.mozilla.org/en-US/docs/Web/API/Element/remove) method."
1058
1062
  }]
1059
1063
  }
1060
1064
  },
@@ -62,10 +62,10 @@ export class Toolbar {
62
62
  this.childrenStyles.forEach((value) => {
63
63
  Object.assign(childStyles, value);
64
64
  });
65
- return (h(Host, { class: Object.assign(Object.assign({}, childStyles), createColorClasses(this.color, {
65
+ return (h(Host, { key: 'afac0f08f3981483c072984ce047df5dc9cc1e99', class: Object.assign(Object.assign({}, childStyles), createColorClasses(this.color, {
66
66
  [mode]: true,
67
67
  'in-toolbar': hostContext('ion-toolbar', this.el),
68
- })) }, h("div", { class: "toolbar-background" }), h("div", { class: "toolbar-container" }, h("slot", { name: "start" }), h("slot", { name: "secondary" }), h("div", { class: "toolbar-content" }, h("slot", null)), h("slot", { name: "primary" }), h("slot", { name: "end" }))));
68
+ })) }, h("div", { key: '30d4f1d0ec01cc646398301b5f7d469391eb35d2', class: "toolbar-background" }), h("div", { key: '175d1f283e670b57a9bf8fd2a8c5e7d0da749aa8', class: "toolbar-container" }, h("slot", { key: '4853b18092737b32b5995457536fa5a7fc2816ef', name: "start" }), h("slot", { key: '6eb4921200aad02d7977d134edad6cff2aad91ad', name: "secondary" }), h("div", { key: '024e0339c74c4b9a886d49e96723243719643dc2', class: "toolbar-content" }, h("slot", { key: 'b6452c84692fedd6efe33ac67907d01253b76f8f' })), h("slot", { key: '636e56eeaa318ce45a9c3854a30b8eb2819a33e0', name: "primary" }), h("slot", { key: 'a45c19b93dca3719d75bd4d99acc49de87137a7d', name: "end" }))));
69
69
  }
70
70
  static get is() { return "ion-toolbar"; }
71
71
  static get encapsulation() { return "shadow"; }
@@ -1,6 +1,21 @@
1
1
  /*!
2
2
  * (C) Ionic http://ionicframework.com - MIT License
3
3
  */
4
+ import { win } from "./browser/index";
5
+ import { config } from "../global/config";
6
+ /**
7
+ * CloseWatcher is a newer API that lets
8
+ * use detect the hardware back button event
9
+ * in a web browser: https://caniuse.com/?search=closewatcher
10
+ * However, not every browser supports it yet.
11
+ *
12
+ * This needs to be a function so that we can
13
+ * check the config once it has been set.
14
+ * Otherwise, this code would be evaluated the
15
+ * moment this file is evaluated which could be
16
+ * before the config is set.
17
+ */
18
+ export const shoudUseCloseWatcher = () => config.get('experimentalCloseWatcher', false) && win !== undefined && 'CloseWatcher' in win;
4
19
  /**
5
20
  * When hardwareBackButton: false in config,
6
21
  * we need to make sure we also block the default
@@ -17,7 +32,7 @@ export const blockHardwareBackButton = () => {
17
32
  export const startHardwareBackButton = () => {
18
33
  const doc = document;
19
34
  let busy = false;
20
- doc.addEventListener('backbutton', () => {
35
+ const backButtonCallback = () => {
21
36
  if (busy) {
22
37
  return;
23
38
  }
@@ -63,7 +78,35 @@ export const startHardwareBackButton = () => {
63
78
  }
64
79
  };
65
80
  processHandlers();
66
- });
81
+ };
82
+ /**
83
+ * If the CloseWatcher is defined then
84
+ * we don't want to also listen for the native
85
+ * backbutton event otherwise we may get duplicate
86
+ * events firing.
87
+ */
88
+ if (shoudUseCloseWatcher()) {
89
+ let watcher;
90
+ const configureWatcher = () => {
91
+ watcher === null || watcher === void 0 ? void 0 : watcher.destroy();
92
+ watcher = new win.CloseWatcher();
93
+ /**
94
+ * Once a close request happens
95
+ * the watcher gets destroyed.
96
+ * As a result, we need to re-configure
97
+ * the watcher so we can respond to other
98
+ * close requests.
99
+ */
100
+ watcher.onclose = () => {
101
+ backButtonCallback();
102
+ configureWatcher();
103
+ };
104
+ };
105
+ configureWatcher();
106
+ }
107
+ else {
108
+ doc.addEventListener('backbutton', backButtonCallback);
109
+ }
67
110
  };
68
111
  export const OVERLAY_BACK_BUTTON_PRIORITY = 100;
69
112
  export const MENU_BACK_BUTTON_PRIORITY = 99; // 1 less than overlay priority since menu is displayed behind overlays
@@ -34,7 +34,7 @@ const transitionEnd = (el, expectedDuration = 0, callback) => {
34
34
  el.addEventListener('transitionend', onTransitionEnd, opts);
35
35
  animationTimeout = setTimeout(onTransitionEnd, expectedDuration + ANIMATION_FALLBACK_TIMEOUT);
36
36
  unRegTrans = () => {
37
- if (animationTimeout) {
37
+ if (animationTimeout !== undefined) {
38
38
  clearTimeout(animationTimeout);
39
39
  animationTimeout = undefined;
40
40
  }
@@ -2,6 +2,7 @@
2
2
  * (C) Ionic http://ionicframework.com - MIT License
3
3
  */
4
4
  import { doc } from "./browser/index";
5
+ import { shoudUseCloseWatcher } from "./hardware-back-button";
5
6
  import { config } from "../global/config";
6
7
  import { getIonMode } from "../global/ionic-global";
7
8
  import { CoreDelegate } from "./framework-delegate";
@@ -296,19 +297,38 @@ const connectListeners = (doc) => {
296
297
  const lastOverlay = getPresentedOverlay(doc);
297
298
  if (lastOverlay === null || lastOverlay === void 0 ? void 0 : lastOverlay.backdropDismiss) {
298
299
  ev.detail.register(OVERLAY_BACK_BUTTON_PRIORITY, () => {
299
- return lastOverlay.dismiss(undefined, BACKDROP);
300
+ /**
301
+ * Do not return this promise otherwise
302
+ * the hardware back button utility will
303
+ * be blocked until the overlay dismisses.
304
+ * This is important for a modal with canDismiss.
305
+ * If the application presents a confirmation alert
306
+ * in the "canDismiss" callback, then it will be impossible
307
+ * to use the hardware back button to dismiss the alert
308
+ * dialog because the hardware back button utility
309
+ * is blocked on waiting for the modal to dismiss.
310
+ */
311
+ lastOverlay.dismiss(undefined, BACKDROP);
300
312
  });
301
313
  }
302
314
  });
303
- // handle ESC to close overlay
304
- doc.addEventListener('keydown', (ev) => {
305
- if (ev.key === 'Escape') {
306
- const lastOverlay = getPresentedOverlay(doc);
307
- if (lastOverlay === null || lastOverlay === void 0 ? void 0 : lastOverlay.backdropDismiss) {
308
- lastOverlay.dismiss(undefined, BACKDROP);
315
+ /**
316
+ * Handle ESC to close overlay.
317
+ * CloseWatcher also handles pressing the Esc
318
+ * key, so if a browser supports CloseWatcher then
319
+ * this behavior will be handled via the ionBackButton
320
+ * event.
321
+ */
322
+ if (!shoudUseCloseWatcher()) {
323
+ doc.addEventListener('keydown', (ev) => {
324
+ if (ev.key === 'Escape') {
325
+ const lastOverlay = getPresentedOverlay(doc);
326
+ if (lastOverlay === null || lastOverlay === void 0 ? void 0 : lastOverlay.backdropDismiss) {
327
+ lastOverlay.dismiss(undefined, BACKDROP);
328
+ }
309
329
  }
310
- }
311
- });
330
+ });
331
+ }
312
332
  }
313
333
  };
314
334
  export const dismissOverlay = (doc, data, role, overlayTag, id) => {
@@ -389,6 +409,15 @@ export const present = async (overlay, name, iosEnterAnimation, mdEnterAnimation
389
409
  return;
390
410
  }
391
411
  setRootAriaHidden(true);
412
+ /**
413
+ * Hide all other overlays from screen readers so only this one
414
+ * can be read. Note that presenting an overlay always makes
415
+ * it the topmost one.
416
+ */
417
+ if (doc !== undefined) {
418
+ const presentedOverlays = getPresentedOverlays(doc);
419
+ presentedOverlays.forEach((o) => o.setAttribute('aria-hidden', 'true'));
420
+ }
392
421
  overlay.presented = true;
393
422
  overlay.willPresent.emit();
394
423
  (_a = overlay.willPresentShorthand) === null || _a === void 0 ? void 0 : _a.emit();
@@ -411,7 +440,7 @@ export const present = async (overlay, name, iosEnterAnimation, mdEnterAnimation
411
440
  * from returning focus as a result.
412
441
  */
413
442
  if (overlay.el.tagName !== 'ION-TOAST') {
414
- focusPreviousElementOnDismissIfNeeded(overlay.el);
443
+ restoreElementFocus(overlay.el);
415
444
  }
416
445
  /**
417
446
  * If the focused element is already
@@ -422,6 +451,14 @@ export const present = async (overlay, name, iosEnterAnimation, mdEnterAnimation
422
451
  if (overlay.keyboardClose && (document.activeElement === null || !overlay.el.contains(document.activeElement))) {
423
452
  overlay.el.focus();
424
453
  }
454
+ /**
455
+ * If this overlay was previously dismissed without being
456
+ * the topmost one (such as by manually calling dismiss()),
457
+ * it would still have aria-hidden on being presented again.
458
+ * Removing it here ensures the overlay is visible to screen
459
+ * readers.
460
+ */
461
+ overlay.el.removeAttribute('aria-hidden');
425
462
  };
426
463
  /**
427
464
  * When an overlay component is dismissed,
@@ -433,7 +470,7 @@ export const present = async (overlay, name, iosEnterAnimation, mdEnterAnimation
433
470
  * to where they were before they
434
471
  * opened the overlay.
435
472
  */
436
- const focusPreviousElementOnDismissIfNeeded = async (overlayEl) => {
473
+ const restoreElementFocus = async (overlayEl) => {
437
474
  let previousElement = document.activeElement;
438
475
  if (!previousElement) {
439
476
  return;
@@ -445,18 +482,35 @@ const focusPreviousElementOnDismissIfNeeded = async (overlayEl) => {
445
482
  }
446
483
  await overlayEl.onDidDismiss();
447
484
  /**
448
- * If the user has already removed focus
449
- * from the overlay (For example, focusing
450
- * a text box after tapping a button in an
451
- * action sheet) then don't restore focus
452
- * to previous element
485
+ * After onDidDismiss, the overlay loses focus
486
+ * because it is removed from the document
487
+ *
488
+ * > An element will also lose focus [...]
489
+ * > if the element is removed from the document)
490
+ *
491
+ * https://developer.mozilla.org/en-US/docs/Web/API/Element/blur_event
492
+ *
493
+ * Additionally, `document.activeElement` returns:
494
+ *
495
+ * > The Element which currently has focus,
496
+ * > `<body>` or null if there is
497
+ * > no focused element.
498
+ *
499
+ * https://developer.mozilla.org/en-US/docs/Web/API/Document/activeElement#value
500
+ *
501
+ * However, if the user has already focused
502
+ * an element sometime between onWillDismiss
503
+ * and onDidDismiss (for example, focusing a
504
+ * text box after tapping a button in an
505
+ * action sheet) then don't restore focus to
506
+ * previous element
453
507
  */
454
508
  if (document.activeElement === null || document.activeElement === document.body) {
455
509
  previousElement.focus();
456
510
  }
457
511
  };
458
512
  export const dismiss = async (overlay, data, role, name, iosLeaveAnimation, mdLeaveAnimation, opts) => {
459
- var _a, _b;
513
+ var _a, _b, _c;
460
514
  if (!overlay.presented) {
461
515
  return false;
462
516
  }
@@ -483,6 +537,10 @@ export const dismiss = async (overlay, data, role, name, iosLeaveAnimation, mdLe
483
537
  }
484
538
  overlay.didDismiss.emit({ data, role });
485
539
  (_b = overlay.didDismissShorthand) === null || _b === void 0 ? void 0 : _b.emit({ data, role });
540
+ // Get a reference to all animations currently assigned to this overlay
541
+ // Then tear them down to return the overlay to its initial visual state
542
+ const animations = activeAnimations.get(overlay) || [];
543
+ animations.forEach((ani) => ani.destroy());
486
544
  activeAnimations.delete(overlay);
487
545
  /**
488
546
  * Make overlay hidden again in case it is being reused.
@@ -503,6 +561,13 @@ export const dismiss = async (overlay, data, role, name, iosLeaveAnimation, mdLe
503
561
  console.error(err);
504
562
  }
505
563
  overlay.el.remove();
564
+ /**
565
+ * If there are other overlays presented, unhide the new
566
+ * topmost one from screen readers.
567
+ */
568
+ if (doc !== undefined) {
569
+ (_c = getPresentedOverlay(doc)) === null || _c === void 0 ? void 0 : _c.removeAttribute('aria-hidden');
570
+ }
506
571
  return true;
507
572
  };
508
573
  const getAppRoot = (doc) => {
@@ -2,6 +2,8 @@
2
2
  * (C) Ionic http://ionicframework.com - MIT License
3
3
  */
4
4
  import { startHardwareBackButton } from "../hardware-back-button";
5
+ import { config } from "../../global/config";
6
+ import { win } from "../browser/index";
5
7
  describe('Hardware Back Button', () => {
6
8
  beforeEach(() => startHardwareBackButton());
7
9
  it('should call handler', () => {
@@ -47,6 +49,42 @@ describe('Hardware Back Button', () => {
47
49
  expect(cbSpyTwo).toHaveBeenCalled();
48
50
  });
49
51
  });
52
+ describe('Experimental Close Watcher', () => {
53
+ test('should not use the Close Watcher API when available', () => {
54
+ const mockAPI = mockCloseWatcher();
55
+ config.reset({ experimentalCloseWatcher: false });
56
+ startHardwareBackButton();
57
+ expect(mockAPI.mock.calls).toHaveLength(0);
58
+ });
59
+ test('should use the Close Watcher API when available', () => {
60
+ const mockAPI = mockCloseWatcher();
61
+ config.reset({ experimentalCloseWatcher: true });
62
+ startHardwareBackButton();
63
+ expect(mockAPI.mock.calls).toHaveLength(1);
64
+ });
65
+ test('Close Watcher should dispatch ionBackButton events', () => {
66
+ const mockAPI = mockCloseWatcher();
67
+ config.reset({ experimentalCloseWatcher: true });
68
+ startHardwareBackButton();
69
+ const cbSpy = jest.fn();
70
+ document.addEventListener('ionBackButton', cbSpy);
71
+ // Call onclose on Ionic's instance of CloseWatcher
72
+ mockAPI.getMockImplementation()().onclose();
73
+ expect(cbSpy).toHaveBeenCalled();
74
+ });
75
+ });
76
+ const mockCloseWatcher = () => {
77
+ const mockCloseWatcher = jest.fn();
78
+ mockCloseWatcher.mockReturnValue({
79
+ requestClose: () => null,
80
+ close: () => null,
81
+ destroy: () => null,
82
+ oncancel: () => null,
83
+ onclose: () => null,
84
+ });
85
+ win.CloseWatcher = mockCloseWatcher;
86
+ return mockCloseWatcher;
87
+ };
50
88
  const dispatchBackButtonEvent = () => {
51
89
  const ev = new Event('backbutton');
52
90
  document.dispatchEvent(ev);
@@ -175,5 +175,38 @@ configs({ modes: ['ios'], directions: ['ltr'] }).forEach(({ title, config }) =>
175
175
  await modalInputOne.click();
176
176
  await expect(modalInputOne).toBeFocused();
177
177
  });
178
+ test('should not return focus to another element if focus already manually returned', async ({ page, skip, }, testInfo) => {
179
+ skip.browser('webkit', 'WebKit does not consider buttons to be focusable, so this test always passes since the input is the only focusable element.');
180
+ testInfo.annotations.push({
181
+ type: 'issue',
182
+ description: 'https://github.com/ionic-team/ionic-framework/issues/28849',
183
+ });
184
+ await page.setContent(`
185
+ <button id="open-action-sheet">open</button>
186
+ <ion-action-sheet trigger="open-action-sheet"></ion-action-sheet>
187
+ <input id="test-input" />
188
+
189
+ <script>
190
+ const actionSheet = document.querySelector('ion-action-sheet');
191
+
192
+ actionSheet.addEventListener('ionActionSheetWillDismiss', () => {
193
+ requestAnimationFrame(() => {
194
+ document.querySelector('#test-input').focus();
195
+ });
196
+ });
197
+ </script>
198
+ `, config);
199
+ const ionActionSheetDidPresent = await page.spyOnEvent('ionActionSheetDidPresent');
200
+ const actionSheet = page.locator('ion-action-sheet');
201
+ const input = page.locator('#test-input');
202
+ const trigger = page.locator('#open-action-sheet');
203
+ // present action sheet
204
+ await trigger.click();
205
+ await ionActionSheetDidPresent.next();
206
+ // dismiss action sheet
207
+ await actionSheet.evaluate((el) => el.dismiss());
208
+ // verify focus is in correct location
209
+ await expect(input).toBeFocused();
210
+ });
178
211
  });
179
212
  });
@@ -100,3 +100,54 @@ describe('setRootAriaHidden()', () => {
100
100
  expect(routerOutlet.hasAttribute('aria-hidden')).toEqual(false);
101
101
  });
102
102
  });
103
+ describe('aria-hidden on individual overlays', () => {
104
+ it('should hide non-topmost overlays from screen readers', async () => {
105
+ const page = await newSpecPage({
106
+ components: [Modal],
107
+ html: `
108
+ <ion-modal id="one"></ion-modal>
109
+ <ion-modal id="two"></ion-modal>
110
+ `,
111
+ });
112
+ const modalOne = page.body.querySelector('ion-modal#one');
113
+ const modalTwo = page.body.querySelector('ion-modal#two');
114
+ await modalOne.present();
115
+ await modalTwo.present();
116
+ expect(modalOne.hasAttribute('aria-hidden')).toEqual(true);
117
+ expect(modalTwo.hasAttribute('aria-hidden')).toEqual(false);
118
+ });
119
+ it('should unhide new topmost overlay from screen readers when topmost is dismissed', async () => {
120
+ const page = await newSpecPage({
121
+ components: [Modal],
122
+ html: `
123
+ <ion-modal id="one"></ion-modal>
124
+ <ion-modal id="two"></ion-modal>
125
+ `,
126
+ });
127
+ const modalOne = page.body.querySelector('ion-modal#one');
128
+ const modalTwo = page.body.querySelector('ion-modal#two');
129
+ await modalOne.present();
130
+ await modalTwo.present();
131
+ // dismiss modalTwo so that modalOne becomes the new topmost overlay
132
+ await modalTwo.dismiss();
133
+ expect(modalOne.hasAttribute('aria-hidden')).toEqual(false);
134
+ });
135
+ it('should not keep overlays hidden from screen readers if presented after being dismissed while non-topmost', async () => {
136
+ const page = await newSpecPage({
137
+ components: [Modal],
138
+ html: `
139
+ <ion-modal id="one"></ion-modal>
140
+ <ion-modal id="two"></ion-modal>
141
+ `,
142
+ });
143
+ const modalOne = page.body.querySelector('ion-modal#one');
144
+ const modalTwo = page.body.querySelector('ion-modal#two');
145
+ await modalOne.present();
146
+ await modalTwo.present();
147
+ // modalOne is not the topmost overlay at this point and is hidden from screen readers
148
+ await modalOne.dismiss();
149
+ // modalOne will become the topmost overlay; ensure it isn't still hidden from screen readers
150
+ await modalOne.present();
151
+ expect(modalOne.hasAttribute('aria-hidden')).toEqual(false);
152
+ });
153
+ });