voyager-ionic-core 7.7.0 → 7.7.3

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 (421) hide show
  1. package/components/action-sheet.js +8 -4
  2. package/components/alert.js +6 -2
  3. package/components/helpers.js +2 -2
  4. package/components/ion-loading.js +6 -2
  5. package/components/ion-modal.js +8 -6
  6. package/components/ion-picker.js +6 -2
  7. package/components/ion-select.js +3 -3
  8. package/components/ion-toast.js +6 -2
  9. package/components/item.js +3 -12
  10. package/components/label.js +2 -2
  11. package/components/overlays.js +120 -29
  12. package/components/popover.js +7 -3
  13. package/components/select-popover.js +2 -2
  14. package/dist/cjs/{animation-fdab9de5.js → animation-c2840aea.js} +1 -1
  15. package/dist/cjs/{app-globals-5a17c5e1.js → app-globals-92ad1b3d.js} +1 -1
  16. package/dist/cjs/{button-active-b8c3f603.js → button-active-2d6520ec.js} +1 -1
  17. package/dist/cjs/{form-controller-7b90d7b7.js → form-controller-c83330c0.js} +1 -1
  18. package/dist/cjs/{framework-delegate-a3e6d060.js → framework-delegate-e0e13baa.js} +1 -1
  19. package/dist/cjs/{hardware-back-button-d23873bb.js → hardware-back-button-2696acaf.js} +2 -2
  20. package/dist/cjs/{helpers-2e1028fa.js → helpers-da4c0ed1.js} +2 -2
  21. package/dist/cjs/{index-5a471146.js → index-0ffe376d.js} +25 -22
  22. package/dist/cjs/{index-8c679cbf.js → index-4c96691f.js} +4 -4
  23. package/dist/cjs/{index-10da82ce.js → index-62290fec.js} +1 -1
  24. package/dist/cjs/{index-84351d21.js → index-9bfcb6e8.js} +4 -4
  25. package/dist/cjs/{index-53d162b2.js → index-bef98850.js} +1 -1
  26. package/dist/cjs/index.cjs.js +11 -11
  27. package/dist/cjs/{input-shims-6f804705.js → input-shims-a9a85bb9.js} +2 -2
  28. package/dist/cjs/{input.utils-d693d18a.js → input.utils-d7dca90f.js} +1 -1
  29. package/dist/cjs/ion-accordion_2.cjs.entry.js +3 -3
  30. package/dist/cjs/ion-action-sheet.cjs.entry.js +16 -12
  31. package/dist/cjs/ion-alert.cjs.entry.js +14 -10
  32. package/dist/cjs/ion-app_8.cjs.entry.js +12 -12
  33. package/dist/cjs/ion-avatar_3.cjs.entry.js +2 -2
  34. package/dist/cjs/ion-back-button.cjs.entry.js +3 -3
  35. package/dist/cjs/ion-backdrop.cjs.entry.js +2 -2
  36. package/dist/cjs/ion-breadcrumb_2.cjs.entry.js +3 -3
  37. package/dist/cjs/ion-button_2.cjs.entry.js +3 -3
  38. package/dist/cjs/ion-card_5.cjs.entry.js +3 -3
  39. package/dist/cjs/ion-checkbox.cjs.entry.js +4 -4
  40. package/dist/cjs/ion-chip.cjs.entry.js +2 -2
  41. package/dist/cjs/ion-col_3.cjs.entry.js +2 -2
  42. package/dist/cjs/ion-datetime-button.cjs.entry.js +3 -3
  43. package/dist/cjs/ion-datetime_3.cjs.entry.js +13 -9
  44. package/dist/cjs/ion-fab_3.cjs.entry.js +3 -3
  45. package/dist/cjs/ion-img.cjs.entry.js +3 -3
  46. package/dist/cjs/ion-infinite-scroll_2.cjs.entry.js +4 -4
  47. package/dist/cjs/ion-input.cjs.entry.js +6 -6
  48. package/dist/cjs/ion-item-option_3.cjs.entry.js +4 -4
  49. package/dist/cjs/ion-item_8.cjs.entry.js +7 -7
  50. package/dist/cjs/ion-loading.cjs.entry.js +13 -9
  51. package/dist/cjs/ion-menu_3.cjs.entry.js +8 -8
  52. package/dist/cjs/ion-modal.cjs.entry.js +16 -14
  53. package/dist/cjs/ion-nav_2.cjs.entry.js +6 -6
  54. package/dist/cjs/ion-picker-column-internal.cjs.entry.js +3 -3
  55. package/dist/cjs/ion-picker-internal.cjs.entry.js +2 -2
  56. package/dist/cjs/ion-popover.cjs.entry.js +15 -11
  57. package/dist/cjs/ion-progress-bar.cjs.entry.js +3 -3
  58. package/dist/cjs/ion-radio_2.cjs.entry.js +4 -4
  59. package/dist/cjs/ion-range.cjs.entry.js +5 -5
  60. package/dist/cjs/ion-refresher_2.cjs.entry.js +5 -5
  61. package/dist/cjs/ion-reorder_2.cjs.entry.js +4 -4
  62. package/dist/cjs/ion-ripple-effect.cjs.entry.js +2 -2
  63. package/dist/cjs/ion-route_4.cjs.entry.js +3 -3
  64. package/dist/cjs/ion-searchbar.cjs.entry.js +3 -3
  65. package/dist/cjs/ion-segment_2.cjs.entry.js +3 -3
  66. package/dist/cjs/ion-select_3.cjs.entry.js +12 -12
  67. package/dist/cjs/ion-spinner.cjs.entry.js +2 -2
  68. package/dist/cjs/ion-split-pane.cjs.entry.js +2 -2
  69. package/dist/cjs/ion-tab-bar_2.cjs.entry.js +3 -3
  70. package/dist/cjs/ion-tab_2.cjs.entry.js +3 -3
  71. package/dist/cjs/ion-text.cjs.entry.js +2 -2
  72. package/dist/cjs/ion-textarea.cjs.entry.js +6 -6
  73. package/dist/cjs/ion-toast.cjs.entry.js +13 -9
  74. package/dist/cjs/ion-toggle.cjs.entry.js +4 -4
  75. package/dist/cjs/{ionic-global-7358c23e.js → ionic-global-59a10130.js} +1 -1
  76. package/dist/cjs/ionic.cjs.js +6 -6
  77. package/dist/cjs/{ios.transition-8e40c54e.js → ios.transition-96679580.js} +4 -4
  78. package/dist/cjs/loader.cjs.js +5 -5
  79. package/dist/cjs/{md.transition-597a2479.js → md.transition-d6c98822.js} +4 -4
  80. package/dist/cjs/{notch-controller-db0127c4.js → notch-controller-bfbcbb7a.js} +1 -1
  81. package/dist/cjs/{overlays-eaf2075f.js → overlays-db5d96f3.js} +122 -32
  82. package/dist/cjs/{status-tap-b0bfea34.js → status-tap-7ad5f0fb.js} +3 -3
  83. package/dist/cjs/{swipe-back-7a848bb8.js → swipe-back-dcd0d4a9.js} +1 -1
  84. package/dist/collection/collection-manifest.json +1 -1
  85. package/dist/collection/components/action-sheet/action-sheet.ios.css +13 -1
  86. package/dist/collection/components/action-sheet/action-sheet.js +9 -5
  87. package/dist/collection/components/alert/alert.js +8 -4
  88. package/dist/collection/components/item/item.js +3 -12
  89. package/dist/collection/components/label/label.ios.css +0 -4
  90. package/dist/collection/components/label/label.md.css +0 -4
  91. package/dist/collection/components/label/test/item/item.e2e.js +24 -0
  92. package/dist/collection/components/loading/loading.js +8 -4
  93. package/dist/collection/components/modal/modal.js +10 -8
  94. package/dist/collection/components/modal/test/animations/modal.e2e.js +36 -0
  95. package/dist/collection/components/picker/picker.js +8 -4
  96. package/dist/collection/components/popover/popover.ios.css +7 -0
  97. package/dist/collection/components/popover/popover.js +8 -4
  98. package/dist/collection/components/select/select.js +3 -3
  99. package/dist/collection/components/select-popover/select-popover.ios.css +10 -0
  100. package/dist/collection/components/select-popover/select-popover.md.css +10 -0
  101. package/dist/collection/components/toast/test/toast.spec.js +12 -0
  102. package/dist/collection/components/toast/toast.js +8 -4
  103. package/dist/collection/utils/helpers.js +1 -1
  104. package/dist/collection/utils/overlays.js +119 -28
  105. package/dist/collection/utils/test/overlays/overlays.e2e.js +122 -0
  106. package/dist/collection/utils/test/overlays/overlays.spec.js +51 -0
  107. package/dist/docs.json +23 -23
  108. package/dist/esm/{animation-60dbdd13.js → animation-6a0c5338.js} +1 -1
  109. package/dist/esm/{app-globals-47226a12.js → app-globals-5cf6195b.js} +1 -1
  110. package/dist/esm/{button-active-4bee452c.js → button-active-47ac8092.js} +1 -1
  111. package/dist/esm/{form-controller-014aa89f.js → form-controller-21dd62b1.js} +1 -1
  112. package/dist/esm/{framework-delegate-fed7fe7c.js → framework-delegate-ed4ba327.js} +1 -1
  113. package/dist/esm/{hardware-back-button-f42b9c80.js → hardware-back-button-b410a047.js} +2 -2
  114. package/dist/esm/{helpers-c0b9ca37.js → helpers-be245865.js} +2 -2
  115. package/dist/esm/{index-d64f34ea.js → index-020f5464.js} +1 -1
  116. package/dist/esm/{index-4b98143d.js → index-348ed70a.js} +4 -4
  117. package/dist/esm/{index-73881b51.js → index-4c30cddd.js} +25 -22
  118. package/dist/esm/{index-48209844.js → index-e1b622e3.js} +4 -4
  119. package/dist/esm/{index-eb12ef92.js → index-f3946ac1.js} +1 -1
  120. package/dist/esm/index.js +11 -11
  121. package/dist/esm/{input-shims-b90ca55f.js → input-shims-5329bbe8.js} +2 -2
  122. package/dist/esm/{input.utils-6e9b0046.js → input.utils-a445f677.js} +1 -1
  123. package/dist/esm/ion-accordion_2.entry.js +3 -3
  124. package/dist/esm/ion-action-sheet.entry.js +16 -12
  125. package/dist/esm/ion-alert.entry.js +14 -10
  126. package/dist/esm/ion-app_8.entry.js +12 -12
  127. package/dist/esm/ion-avatar_3.entry.js +2 -2
  128. package/dist/esm/ion-back-button.entry.js +3 -3
  129. package/dist/esm/ion-backdrop.entry.js +2 -2
  130. package/dist/esm/ion-breadcrumb_2.entry.js +3 -3
  131. package/dist/esm/ion-button_2.entry.js +3 -3
  132. package/dist/esm/ion-card_5.entry.js +3 -3
  133. package/dist/esm/ion-checkbox.entry.js +4 -4
  134. package/dist/esm/ion-chip.entry.js +2 -2
  135. package/dist/esm/ion-col_3.entry.js +2 -2
  136. package/dist/esm/ion-datetime-button.entry.js +3 -3
  137. package/dist/esm/ion-datetime_3.entry.js +13 -9
  138. package/dist/esm/ion-fab_3.entry.js +3 -3
  139. package/dist/esm/ion-img.entry.js +3 -3
  140. package/dist/esm/ion-infinite-scroll_2.entry.js +4 -4
  141. package/dist/esm/ion-input.entry.js +6 -6
  142. package/dist/esm/ion-item-option_3.entry.js +4 -4
  143. package/dist/esm/ion-item_8.entry.js +7 -7
  144. package/dist/esm/ion-loading.entry.js +13 -9
  145. package/dist/esm/ion-menu_3.entry.js +8 -8
  146. package/dist/esm/ion-modal.entry.js +16 -14
  147. package/dist/esm/ion-nav_2.entry.js +6 -6
  148. package/dist/esm/ion-picker-column-internal.entry.js +3 -3
  149. package/dist/esm/ion-picker-internal.entry.js +2 -2
  150. package/dist/esm/ion-popover.entry.js +15 -11
  151. package/dist/esm/ion-progress-bar.entry.js +3 -3
  152. package/dist/esm/ion-radio_2.entry.js +4 -4
  153. package/dist/esm/ion-range.entry.js +5 -5
  154. package/dist/esm/ion-refresher_2.entry.js +5 -5
  155. package/dist/esm/ion-reorder_2.entry.js +4 -4
  156. package/dist/esm/ion-ripple-effect.entry.js +2 -2
  157. package/dist/esm/ion-route_4.entry.js +3 -3
  158. package/dist/esm/ion-searchbar.entry.js +3 -3
  159. package/dist/esm/ion-segment_2.entry.js +3 -3
  160. package/dist/esm/ion-select_3.entry.js +12 -12
  161. package/dist/esm/ion-spinner.entry.js +2 -2
  162. package/dist/esm/ion-split-pane.entry.js +2 -2
  163. package/dist/esm/ion-tab-bar_2.entry.js +3 -3
  164. package/dist/esm/ion-tab_2.entry.js +3 -3
  165. package/dist/esm/ion-text.entry.js +2 -2
  166. package/dist/esm/ion-textarea.entry.js +6 -6
  167. package/dist/esm/ion-toast.entry.js +13 -9
  168. package/dist/esm/ion-toggle.entry.js +4 -4
  169. package/dist/esm/{ionic-global-778b7863.js → ionic-global-ad9a1810.js} +1 -1
  170. package/dist/esm/ionic.js +7 -7
  171. package/dist/esm/{ios.transition-7ff7381d.js → ios.transition-7459f819.js} +4 -4
  172. package/dist/esm/loader.js +6 -6
  173. package/dist/esm/{md.transition-28a9a26b.js → md.transition-b8224313.js} +4 -4
  174. package/dist/esm/{notch-controller-15d281a4.js → notch-controller-6bd3e0f9.js} +1 -1
  175. package/dist/esm/{overlays-fad5fe01.js → overlays-19b26885.js} +123 -32
  176. package/dist/esm/{status-tap-2b335fb7.js → status-tap-b41ece3c.js} +3 -3
  177. package/dist/esm/{swipe-back-fa0ec5cd.js → swipe-back-c6d0e5d9.js} +1 -1
  178. package/dist/esm-es5/{animation-60dbdd13.js → animation-6a0c5338.js} +1 -1
  179. package/dist/esm-es5/app-globals-5cf6195b.js +4 -0
  180. package/dist/esm-es5/{button-active-4bee452c.js → button-active-47ac8092.js} +1 -1
  181. package/dist/esm-es5/{form-controller-014aa89f.js → form-controller-21dd62b1.js} +1 -1
  182. package/dist/esm-es5/{framework-delegate-fed7fe7c.js → framework-delegate-ed4ba327.js} +1 -1
  183. package/dist/esm-es5/{hardware-back-button-f42b9c80.js → hardware-back-button-b410a047.js} +1 -1
  184. package/dist/esm-es5/helpers-be245865.js +4 -0
  185. package/dist/esm-es5/index-020f5464.js +4 -0
  186. package/dist/esm-es5/{index-4b98143d.js → index-348ed70a.js} +1 -1
  187. package/dist/esm-es5/{index-73881b51.js → index-4c30cddd.js} +1 -1
  188. package/dist/esm-es5/{index-48209844.js → index-e1b622e3.js} +1 -1
  189. package/dist/esm-es5/{index-eb12ef92.js → index-f3946ac1.js} +1 -1
  190. package/dist/esm-es5/index.js +1 -1
  191. package/dist/esm-es5/{input-shims-b90ca55f.js → input-shims-5329bbe8.js} +1 -1
  192. package/dist/esm-es5/{input.utils-6e9b0046.js → input.utils-a445f677.js} +1 -1
  193. package/dist/esm-es5/ion-accordion_2.entry.js +1 -1
  194. package/dist/esm-es5/ion-action-sheet.entry.js +1 -1
  195. package/dist/esm-es5/ion-alert.entry.js +1 -1
  196. package/dist/esm-es5/ion-app_8.entry.js +1 -1
  197. package/dist/esm-es5/ion-avatar_3.entry.js +1 -1
  198. package/dist/esm-es5/ion-back-button.entry.js +1 -1
  199. package/dist/esm-es5/ion-backdrop.entry.js +1 -1
  200. package/dist/esm-es5/ion-breadcrumb_2.entry.js +1 -1
  201. package/dist/esm-es5/ion-button_2.entry.js +1 -1
  202. package/dist/esm-es5/ion-card_5.entry.js +1 -1
  203. package/dist/esm-es5/ion-checkbox.entry.js +1 -1
  204. package/dist/esm-es5/ion-chip.entry.js +1 -1
  205. package/dist/esm-es5/ion-col_3.entry.js +1 -1
  206. package/dist/esm-es5/ion-datetime-button.entry.js +1 -1
  207. package/dist/esm-es5/ion-datetime_3.entry.js +1 -1
  208. package/dist/esm-es5/ion-fab_3.entry.js +1 -1
  209. package/dist/esm-es5/ion-img.entry.js +1 -1
  210. package/dist/esm-es5/ion-infinite-scroll_2.entry.js +1 -1
  211. package/dist/esm-es5/ion-input.entry.js +1 -1
  212. package/dist/esm-es5/ion-item-option_3.entry.js +1 -1
  213. package/dist/esm-es5/ion-item_8.entry.js +1 -1
  214. package/dist/esm-es5/ion-loading.entry.js +1 -1
  215. package/dist/esm-es5/ion-menu_3.entry.js +1 -1
  216. package/dist/esm-es5/ion-modal.entry.js +1 -1
  217. package/dist/esm-es5/ion-nav_2.entry.js +1 -1
  218. package/dist/esm-es5/ion-picker-column-internal.entry.js +1 -1
  219. package/dist/esm-es5/ion-picker-internal.entry.js +1 -1
  220. package/dist/esm-es5/ion-popover.entry.js +1 -1
  221. package/dist/esm-es5/ion-progress-bar.entry.js +1 -1
  222. package/dist/esm-es5/ion-radio_2.entry.js +1 -1
  223. package/dist/esm-es5/ion-range.entry.js +1 -1
  224. package/dist/esm-es5/ion-refresher_2.entry.js +1 -1
  225. package/dist/esm-es5/ion-reorder_2.entry.js +1 -1
  226. package/dist/esm-es5/ion-ripple-effect.entry.js +1 -1
  227. package/dist/esm-es5/ion-route_4.entry.js +1 -1
  228. package/dist/esm-es5/ion-searchbar.entry.js +1 -1
  229. package/dist/esm-es5/ion-segment_2.entry.js +1 -1
  230. package/dist/esm-es5/ion-select_3.entry.js +1 -1
  231. package/dist/esm-es5/ion-spinner.entry.js +1 -1
  232. package/dist/esm-es5/ion-split-pane.entry.js +1 -1
  233. package/dist/esm-es5/ion-tab-bar_2.entry.js +1 -1
  234. package/dist/esm-es5/ion-tab_2.entry.js +1 -1
  235. package/dist/esm-es5/ion-text.entry.js +1 -1
  236. package/dist/esm-es5/ion-textarea.entry.js +1 -1
  237. package/dist/esm-es5/ion-toast.entry.js +1 -1
  238. package/dist/esm-es5/ion-toggle.entry.js +1 -1
  239. package/dist/esm-es5/{ionic-global-778b7863.js → ionic-global-ad9a1810.js} +1 -1
  240. package/dist/esm-es5/ionic.js +2 -2
  241. package/dist/esm-es5/{ios.transition-7ff7381d.js → ios.transition-7459f819.js} +1 -1
  242. package/dist/esm-es5/loader.js +2 -2
  243. package/dist/esm-es5/md.transition-b8224313.js +4 -0
  244. package/dist/esm-es5/{notch-controller-15d281a4.js → notch-controller-6bd3e0f9.js} +1 -1
  245. package/dist/esm-es5/overlays-19b26885.js +4 -0
  246. package/dist/esm-es5/{status-tap-2b335fb7.js → status-tap-b41ece3c.js} +1 -1
  247. package/dist/esm-es5/{swipe-back-fa0ec5cd.js → swipe-back-c6d0e5d9.js} +1 -1
  248. package/dist/ionic/index.esm.js +1 -1
  249. package/dist/ionic/ionic.esm.js +1 -1
  250. package/dist/ionic/ionic.js +1 -1
  251. package/dist/ionic/{p-38a6fee7.entry.js → p-021f9d72.entry.js} +1 -1
  252. package/dist/ionic/{p-680f96e8.system.entry.js → p-02542247.system.entry.js} +1 -1
  253. package/dist/ionic/p-02ad4bbe.js +4 -0
  254. package/dist/ionic/{p-b4d8fe47.js → p-05253db9.js} +1 -1
  255. package/dist/ionic/{p-efe9180b.entry.js → p-079da3df.entry.js} +1 -1
  256. package/dist/ionic/p-0b34d3a7.system.js +4 -0
  257. package/dist/ionic/{p-51f08a9f.entry.js → p-12527c4b.entry.js} +1 -1
  258. package/dist/ionic/{p-c6fef62b.system.js → p-125f8cdd.system.js} +1 -1
  259. package/dist/ionic/{p-b253ad7f.js → p-12a8643e.js} +1 -1
  260. package/dist/ionic/{p-f7b43141.system.entry.js → p-15a40a0b.system.entry.js} +1 -1
  261. package/dist/ionic/{p-5eea8b4c.system.js → p-1636923f.system.js} +1 -1
  262. package/dist/ionic/{p-333f06ed.entry.js → p-16a61810.entry.js} +1 -1
  263. package/dist/ionic/p-1846513c.js +4 -0
  264. package/dist/ionic/{p-6f38d0c5.system.entry.js → p-18918a24.system.entry.js} +1 -1
  265. package/dist/ionic/{p-ce2eabd5.entry.js → p-1a680496.entry.js} +1 -1
  266. package/dist/ionic/{p-b8c685a7.system.js → p-1bc9b5f5.system.js} +1 -1
  267. package/dist/ionic/{p-396c1a55.entry.js → p-1f16d040.entry.js} +1 -1
  268. package/dist/ionic/{p-e6aaff14.system.entry.js → p-1f19958f.system.entry.js} +1 -1
  269. package/dist/ionic/{p-d7260b87.entry.js → p-2178329b.entry.js} +1 -1
  270. package/dist/ionic/p-257046d2.system.js +4 -0
  271. package/dist/ionic/p-262024fd.entry.js +4 -0
  272. package/dist/ionic/{p-9f5b40c0.system.entry.js → p-2765a571.system.entry.js} +1 -1
  273. package/dist/ionic/{p-7c32fb95.system.entry.js → p-288649db.system.entry.js} +1 -1
  274. package/dist/ionic/{p-94be3ad7.js → p-2c118b1e.js} +1 -1
  275. package/dist/ionic/{p-3a98f8db.entry.js → p-2c4bfe1c.entry.js} +1 -1
  276. package/dist/ionic/{p-25b08bc4.system.js → p-2c86025e.system.js} +1 -1
  277. package/dist/ionic/{p-8569d759.system.entry.js → p-2ea71956.system.entry.js} +1 -1
  278. package/dist/ionic/{p-9db1e4c5.entry.js → p-2fd3c3dd.entry.js} +1 -1
  279. package/dist/ionic/{p-aa7ae6aa.entry.js → p-3079950e.entry.js} +1 -1
  280. package/dist/ionic/{p-b8c4df21.entry.js → p-337ac0f5.entry.js} +1 -1
  281. package/dist/ionic/p-36be3332.js +4 -0
  282. package/dist/ionic/{p-9eb4ea47.system.entry.js → p-437f4d02.system.entry.js} +1 -1
  283. package/dist/ionic/{p-c858f685.js → p-46bcc2f5.js} +1 -1
  284. package/dist/ionic/{p-108f730a.entry.js → p-4788693d.entry.js} +1 -1
  285. package/dist/ionic/{p-5f456b3c.system.entry.js → p-479f5926.system.entry.js} +1 -1
  286. package/dist/ionic/{p-34947dff.system.entry.js → p-482ea916.system.entry.js} +1 -1
  287. package/dist/ionic/p-49f481cc.system.entry.js +4 -0
  288. package/dist/ionic/{p-0eef8b34.system.entry.js → p-4b8a620f.system.entry.js} +1 -1
  289. package/dist/ionic/{p-df468a8f.entry.js → p-521b3971.entry.js} +1 -1
  290. package/dist/ionic/{p-31c495c2.js → p-56ee6d9a.js} +1 -1
  291. package/dist/ionic/{p-30c9e049.system.entry.js → p-5cb5f63d.system.entry.js} +1 -1
  292. package/dist/ionic/{p-1aa7c019.js → p-5d7e32ce.js} +1 -1
  293. package/dist/ionic/{p-4fc40349.system.entry.js → p-5de920f4.system.entry.js} +1 -1
  294. package/dist/ionic/{p-6871553b.system.js → p-62b7320a.system.js} +1 -1
  295. package/dist/ionic/{p-bc2c03d7.system.entry.js → p-644d03d7.system.entry.js} +1 -1
  296. package/dist/ionic/{p-3f028207.system.js → p-6525a8cd.system.js} +1 -1
  297. package/dist/ionic/{p-d8607ede.entry.js → p-657ccdd6.entry.js} +1 -1
  298. package/dist/ionic/p-6812d37d.js +4 -0
  299. package/dist/ionic/{p-61ba2137.system.js → p-6afef6c1.system.js} +1 -1
  300. package/dist/ionic/p-6b6ca3f5.system.entry.js +4 -0
  301. package/dist/ionic/p-6c45c617.js +4 -0
  302. package/dist/ionic/{p-8a671f16.entry.js → p-6e23d039.entry.js} +1 -1
  303. package/dist/ionic/p-6f59cdbc.system.entry.js +4 -0
  304. package/dist/ionic/{p-dce9bc53.entry.js → p-70fbf4e2.entry.js} +1 -1
  305. package/dist/ionic/{p-20a6513f.system.entry.js → p-717e2526.system.entry.js} +1 -1
  306. package/dist/ionic/{p-76893257.system.js → p-72fa96bf.system.js} +1 -1
  307. package/dist/ionic/{p-0fd295ef.system.entry.js → p-741a0f0d.system.entry.js} +1 -1
  308. package/dist/ionic/{p-1c531ca2.entry.js → p-7670acd8.entry.js} +1 -1
  309. package/dist/ionic/{p-84879f61.system.entry.js → p-76b8bcb8.system.entry.js} +1 -1
  310. package/dist/ionic/{p-a3f572a7.js → p-779aede8.js} +1 -1
  311. package/dist/ionic/{p-9f6397ce.entry.js → p-7a615a5a.entry.js} +1 -1
  312. package/dist/ionic/{p-89b5aff2.entry.js → p-7e16220b.entry.js} +1 -1
  313. package/dist/ionic/{p-a1bfaa5c.system.entry.js → p-7e838f43.system.entry.js} +1 -1
  314. package/dist/ionic/{p-2da0a76c.entry.js → p-7f30ad48.entry.js} +1 -1
  315. package/dist/ionic/{p-70026e8f.system.entry.js → p-80aed9fb.system.entry.js} +1 -1
  316. package/dist/ionic/{p-a2ad515b.entry.js → p-822730c4.entry.js} +1 -1
  317. package/dist/ionic/{p-dbb4c012.entry.js → p-84b85535.entry.js} +1 -1
  318. package/dist/ionic/p-85f66c3c.entry.js +4 -0
  319. package/dist/ionic/{p-d181166c.system.entry.js → p-860e2539.system.entry.js} +1 -1
  320. package/dist/ionic/{p-58e3ae88.system.entry.js → p-86813176.system.entry.js} +1 -1
  321. package/dist/ionic/{p-a051c371.entry.js → p-88e9052d.entry.js} +1 -1
  322. package/dist/ionic/{p-b94882a9.system.js → p-89ca4c4b.system.js} +1 -1
  323. package/dist/ionic/{p-c569d1c8.entry.js → p-8cc34120.entry.js} +1 -1
  324. package/dist/ionic/{p-f46775e4.entry.js → p-8e651c29.entry.js} +1 -1
  325. package/dist/ionic/{p-f97b9cdd.system.entry.js → p-9056778e.system.entry.js} +1 -1
  326. package/dist/ionic/{p-92c2178e.system.entry.js → p-91f4e611.system.entry.js} +1 -1
  327. package/dist/ionic/{p-9393a49f.js → p-942a9358.js} +1 -1
  328. package/dist/ionic/{p-ef441122.entry.js → p-96084f36.entry.js} +1 -1
  329. package/dist/ionic/{p-a114530c.entry.js → p-973b4db3.entry.js} +1 -1
  330. package/dist/ionic/{p-3c6f02cf.system.js → p-97ca0cb9.system.js} +1 -1
  331. package/dist/ionic/{p-a02b2d75.entry.js → p-98aa0553.entry.js} +1 -1
  332. package/dist/ionic/{p-1f6cdf2c.system.entry.js → p-9998cb62.system.entry.js} +1 -1
  333. package/dist/ionic/{p-5615cf3f.system.entry.js → p-9de75bac.system.entry.js} +1 -1
  334. package/dist/ionic/{p-3cdbaa49.entry.js → p-a02ea777.entry.js} +1 -1
  335. package/dist/ionic/{p-c2289cd1.js → p-a1036ce7.js} +1 -1
  336. package/dist/ionic/{p-fd3f475f.entry.js → p-a1222c24.entry.js} +1 -1
  337. package/dist/ionic/{p-eda7a1db.system.entry.js → p-a3df16b9.system.entry.js} +1 -1
  338. package/dist/ionic/{p-dd60faa5.system.entry.js → p-a4aa6dd2.system.entry.js} +1 -1
  339. package/dist/ionic/{p-49543c9c.system.js → p-a667dd1f.system.js} +1 -1
  340. package/dist/ionic/{p-8ddc00f7.js → p-a6c0a380.js} +1 -1
  341. package/dist/ionic/{p-5e60dbc8.entry.js → p-a8459bfb.entry.js} +1 -1
  342. package/dist/ionic/{p-9a6ab80a.system.entry.js → p-a85d9047.system.entry.js} +1 -1
  343. package/dist/ionic/{p-ac20160b.system.entry.js → p-abcedc15.system.entry.js} +1 -1
  344. package/dist/ionic/{p-e68980ff.system.entry.js → p-ae2b3a7a.system.entry.js} +1 -1
  345. package/dist/ionic/{p-eb1fdf9f.system.entry.js → p-ae828bd9.system.entry.js} +1 -1
  346. package/dist/ionic/{p-20f7a91e.system.entry.js → p-b0aa3806.system.entry.js} +1 -1
  347. package/dist/ionic/{p-078fd095.system.entry.js → p-b27bba38.system.entry.js} +1 -1
  348. package/dist/ionic/p-b4d2f43c.system.js +4 -0
  349. package/dist/ionic/{p-594ead2f.entry.js → p-b58686e0.entry.js} +1 -1
  350. package/dist/ionic/{p-fe92da17.entry.js → p-b6279412.entry.js} +1 -1
  351. package/dist/ionic/{p-400574bf.entry.js → p-b727af6a.entry.js} +1 -1
  352. package/dist/ionic/{p-a19f5ae1.entry.js → p-ba0fbecc.entry.js} +1 -1
  353. package/dist/ionic/{p-0e29919c.system.entry.js → p-baf8eeac.system.entry.js} +1 -1
  354. package/dist/ionic/{p-95c44e02.system.js → p-bcd9cad8.system.js} +1 -1
  355. package/dist/ionic/{p-37c33319.system.js → p-bd313b73.system.js} +1 -1
  356. package/dist/ionic/p-bdca4784.js +4 -0
  357. package/dist/ionic/{p-0ae25399.system.entry.js → p-c1a871ff.system.entry.js} +1 -1
  358. package/dist/ionic/{p-c3d041af.entry.js → p-c1c7309e.entry.js} +1 -1
  359. package/dist/ionic/{p-e6cfaa07.system.entry.js → p-c7288e78.system.entry.js} +1 -1
  360. package/dist/ionic/{p-d74ca358.entry.js → p-cb3065b8.entry.js} +1 -1
  361. package/dist/ionic/{p-5a0c301f.entry.js → p-cb9812f7.entry.js} +1 -1
  362. package/dist/ionic/{p-55d5cd00.system.js → p-cbcffe6e.system.js} +1 -1
  363. package/dist/ionic/{p-df281664.system.entry.js → p-ce1c0a0e.system.entry.js} +1 -1
  364. package/dist/ionic/{p-4b2d5b9c.js → p-ceceac26.js} +1 -1
  365. package/dist/ionic/p-cfb4d7e0.js +4 -0
  366. package/dist/ionic/{p-3a54c070.system.entry.js → p-d143fefa.system.entry.js} +1 -1
  367. package/dist/ionic/{p-97eca294.entry.js → p-d425b1de.entry.js} +1 -1
  368. package/dist/ionic/{p-78edc0cd.system.entry.js → p-d6c6541b.system.entry.js} +1 -1
  369. package/dist/ionic/{p-341b4519.js → p-de55ec45.js} +1 -1
  370. package/dist/ionic/{p-001010b6.system.js → p-df504a37.system.js} +1 -1
  371. package/dist/ionic/{p-ea8fbf09.entry.js → p-dff97cfa.entry.js} +1 -1
  372. package/dist/ionic/{p-d95c8e90.entry.js → p-e1c52dc6.entry.js} +1 -1
  373. package/dist/ionic/{p-044ad008.system.entry.js → p-e4e74b5f.system.entry.js} +1 -1
  374. package/dist/ionic/{p-cd055d60.system.entry.js → p-e626800f.system.entry.js} +1 -1
  375. package/dist/ionic/{p-84f589e1.entry.js → p-e94c1402.entry.js} +1 -1
  376. package/dist/ionic/{p-30d77a91.system.js → p-ebc1ca90.system.js} +1 -1
  377. package/dist/ionic/{p-2f66e177.system.entry.js → p-ebc86ce9.system.entry.js} +1 -1
  378. package/dist/ionic/{p-88ca4854.entry.js → p-ed4760ef.entry.js} +1 -1
  379. package/dist/ionic/p-ed7a529f.js +5 -0
  380. package/dist/ionic/{p-fd36799d.system.js → p-f02c41af.system.js} +1 -1
  381. package/dist/ionic/{p-1d8c2cfc.system.entry.js → p-f0e54781.system.entry.js} +1 -1
  382. package/dist/ionic/{p-f88dd429.entry.js → p-fa8d3b01.entry.js} +1 -1
  383. package/dist/ionic/p-fbd01db3.system.js +4 -0
  384. package/dist/ionic/{p-e2bb92ed.system.js → p-fe320051.system.js} +1 -1
  385. package/dist/types/components/action-sheet/action-sheet.d.ts +4 -0
  386. package/dist/types/components/alert/alert.d.ts +4 -0
  387. package/dist/types/components/loading/loading.d.ts +4 -0
  388. package/dist/types/components/modal/modal.d.ts +4 -0
  389. package/dist/types/components/picker/picker.d.ts +4 -0
  390. package/dist/types/components/popover/popover.d.ts +4 -0
  391. package/dist/types/components/toast/toast.d.ts +4 -0
  392. package/dist/types/components.d.ts +7 -7
  393. package/dist/types/utils/helpers.d.ts +1 -1
  394. package/dist/types/utils/overlays.d.ts +5 -0
  395. package/hydrate/index.d.ts +1 -1
  396. package/hydrate/index.js +292 -68
  397. package/package.json +6 -6
  398. package/dist/esm-es5/app-globals-47226a12.js +0 -4
  399. package/dist/esm-es5/helpers-c0b9ca37.js +0 -4
  400. package/dist/esm-es5/index-d64f34ea.js +0 -4
  401. package/dist/esm-es5/md.transition-28a9a26b.js +0 -4
  402. package/dist/esm-es5/overlays-fad5fe01.js +0 -4
  403. package/dist/ionic/p-0b955124.system.js +0 -4
  404. package/dist/ionic/p-1375f21f.js +0 -4
  405. package/dist/ionic/p-3eb2da31.js +0 -4
  406. package/dist/ionic/p-41fde260.entry.js +0 -4
  407. package/dist/ionic/p-4f777b5e.js +0 -4
  408. package/dist/ionic/p-52e02877.entry.js +0 -4
  409. package/dist/ionic/p-62067818.system.entry.js +0 -4
  410. package/dist/ionic/p-62a3c609.system.js +0 -4
  411. package/dist/ionic/p-6b02edd6.js +0 -4
  412. package/dist/ionic/p-86670b91.system.js +0 -4
  413. package/dist/ionic/p-8f1ce253.js +0 -4
  414. package/dist/ionic/p-b1f0c48e.system.entry.js +0 -4
  415. package/dist/ionic/p-b4a95b80.system.entry.js +0 -4
  416. package/dist/ionic/p-c5c3710c.js +0 -4
  417. package/dist/ionic/p-c80c7e90.system.js +0 -4
  418. package/dist/ionic/p-e1271366.js +0 -5
  419. package/dist/ionic/p-fd2aa50c.js +0 -4
  420. /package/dist/ionic/{p-b5839dc2.js → p-1b3ffb2f.js} +0 -0
  421. /package/dist/ionic/{p-fd8ced99.system.js → p-5fc8d5ef.system.js} +0 -0
@@ -7,7 +7,7 @@ import { config } from "../global/config";
7
7
  import { getIonMode } from "../global/ionic-global";
8
8
  import { CoreDelegate } from "./framework-delegate";
9
9
  import { OVERLAY_BACK_BUTTON_PRIORITY } from "./hardware-back-button";
10
- import { addEventListener, componentOnReady, focusElement, getElementRoot, removeEventListener } from "./helpers";
10
+ import { addEventListener, componentOnReady, focusVisibleElement, getElementRoot, removeEventListener, } from "./helpers";
11
11
  import { printIonWarning } from "./logging";
12
12
  let lastOverlayIndex = 0;
13
13
  let lastId = 0;
@@ -99,32 +99,48 @@ export const createOverlay = (tagName, opts) => {
99
99
  * valid usage for the disabled property on ion-button.
100
100
  */
101
101
  const focusableQueryString = '[tabindex]:not([tabindex^="-"]):not([hidden]):not([disabled]), input:not([type=hidden]):not([tabindex^="-"]):not([hidden]):not([disabled]), textarea:not([tabindex^="-"]):not([hidden]):not([disabled]), button:not([tabindex^="-"]):not([hidden]):not([disabled]), select:not([tabindex^="-"]):not([hidden]):not([disabled]), .ion-focusable:not([tabindex^="-"]):not([hidden]):not([disabled]), .ion-focusable[disabled="false"]:not([tabindex^="-"]):not([hidden])';
102
+ const isOverlayHidden = (overlay) => overlay.classList.contains('overlay-hidden');
103
+ /**
104
+ * Focuses the first descendant in an overlay
105
+ * that can receive focus. If none exists,
106
+ * the entire overlay will be focused.
107
+ */
102
108
  export const focusFirstDescendant = (ref, overlay) => {
103
- let firstInput = ref.querySelector(focusableQueryString);
104
- const shadowRoot = firstInput === null || firstInput === void 0 ? void 0 : firstInput.shadowRoot;
105
- if (shadowRoot) {
106
- // If there are no inner focusable elements, just focus the host element.
107
- firstInput = shadowRoot.querySelector(focusableQueryString) || firstInput;
108
- }
109
- if (firstInput) {
110
- focusElement(firstInput);
111
- }
112
- else {
113
- // Focus overlay instead of letting focus escape
114
- overlay.focus();
115
- }
109
+ const firstInput = ref.querySelector(focusableQueryString);
110
+ focusElementInOverlay(firstInput, overlay);
116
111
  };
117
- const isOverlayHidden = (overlay) => overlay.classList.contains('overlay-hidden');
112
+ /**
113
+ * Focuses the last descendant in an overlay
114
+ * that can receive focus. If none exists,
115
+ * the entire overlay will be focused.
116
+ */
118
117
  const focusLastDescendant = (ref, overlay) => {
119
118
  const inputs = Array.from(ref.querySelectorAll(focusableQueryString));
120
- let lastInput = inputs.length > 0 ? inputs[inputs.length - 1] : null;
121
- const shadowRoot = lastInput === null || lastInput === void 0 ? void 0 : lastInput.shadowRoot;
119
+ const lastInput = inputs.length > 0 ? inputs[inputs.length - 1] : null;
120
+ focusElementInOverlay(lastInput, overlay);
121
+ };
122
+ /**
123
+ * Focuses a particular element in an overlay. If the element
124
+ * doesn't have anything focusable associated with it then
125
+ * the overlay itself will be focused.
126
+ * This should be used instead of the focus() method
127
+ * on most elements because the focusable element
128
+ * may not be the host element.
129
+ *
130
+ * For example, if an ion-button should be focused
131
+ * then we should actually focus the native <button>
132
+ * element inside of ion-button's shadow root, not
133
+ * the host element itself.
134
+ */
135
+ const focusElementInOverlay = (hostToFocus, overlay) => {
136
+ let elementToFocus = hostToFocus;
137
+ const shadowRoot = hostToFocus === null || hostToFocus === void 0 ? void 0 : hostToFocus.shadowRoot;
122
138
  if (shadowRoot) {
123
139
  // If there are no inner focusable elements, just focus the host element.
124
- lastInput = shadowRoot.querySelector(focusableQueryString) || lastInput;
140
+ elementToFocus = shadowRoot.querySelector(focusableQueryString) || hostToFocus;
125
141
  }
126
- if (lastInput) {
127
- lastInput.focus();
142
+ if (elementToFocus) {
143
+ focusVisibleElement(elementToFocus);
128
144
  }
129
145
  else {
130
146
  // Focus overlay instead of letting focus escape
@@ -175,6 +191,21 @@ const trapKeyboardFocus = (ev, doc) => {
175
191
  */
176
192
  if (lastOverlay === target) {
177
193
  lastOverlay.lastFocus = undefined;
194
+ /**
195
+ * Toasts can be presented from an overlay.
196
+ * However, focus should still be returned to
197
+ * the overlay when clicking a toast. Normally,
198
+ * focus would be returned to the last focusable
199
+ * descendant in the overlay which may not always be
200
+ * the button that the toast was presented from. In this case,
201
+ * the focus may be returned to an unexpected element.
202
+ * To account for this, we make sure to return focus to the
203
+ * last focused element in the overlay if focus is
204
+ * moved to the toast.
205
+ */
206
+ }
207
+ else if (target.tagName === 'ION-TOAST') {
208
+ focusElementInOverlay(lastOverlay.lastFocus, lastOverlay);
178
209
  /**
179
210
  * Otherwise, we must be focusing an element
180
211
  * inside of the overlay. The two possible options
@@ -246,6 +277,21 @@ const trapKeyboardFocus = (ev, doc) => {
246
277
  */
247
278
  if (lastOverlay.contains(target)) {
248
279
  lastOverlay.lastFocus = target;
280
+ /**
281
+ * Toasts can be presented from an overlay.
282
+ * However, focus should still be returned to
283
+ * the overlay when clicking a toast. Normally,
284
+ * focus would be returned to the last focusable
285
+ * descendant in the overlay which may not always be
286
+ * the button that the toast was presented from. In this case,
287
+ * the focus may be returned to an unexpected element.
288
+ * To account for this, we make sure to return focus to the
289
+ * last focused element in the overlay if focus is
290
+ * moved to the toast.
291
+ */
292
+ }
293
+ else if (target.tagName === 'ION-TOAST') {
294
+ focusElementInOverlay(lastOverlay.lastFocus, lastOverlay);
249
295
  }
250
296
  else {
251
297
  /**
@@ -409,6 +455,15 @@ export const present = async (overlay, name, iosEnterAnimation, mdEnterAnimation
409
455
  return;
410
456
  }
411
457
  setRootAriaHidden(true);
458
+ /**
459
+ * Hide all other overlays from screen readers so only this one
460
+ * can be read. Note that presenting an overlay always makes
461
+ * it the topmost one.
462
+ */
463
+ if (doc !== undefined) {
464
+ const presentedOverlays = getPresentedOverlays(doc);
465
+ presentedOverlays.forEach((o) => o.setAttribute('aria-hidden', 'true'));
466
+ }
412
467
  overlay.presented = true;
413
468
  overlay.willPresent.emit();
414
469
  (_a = overlay.willPresentShorthand) === null || _a === void 0 ? void 0 : _a.emit();
@@ -431,7 +486,7 @@ export const present = async (overlay, name, iosEnterAnimation, mdEnterAnimation
431
486
  * from returning focus as a result.
432
487
  */
433
488
  if (overlay.el.tagName !== 'ION-TOAST') {
434
- focusPreviousElementOnDismissIfNeeded(overlay.el);
489
+ restoreElementFocus(overlay.el);
435
490
  }
436
491
  /**
437
492
  * If the focused element is already
@@ -442,6 +497,14 @@ export const present = async (overlay, name, iosEnterAnimation, mdEnterAnimation
442
497
  if (overlay.keyboardClose && (document.activeElement === null || !overlay.el.contains(document.activeElement))) {
443
498
  overlay.el.focus();
444
499
  }
500
+ /**
501
+ * If this overlay was previously dismissed without being
502
+ * the topmost one (such as by manually calling dismiss()),
503
+ * it would still have aria-hidden on being presented again.
504
+ * Removing it here ensures the overlay is visible to screen
505
+ * readers.
506
+ */
507
+ overlay.el.removeAttribute('aria-hidden');
445
508
  };
446
509
  /**
447
510
  * When an overlay component is dismissed,
@@ -453,7 +516,7 @@ export const present = async (overlay, name, iosEnterAnimation, mdEnterAnimation
453
516
  * to where they were before they
454
517
  * opened the overlay.
455
518
  */
456
- const focusPreviousElementOnDismissIfNeeded = async (overlayEl) => {
519
+ const restoreElementFocus = async (overlayEl) => {
457
520
  let previousElement = document.activeElement;
458
521
  if (!previousElement) {
459
522
  return;
@@ -465,18 +528,35 @@ const focusPreviousElementOnDismissIfNeeded = async (overlayEl) => {
465
528
  }
466
529
  await overlayEl.onDidDismiss();
467
530
  /**
468
- * If the user has already removed focus
469
- * from the overlay (For example, focusing
470
- * a text box after tapping a button in an
471
- * action sheet) then don't restore focus
472
- * to previous element
531
+ * After onDidDismiss, the overlay loses focus
532
+ * because it is removed from the document
533
+ *
534
+ * > An element will also lose focus [...]
535
+ * > if the element is removed from the document)
536
+ *
537
+ * https://developer.mozilla.org/en-US/docs/Web/API/Element/blur_event
538
+ *
539
+ * Additionally, `document.activeElement` returns:
540
+ *
541
+ * > The Element which currently has focus,
542
+ * > `<body>` or null if there is
543
+ * > no focused element.
544
+ *
545
+ * https://developer.mozilla.org/en-US/docs/Web/API/Document/activeElement#value
546
+ *
547
+ * However, if the user has already focused
548
+ * an element sometime between onWillDismiss
549
+ * and onDidDismiss (for example, focusing a
550
+ * text box after tapping a button in an
551
+ * action sheet) then don't restore focus to
552
+ * previous element
473
553
  */
474
554
  if (document.activeElement === null || document.activeElement === document.body) {
475
555
  previousElement.focus();
476
556
  }
477
557
  };
478
558
  export const dismiss = async (overlay, data, role, name, iosLeaveAnimation, mdLeaveAnimation, opts) => {
479
- var _a, _b;
559
+ var _a, _b, _c;
480
560
  if (!overlay.presented) {
481
561
  return false;
482
562
  }
@@ -503,6 +583,10 @@ export const dismiss = async (overlay, data, role, name, iosLeaveAnimation, mdLe
503
583
  }
504
584
  overlay.didDismiss.emit({ data, role });
505
585
  (_b = overlay.didDismissShorthand) === null || _b === void 0 ? void 0 : _b.emit({ data, role });
586
+ // Get a reference to all animations currently assigned to this overlay
587
+ // Then tear them down to return the overlay to its initial visual state
588
+ const animations = activeAnimations.get(overlay) || [];
589
+ animations.forEach((ani) => ani.destroy());
506
590
  activeAnimations.delete(overlay);
507
591
  /**
508
592
  * Make overlay hidden again in case it is being reused.
@@ -523,6 +607,13 @@ export const dismiss = async (overlay, data, role, name, iosLeaveAnimation, mdLe
523
607
  console.error(err);
524
608
  }
525
609
  overlay.el.remove();
610
+ /**
611
+ * If there are other overlays presented, unhide the new
612
+ * topmost one from screen readers.
613
+ */
614
+ if (doc !== undefined) {
615
+ (_c = getPresentedOverlay(doc)) === null || _c === void 0 ? void 0 : _c.removeAttribute('aria-hidden');
616
+ }
526
617
  return true;
527
618
  };
528
619
  const getAppRoot = (doc) => {
@@ -175,5 +175,127 @@ configs({ modes: ['ios'], directions: ['ltr'] }).forEach(({ title, config }) =>
175
175
  await modalInputOne.click();
176
176
  await expect(modalInputOne).toBeFocused();
177
177
  });
178
+ test('focusing toast from a shadow overlay should return focus to the last focused element', async ({ page }) => {
179
+ test.info().annotations.push({
180
+ type: 'issue',
181
+ description: 'https://github.com/ionic-team/ionic-framework/issues/28261',
182
+ });
183
+ /**
184
+ * Triggers for an overlay are typically buttons. However in this case,
185
+ * buttons are not considered keyboard focusable by WebKit. Inputs are,
186
+ * so we use an input here so we can still test on WebKit.
187
+ */
188
+ await page.setContent(`
189
+ <ion-modal>
190
+ <ion-content>
191
+ <input id="show-toast">Button A</input>
192
+ <button>Button B</button>
193
+ <ion-toast trigger="show-toast"></ion-toast>
194
+ </ion-content>
195
+ </ion-modal>
196
+
197
+ <script>
198
+ const toast = document.querySelector('ion-toast');
199
+ toast.buttons = ['Ok'];
200
+ </script>
201
+ `, config);
202
+ const modal = page.locator('ion-modal');
203
+ const showToastTrigger = page.locator('#show-toast');
204
+ const toast = page.locator('ion-toast');
205
+ const toastButton = toast.locator('button');
206
+ const ionToastDidPresent = await page.spyOnEvent('ionToastDidPresent');
207
+ // Show overlay
208
+ await modal.evaluate((el) => el.present());
209
+ // Click trigger to open toast
210
+ await showToastTrigger.click();
211
+ // Wait for toast to be presented
212
+ await ionToastDidPresent.next();
213
+ // Verify trigger in overlay is focused
214
+ await expect(showToastTrigger).toBeFocused();
215
+ // Click a button in the toast and therefore attempt to move focus
216
+ await toastButton.click();
217
+ // Verify trigger in overlay is still focused
218
+ await expect(showToastTrigger).toBeFocused();
219
+ });
220
+ test('focusing toast from a scoped overlay should return focus to the last focused element', async ({ page, skip, }) => {
221
+ test.info().annotations.push({
222
+ type: 'issue',
223
+ description: 'https://github.com/ionic-team/ionic-framework/issues/28261',
224
+ });
225
+ skip.browser('webkit', 'WebKit does not consider buttons to be focusable');
226
+ await page.setContent(`
227
+ <ion-action-sheet></ion-action-sheet>
228
+ <ion-toast></ion-toast>
229
+
230
+ <script>
231
+ const actionSheet = document.querySelector('ion-action-sheet');
232
+ actionSheet.buttons = [
233
+ 'Other Button',
234
+ {
235
+ text: 'Button',
236
+ id: 'show-toast',
237
+ handler: () => {
238
+ document.querySelector('ion-toast').present();
239
+ return false;
240
+ }
241
+ }
242
+ ];
243
+
244
+ const toast = document.querySelector('ion-toast');
245
+ toast.buttons = ['Ok'];
246
+ </script>
247
+ `, config);
248
+ const actionSheet = page.locator('ion-action-sheet');
249
+ const showToastButton = page.locator('#show-toast');
250
+ const toast = page.locator('ion-toast');
251
+ const toastButton = toast.locator('button');
252
+ const ionToastDidPresent = await page.spyOnEvent('ionToastDidPresent');
253
+ // Show overlay
254
+ await actionSheet.evaluate((el) => el.present());
255
+ // Click button to open toast
256
+ await showToastButton.click();
257
+ // Wait for toast to be presented
258
+ await ionToastDidPresent.next();
259
+ // Verify button in overlay is focused
260
+ await expect(showToastButton).toBeFocused();
261
+ // Click a button in the toast and therefore attempt to move focus
262
+ await toastButton.click();
263
+ await page.pause();
264
+ // Verify button in overlay is still focused
265
+ await expect(showToastButton).toBeFocused();
266
+ });
267
+ test('should not return focus to another element if focus already manually returned', async ({ page, skip, }, testInfo) => {
268
+ skip.browser('webkit', 'WebKit does not consider buttons to be focusable, so this test always passes since the input is the only focusable element.');
269
+ testInfo.annotations.push({
270
+ type: 'issue',
271
+ description: 'https://github.com/ionic-team/ionic-framework/issues/28849',
272
+ });
273
+ await page.setContent(`
274
+ <button id="open-action-sheet">open</button>
275
+ <ion-action-sheet trigger="open-action-sheet"></ion-action-sheet>
276
+ <input id="test-input" />
277
+
278
+ <script>
279
+ const actionSheet = document.querySelector('ion-action-sheet');
280
+
281
+ actionSheet.addEventListener('ionActionSheetWillDismiss', () => {
282
+ requestAnimationFrame(() => {
283
+ document.querySelector('#test-input').focus();
284
+ });
285
+ });
286
+ </script>
287
+ `, config);
288
+ const ionActionSheetDidPresent = await page.spyOnEvent('ionActionSheetDidPresent');
289
+ const actionSheet = page.locator('ion-action-sheet');
290
+ const input = page.locator('#test-input');
291
+ const trigger = page.locator('#open-action-sheet');
292
+ // present action sheet
293
+ await trigger.click();
294
+ await ionActionSheetDidPresent.next();
295
+ // dismiss action sheet
296
+ await actionSheet.evaluate((el) => el.dismiss());
297
+ // verify focus is in correct location
298
+ await expect(input).toBeFocused();
299
+ });
178
300
  });
179
301
  });
@@ -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
+ });
package/dist/docs.json CHANGED
@@ -1,8 +1,8 @@
1
1
  {
2
- "timestamp": "2024-02-02T00:56:23",
2
+ "timestamp": "2024-02-24T20:38:59",
3
3
  "compiler": {
4
4
  "name": "@stencil/core",
5
- "version": "4.12.0",
5
+ "version": "4.12.2",
6
6
  "typescriptVersion": "5.3.3"
7
7
  },
8
8
  "components": [
@@ -806,7 +806,7 @@
806
806
  {
807
807
  "name": "role",
808
808
  "type": "string | undefined",
809
- "docs": "The role of the element that is dismissing the action sheet.\nThis can be useful in a button handler for determining which button was\nclicked to dismiss the action sheet.\nSome examples include: ``\"cancel\"`, `\"destructive\"`, \"selected\"`, and `\"backdrop\"`."
809
+ "docs": "The role of the element that is dismissing the action sheet.\nThis can be useful in a button handler for determining which button was\nclicked to dismiss the action sheet.\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."
810
810
  }
811
811
  ],
812
812
  "references": {
@@ -827,7 +827,7 @@
827
827
  {
828
828
  "name": "role",
829
829
  "type": "string | undefined",
830
- "docs": "The role of the element that is dismissing the action sheet.\nThis can be useful in a button handler for determining which button was\nclicked to dismiss the action sheet.\nSome examples include: ``\"cancel\"`, `\"destructive\"`, \"selected\"`, and `\"backdrop\"`."
830
+ "docs": "The role of the element that is dismissing the action sheet.\nThis can be useful in a button handler for determining which button was\nclicked to dismiss the action sheet.\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."
831
831
  }
832
832
  ],
833
833
  "docs": "Dismiss the action sheet overlay after it has been presented.",
@@ -838,7 +838,7 @@
838
838
  },
839
839
  {
840
840
  "name": "param",
841
- "text": "role The role of the element that is dismissing the action sheet.\nThis can be useful in a button handler for determining which button was\nclicked to dismiss the action sheet.\nSome examples include: ``\"cancel\"`, `\"destructive\"`, \"selected\"`, and `\"backdrop\"`."
841
+ "text": "role The role of the element that is dismissing the action sheet.\nThis can be useful in a button handler for determining which button was\nclicked to dismiss the action sheet.\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."
842
842
  }
843
843
  ]
844
844
  },
@@ -1637,7 +1637,7 @@
1637
1637
  {
1638
1638
  "name": "role",
1639
1639
  "type": "string | undefined",
1640
- "docs": "The role of the element that is dismissing the alert.\nThis can be useful in a button handler for determining which button was\nclicked to dismiss the alert.\nSome examples include: ``\"cancel\"`, `\"destructive\"`, \"selected\"`, and `\"backdrop\"`."
1640
+ "docs": "The role of the element that is dismissing the alert.\nThis can be useful in a button handler for determining which button was\nclicked to dismiss the alert.\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."
1641
1641
  }
1642
1642
  ],
1643
1643
  "references": {
@@ -1658,7 +1658,7 @@
1658
1658
  {
1659
1659
  "name": "role",
1660
1660
  "type": "string | undefined",
1661
- "docs": "The role of the element that is dismissing the alert.\nThis can be useful in a button handler for determining which button was\nclicked to dismiss the alert.\nSome examples include: ``\"cancel\"`, `\"destructive\"`, \"selected\"`, and `\"backdrop\"`."
1661
+ "docs": "The role of the element that is dismissing the alert.\nThis can be useful in a button handler for determining which button was\nclicked to dismiss the alert.\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."
1662
1662
  }
1663
1663
  ],
1664
1664
  "docs": "Dismiss the alert overlay after it has been presented.",
@@ -1669,7 +1669,7 @@
1669
1669
  },
1670
1670
  {
1671
1671
  "name": "param",
1672
- "text": "role The role of the element that is dismissing the alert.\nThis can be useful in a button handler for determining which button was\nclicked to dismiss the alert.\nSome examples include: ``\"cancel\"`, `\"destructive\"`, \"selected\"`, and `\"backdrop\"`."
1672
+ "text": "role The role of the element that is dismissing the alert.\nThis can be useful in a button handler for determining which button was\nclicked to dismiss the alert.\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."
1673
1673
  }
1674
1674
  ]
1675
1675
  },
@@ -13797,7 +13797,7 @@
13797
13797
  {
13798
13798
  "name": "role",
13799
13799
  "type": "string | undefined",
13800
- "docs": "The role of the element that is dismissing the loading.\nThis can be useful in a button handler for determining which button was\nclicked to dismiss the loading.\nSome examples include: ``\"cancel\"`, `\"destructive\"`, \"selected\"`, and `\"backdrop\"`."
13800
+ "docs": "The role of the element that is dismissing the loading.\nThis can be useful in a button handler for determining which button was\nclicked to dismiss the loading.\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."
13801
13801
  }
13802
13802
  ],
13803
13803
  "references": {
@@ -13818,7 +13818,7 @@
13818
13818
  {
13819
13819
  "name": "role",
13820
13820
  "type": "string | undefined",
13821
- "docs": "The role of the element that is dismissing the loading.\nThis can be useful in a button handler for determining which button was\nclicked to dismiss the loading.\nSome examples include: ``\"cancel\"`, `\"destructive\"`, \"selected\"`, and `\"backdrop\"`."
13821
+ "docs": "The role of the element that is dismissing the loading.\nThis can be useful in a button handler for determining which button was\nclicked to dismiss the loading.\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."
13822
13822
  }
13823
13823
  ],
13824
13824
  "docs": "Dismiss the loading overlay after it has been presented.",
@@ -13829,7 +13829,7 @@
13829
13829
  },
13830
13830
  {
13831
13831
  "name": "param",
13832
- "text": "role The role of the element that is dismissing the loading.\nThis can be useful in a button handler for determining which button was\nclicked to dismiss the loading.\nSome examples include: ``\"cancel\"`, `\"destructive\"`, \"selected\"`, and `\"backdrop\"`."
13832
+ "text": "role The role of the element that is dismissing the loading.\nThis can be useful in a button handler for determining which button was\nclicked to dismiss the loading.\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."
13833
13833
  }
13834
13834
  ]
13835
13835
  },
@@ -15526,7 +15526,7 @@
15526
15526
  {
15527
15527
  "name": "role",
15528
15528
  "type": "string | undefined",
15529
- "docs": "The role of the element that is dismissing the modal. For example, 'cancel' or 'backdrop'."
15529
+ "docs": "The role of the element that is dismissing the modal. For example, 'cancel' or '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."
15530
15530
  }
15531
15531
  ],
15532
15532
  "references": {
@@ -15551,7 +15551,7 @@
15551
15551
  {
15552
15552
  "name": "role",
15553
15553
  "type": "string | undefined",
15554
- "docs": "The role of the element that is dismissing the modal. For example, 'cancel' or 'backdrop'."
15554
+ "docs": "The role of the element that is dismissing the modal. For example, 'cancel' or '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."
15555
15555
  }
15556
15556
  ],
15557
15557
  "docs": "Dismiss the modal overlay after it has been presented.",
@@ -15562,7 +15562,7 @@
15562
15562
  },
15563
15563
  {
15564
15564
  "name": "param",
15565
- "text": "role The role of the element that is dismissing the modal. For example, 'cancel' or 'backdrop'."
15565
+ "text": "role The role of the element that is dismissing the modal. For example, 'cancel' or '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."
15566
15566
  }
15567
15567
  ]
15568
15568
  },
@@ -17787,7 +17787,7 @@
17787
17787
  {
17788
17788
  "name": "role",
17789
17789
  "type": "string | undefined",
17790
- "docs": "The role of the element that is dismissing the picker.\nThis can be useful in a button handler for determining which button was\nclicked to dismiss the picker.\nSome examples include: ``\"cancel\"`, `\"destructive\"`, \"selected\"`, and `\"backdrop\"`."
17790
+ "docs": "The role of the element that is dismissing the picker.\nThis can be useful in a button handler for determining which button was\nclicked to dismiss the picker.\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."
17791
17791
  }
17792
17792
  ],
17793
17793
  "references": {
@@ -17808,7 +17808,7 @@
17808
17808
  {
17809
17809
  "name": "role",
17810
17810
  "type": "string | undefined",
17811
- "docs": "The role of the element that is dismissing the picker.\nThis can be useful in a button handler for determining which button was\nclicked to dismiss the picker.\nSome examples include: ``\"cancel\"`, `\"destructive\"`, \"selected\"`, and `\"backdrop\"`."
17811
+ "docs": "The role of the element that is dismissing the picker.\nThis can be useful in a button handler for determining which button was\nclicked to dismiss the picker.\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."
17812
17812
  }
17813
17813
  ],
17814
17814
  "docs": "Dismiss the picker overlay after it has been presented.",
@@ -17819,7 +17819,7 @@
17819
17819
  },
17820
17820
  {
17821
17821
  "name": "param",
17822
- "text": "role The role of the element that is dismissing the picker.\nThis can be useful in a button handler for determining which button was\nclicked to dismiss the picker.\nSome examples include: ``\"cancel\"`, `\"destructive\"`, \"selected\"`, and `\"backdrop\"`."
17822
+ "text": "role The role of the element that is dismissing the picker.\nThis can be useful in a button handler for determining which button was\nclicked to dismiss the picker.\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."
17823
17823
  }
17824
17824
  ]
17825
17825
  },
@@ -18829,7 +18829,7 @@
18829
18829
  {
18830
18830
  "name": "dismissParentPopover",
18831
18831
  "type": "boolean",
18832
- "docs": "If `true`, dismissing this popover will also dismiss\na parent popover if this popover is nested. Defaults to `true`."
18832
+ "docs": "If `true`, dismissing this popover will also dismiss\na parent popover if this popover is nested. Defaults to `true`.\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."
18833
18833
  }
18834
18834
  ],
18835
18835
  "references": {
@@ -18859,7 +18859,7 @@
18859
18859
  {
18860
18860
  "name": "dismissParentPopover",
18861
18861
  "type": "boolean",
18862
- "docs": "If `true`, dismissing this popover will also dismiss\na parent popover if this popover is nested. Defaults to `true`."
18862
+ "docs": "If `true`, dismissing this popover will also dismiss\na parent popover if this popover is nested. Defaults to `true`.\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."
18863
18863
  }
18864
18864
  ],
18865
18865
  "docs": "Dismiss the popover overlay after it has been presented.",
@@ -18874,7 +18874,7 @@
18874
18874
  },
18875
18875
  {
18876
18876
  "name": "param",
18877
- "text": "dismissParentPopover If `true`, dismissing this popover will also dismiss\na parent popover if this popover is nested. Defaults to `true`."
18877
+ "text": "dismissParentPopover If `true`, dismissing this popover will also dismiss\na parent popover if this popover is nested. Defaults to `true`.\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."
18878
18878
  }
18879
18879
  ]
18880
18880
  },
@@ -28180,7 +28180,7 @@
28180
28180
  {
28181
28181
  "name": "role",
28182
28182
  "type": "string | undefined",
28183
- "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\"`."
28183
+ "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."
28184
28184
  }
28185
28185
  ],
28186
28186
  "references": {
@@ -28206,7 +28206,7 @@
28206
28206
  {
28207
28207
  "name": "role",
28208
28208
  "type": "string | undefined",
28209
- "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\"`."
28209
+ "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."
28210
28210
  }
28211
28211
  ],
28212
28212
  "docs": "Dismiss the toast overlay after it has been presented.",
@@ -28217,7 +28217,7 @@
28217
28217
  },
28218
28218
  {
28219
28219
  "name": "param",
28220
- "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\"`."
28220
+ "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."
28221
28221
  }
28222
28222
  ]
28223
28223
  },
@@ -2,7 +2,7 @@
2
2
  * (C) Ionic http://ionicframework.com - MIT License
3
3
  */
4
4
  import { w as win } from './index-a5d50daf.js';
5
- import { r as raf } from './helpers-c0b9ca37.js';
5
+ import { r as raf } from './helpers-be245865.js';
6
6
 
7
7
  let animationPrefix;
8
8
  /**
@@ -1,7 +1,7 @@
1
1
  /*!
2
2
  * (C) Ionic http://ionicframework.com - MIT License
3
3
  */
4
- import { i as initialize } from './ionic-global-778b7863.js';
4
+ import { i as initialize } from './ionic-global-ad9a1810.js';
5
5
 
6
6
  const globalScripts = initialize;
7
7
 
@@ -1,7 +1,7 @@
1
1
  /*!
2
2
  * (C) Ionic http://ionicframework.com - MIT License
3
3
  */
4
- import { w as writeTask } from './index-73881b51.js';
4
+ import { w as writeTask } from './index-4c30cddd.js';
5
5
  import { h as hapticSelectionEnd, a as hapticSelectionStart, b as hapticSelectionChanged } from './haptic-554688a5.js';
6
6
  import { createGesture } from './index-2cf77112.js';
7
7