@ionic/core 7.5.8-nightly.20231206 → 7.6.0

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 (381) hide show
  1. package/components/animation.js +12 -11
  2. package/components/checkbox.js +5 -3
  3. package/components/index4.js +10 -12
  4. package/components/index5.js +0 -22
  5. package/components/input-shims.js +12 -7
  6. package/components/input.utils.js +3 -2
  7. package/components/ion-datetime.js +2 -2
  8. package/components/ion-infinite-scroll.js +11 -3
  9. package/components/ion-input.js +31 -8
  10. package/components/ion-modal.js +2 -2
  11. package/components/ion-range.js +5 -3
  12. package/components/ion-select.js +44 -29
  13. package/components/ion-skeleton-text.js +14 -1
  14. package/components/ion-textarea.js +30 -7
  15. package/components/ion-toast.js +419 -74
  16. package/components/ion-toggle.js +5 -3
  17. package/components/item.js +2 -2
  18. package/components/label.js +2 -2
  19. package/components/overlays.js +2 -1
  20. package/components/radio-group.js +2 -0
  21. package/components/radio.js +45 -5
  22. package/dist/cjs/{animation-cc40e39c.js → animation-9b401d39.js} +13 -12
  23. package/dist/cjs/{button-active-417ccdcb.js → button-active-a5185907.js} +1 -1
  24. package/dist/cjs/{capacitor-46980811.js → capacitor-c04564bf.js} +1 -1
  25. package/dist/cjs/compare-with-utils-df1001d7.js +44 -0
  26. package/dist/cjs/{haptic-216df36c.js → haptic-b882e0bb.js} +1 -1
  27. package/dist/cjs/{index-8c1e77d6.js → index-b4f986cd.js} +1 -1
  28. package/dist/cjs/index-c8d52405.js +10 -0
  29. package/dist/cjs/{index-5cbb20f9.js → index-ce101dc9.js} +11 -13
  30. package/dist/cjs/{index-d4c2e02c.js → index-f8f13389.js} +2 -2
  31. package/dist/cjs/index.cjs.js +8 -8
  32. package/dist/cjs/{input-shims-87102b6a.js → input-shims-a23bb0f4.js} +15 -10
  33. package/dist/cjs/{input.utils-2a11c1fe.js → input.utils-3d0166a2.js} +4 -3
  34. package/dist/cjs/ion-action-sheet.cjs.entry.js +6 -6
  35. package/dist/cjs/ion-alert.cjs.entry.js +6 -6
  36. package/dist/cjs/ion-app_8.cjs.entry.js +8 -8
  37. package/dist/cjs/ion-checkbox.cjs.entry.js +5 -3
  38. package/dist/cjs/ion-datetime_3.cjs.entry.js +7 -7
  39. package/dist/cjs/ion-infinite-scroll_2.cjs.entry.js +11 -3
  40. package/dist/cjs/ion-input.cjs.entry.js +34 -11
  41. package/dist/cjs/ion-item_8.cjs.entry.js +17 -4
  42. package/dist/cjs/ion-loading.cjs.entry.js +3 -3
  43. package/dist/cjs/ion-menu_3.cjs.entry.js +5 -5
  44. package/dist/cjs/ion-modal.cjs.entry.js +8 -8
  45. package/dist/cjs/ion-nav_2.cjs.entry.js +1 -1
  46. package/dist/cjs/ion-picker-column-internal.cjs.entry.js +3 -3
  47. package/dist/cjs/ion-popover.cjs.entry.js +4 -4
  48. package/dist/cjs/ion-radio_2.cjs.entry.js +9 -4
  49. package/dist/cjs/ion-range.cjs.entry.js +5 -3
  50. package/dist/cjs/ion-refresher_2.cjs.entry.js +4 -4
  51. package/dist/cjs/ion-reorder_2.cjs.entry.js +3 -3
  52. package/dist/cjs/ion-select_3.cjs.entry.js +51 -35
  53. package/dist/cjs/ion-tab-bar_2.cjs.entry.js +4 -4
  54. package/dist/cjs/ion-textarea.cjs.entry.js +33 -10
  55. package/dist/cjs/ion-toast.cjs.entry.js +434 -92
  56. package/dist/cjs/ion-toggle.cjs.entry.js +8 -6
  57. package/dist/cjs/ionic.cjs.js +1 -1
  58. package/dist/cjs/{ios.transition-a4ffb5a2.js → ios.transition-6787b799.js} +3 -3
  59. package/dist/cjs/{keyboard-9390928c.js → keyboard-0272231f.js} +1 -1
  60. package/dist/cjs/{keyboard-7d621ee9.js → keyboard-af1bb365.js} +3 -3
  61. package/dist/cjs/{keyboard-controller-2158b478.js → keyboard-controller-c05e747a.js} +2 -2
  62. package/dist/cjs/loader.cjs.js +1 -1
  63. package/dist/cjs/{md.transition-292abe1c.js → md.transition-e033d20a.js} +3 -3
  64. package/dist/cjs/{notch-controller-1dce508a.js → notch-controller-9735e7ac.js} +1 -1
  65. package/dist/cjs/{overlays-5c379703.js → overlays-27a6fb16.js} +3 -1
  66. package/dist/collection/components/checkbox/checkbox.ios.css +0 -6
  67. package/dist/collection/components/checkbox/checkbox.js +4 -1
  68. package/dist/collection/components/checkbox/checkbox.md.css +0 -6
  69. package/dist/collection/components/checkbox/test/checkbox.spec.js +14 -0
  70. package/dist/collection/components/datetime/datetime.ios.css +1 -0
  71. package/dist/collection/components/datetime/datetime.md.css +1 -0
  72. package/dist/collection/components/infinite-scroll/infinite-scroll.js +11 -3
  73. package/dist/collection/components/infinite-scroll/test/small-dom-update/infinite-scroll.e2e.js +31 -0
  74. package/dist/collection/components/input/input.ios.css +10 -3
  75. package/dist/collection/components/input/input.js +31 -6
  76. package/dist/collection/components/input/input.md.css +13 -12
  77. package/dist/collection/components/input/test/slot/input.e2e.js +51 -0
  78. package/dist/collection/components/item/item.ios.css +41 -3
  79. package/dist/collection/components/item/item.md.css +41 -3
  80. package/dist/collection/components/item/test/basic/item.e2e.js +1 -1
  81. package/dist/collection/components/item/test/disabled/item.e2e.js +0 -1
  82. package/dist/collection/components/label/label.ios.css +14 -3
  83. package/dist/collection/components/label/label.md.css +14 -3
  84. package/dist/collection/components/modal/gestures/swipe-to-close.js +2 -1
  85. package/dist/collection/components/note/test/a11y/note.e2e.js +43 -0
  86. package/dist/collection/components/radio/radio.ios.css +0 -6
  87. package/dist/collection/components/radio/radio.js +7 -3
  88. package/dist/collection/components/radio/radio.md.css +0 -6
  89. package/dist/collection/components/radio/test/radio.spec.js +14 -0
  90. package/dist/collection/components/radio-group/radio-group.js +24 -0
  91. package/dist/collection/components/radio-group/test/radio-group.spec.js +69 -0
  92. package/dist/collection/components/range/range.ios.css +0 -6
  93. package/dist/collection/components/range/range.js +4 -1
  94. package/dist/collection/components/range/range.md.css +0 -6
  95. package/dist/collection/components/range/test/range.spec.js +16 -0
  96. package/dist/collection/components/select/select.ios.css +60 -7
  97. package/dist/collection/components/select/select.js +45 -28
  98. package/dist/collection/components/select/select.md.css +63 -19
  99. package/dist/collection/components/select/test/item/select.e2e.js +15 -0
  100. package/dist/collection/components/select/test/label/select.e2e.js +1 -1
  101. package/dist/collection/components/select/test/legacy/wrapping/select.e2e.js +1 -1
  102. package/dist/collection/components/select/test/slot/select.e2e.js +67 -0
  103. package/dist/collection/components/skeleton-text/skeleton-text.js +39 -0
  104. package/dist/collection/components/textarea/test/slot/textarea.e2e.js +51 -0
  105. package/dist/collection/components/textarea/textarea.ios.css +37 -5
  106. package/dist/collection/components/textarea/textarea.js +30 -5
  107. package/dist/collection/components/textarea/textarea.md.css +47 -14
  108. package/dist/collection/components/toast/animations/ios.enter.js +2 -1
  109. package/dist/collection/components/toast/animations/md.enter.js +4 -3
  110. package/dist/collection/components/toast/animations/utils.js +20 -14
  111. package/dist/collection/components/toast/gestures/swipe-to-dismiss.js +267 -0
  112. package/dist/collection/components/toast/test/swipe-gesture/toast.e2e.js +84 -0
  113. package/dist/collection/components/toast/test/toast-config.spec.js +25 -0
  114. package/dist/collection/components/toast/test/toast.spec.js +80 -0
  115. package/dist/collection/components/toast/toast.ios.css +10 -10
  116. package/dist/collection/components/toast/toast.js +104 -1
  117. package/dist/collection/components/toast/toast.md.css +10 -0
  118. package/dist/collection/components/toggle/test/toggle.spec.js +12 -0
  119. package/dist/collection/components/toggle/toggle.ios.css +0 -6
  120. package/dist/collection/components/toggle/toggle.js +4 -1
  121. package/dist/collection/components/toggle/toggle.md.css +0 -6
  122. package/dist/collection/utils/animation/animation.js +12 -11
  123. package/dist/collection/utils/animation/test/animation.spec.js +16 -0
  124. package/dist/collection/utils/browser/index.js +0 -22
  125. package/dist/collection/utils/forms/compare-with-utils.js +39 -0
  126. package/dist/collection/utils/forms/index.js +1 -0
  127. package/dist/collection/utils/input-shims/input-shims.js +12 -6
  128. package/dist/collection/utils/menu-controller/index.js +10 -12
  129. package/dist/collection/utils/overlays.js +1 -0
  130. package/dist/collection/utils/slot-mutation-controller.js +3 -2
  131. package/dist/docs.json +159 -2
  132. package/dist/esm/{animation-fb0e0f6f.js → animation-dde8cc0d.js} +13 -12
  133. package/dist/esm/{button-active-3fdf3e4f.js → button-active-c6ee4f50.js} +1 -1
  134. package/dist/esm/{capacitor-b0e5fe83.js → capacitor-59395cbd.js} +1 -1
  135. package/dist/esm/compare-with-utils-a96ff2ea.js +41 -0
  136. package/dist/esm/{haptic-152c4172.js → haptic-554688a5.js} +1 -1
  137. package/dist/esm/{index-80492ed3.js → index-0c12c22b.js} +11 -13
  138. package/dist/esm/{index-d8817fb0.js → index-1932b201.js} +2 -2
  139. package/dist/esm/{index-ba9976bb.js → index-82eeb47f.js} +1 -1
  140. package/dist/esm/index-a5d50daf.js +7 -0
  141. package/dist/esm/index.js +8 -8
  142. package/dist/esm/{input-shims-0a2e541d.js → input-shims-6539ce13.js} +14 -9
  143. package/dist/esm/{input.utils-2846d430.js → input.utils-a5a2d164.js} +4 -3
  144. package/dist/esm/ion-action-sheet.entry.js +6 -6
  145. package/dist/esm/ion-alert.entry.js +6 -6
  146. package/dist/esm/ion-app_8.entry.js +8 -8
  147. package/dist/esm/ion-checkbox.entry.js +5 -3
  148. package/dist/esm/ion-datetime_3.entry.js +7 -7
  149. package/dist/esm/ion-infinite-scroll_2.entry.js +11 -3
  150. package/dist/esm/ion-input.entry.js +34 -11
  151. package/dist/esm/ion-item_8.entry.js +17 -4
  152. package/dist/esm/ion-loading.entry.js +3 -3
  153. package/dist/esm/ion-menu_3.entry.js +5 -5
  154. package/dist/esm/ion-modal.entry.js +8 -8
  155. package/dist/esm/ion-nav_2.entry.js +1 -1
  156. package/dist/esm/ion-picker-column-internal.entry.js +3 -3
  157. package/dist/esm/ion-popover.entry.js +4 -4
  158. package/dist/esm/ion-radio_2.entry.js +9 -4
  159. package/dist/esm/ion-range.entry.js +5 -3
  160. package/dist/esm/ion-refresher_2.entry.js +4 -4
  161. package/dist/esm/ion-reorder_2.entry.js +3 -3
  162. package/dist/esm/ion-select_3.entry.js +47 -31
  163. package/dist/esm/ion-tab-bar_2.entry.js +4 -4
  164. package/dist/esm/ion-textarea.entry.js +33 -10
  165. package/dist/esm/ion-toast.entry.js +417 -75
  166. package/dist/esm/ion-toggle.entry.js +8 -6
  167. package/dist/esm/ionic.js +1 -1
  168. package/dist/esm/{ios.transition-fd16bec1.js → ios.transition-802a84a6.js} +3 -3
  169. package/dist/esm/{keyboard-c402e885.js → keyboard-52278bd7.js} +3 -3
  170. package/dist/esm/{keyboard-dbb05fb9.js → keyboard-73175e24.js} +1 -1
  171. package/dist/esm/{keyboard-controller-5d90929a.js → keyboard-controller-ec5c2bfa.js} +2 -2
  172. package/dist/esm/loader.js +1 -1
  173. package/dist/esm/{md.transition-94ac93e1.js → md.transition-43c2874d.js} +3 -3
  174. package/dist/esm/{notch-controller-d09b6aca.js → notch-controller-fea7f9c5.js} +1 -1
  175. package/dist/esm/{overlays-abf58489.js → overlays-32ef481d.js} +3 -2
  176. package/dist/esm-es5/{animation-fb0e0f6f.js → animation-dde8cc0d.js} +1 -1
  177. package/dist/esm-es5/{button-active-3fdf3e4f.js → button-active-c6ee4f50.js} +1 -1
  178. package/dist/esm-es5/{capacitor-b0e5fe83.js → capacitor-59395cbd.js} +1 -1
  179. package/dist/esm-es5/compare-with-utils-a96ff2ea.js +4 -0
  180. package/dist/esm-es5/{haptic-152c4172.js → haptic-554688a5.js} +1 -1
  181. package/dist/esm-es5/index-0c12c22b.js +4 -0
  182. package/dist/esm-es5/{index-d8817fb0.js → index-1932b201.js} +1 -1
  183. package/dist/esm-es5/{index-ba9976bb.js → index-82eeb47f.js} +1 -1
  184. package/dist/esm-es5/index.js +1 -1
  185. package/dist/esm-es5/input-shims-6539ce13.js +4 -0
  186. package/dist/esm-es5/input.utils-a5a2d164.js +4 -0
  187. package/dist/esm-es5/ion-action-sheet.entry.js +1 -1
  188. package/dist/esm-es5/ion-alert.entry.js +1 -1
  189. package/dist/esm-es5/ion-app_8.entry.js +1 -1
  190. package/dist/esm-es5/ion-checkbox.entry.js +1 -1
  191. package/dist/esm-es5/ion-datetime_3.entry.js +1 -1
  192. package/dist/esm-es5/ion-infinite-scroll_2.entry.js +1 -1
  193. package/dist/esm-es5/ion-input.entry.js +1 -1
  194. package/dist/esm-es5/ion-item_8.entry.js +1 -1
  195. package/dist/esm-es5/ion-loading.entry.js +1 -1
  196. package/dist/esm-es5/ion-menu_3.entry.js +1 -1
  197. package/dist/esm-es5/ion-modal.entry.js +1 -1
  198. package/dist/esm-es5/ion-nav_2.entry.js +1 -1
  199. package/dist/esm-es5/ion-picker-column-internal.entry.js +1 -1
  200. package/dist/esm-es5/ion-popover.entry.js +1 -1
  201. package/dist/esm-es5/ion-radio_2.entry.js +1 -1
  202. package/dist/esm-es5/ion-range.entry.js +1 -1
  203. package/dist/esm-es5/ion-refresher_2.entry.js +1 -1
  204. package/dist/esm-es5/ion-reorder_2.entry.js +1 -1
  205. package/dist/esm-es5/ion-select_3.entry.js +1 -1
  206. package/dist/esm-es5/ion-tab-bar_2.entry.js +1 -1
  207. package/dist/esm-es5/ion-textarea.entry.js +1 -1
  208. package/dist/esm-es5/ion-toast.entry.js +1 -1
  209. package/dist/esm-es5/ion-toggle.entry.js +1 -1
  210. package/dist/esm-es5/ionic.js +1 -1
  211. package/dist/esm-es5/{ios.transition-fd16bec1.js → ios.transition-802a84a6.js} +1 -1
  212. package/dist/esm-es5/{keyboard-c402e885.js → keyboard-52278bd7.js} +1 -1
  213. package/dist/esm-es5/{keyboard-dbb05fb9.js → keyboard-73175e24.js} +1 -1
  214. package/dist/esm-es5/{keyboard-controller-5d90929a.js → keyboard-controller-ec5c2bfa.js} +1 -1
  215. package/dist/esm-es5/loader.js +1 -1
  216. package/dist/esm-es5/md.transition-43c2874d.js +4 -0
  217. package/dist/esm-es5/{notch-controller-d09b6aca.js → notch-controller-fea7f9c5.js} +1 -1
  218. package/dist/esm-es5/{overlays-abf58489.js → overlays-32ef481d.js} +1 -1
  219. package/dist/html.html-data.json +14 -1
  220. package/dist/ionic/index.esm.js +1 -1
  221. package/dist/ionic/ionic.esm.js +1 -1
  222. package/dist/ionic/p-01d14eba.system.entry.js +4 -0
  223. package/dist/ionic/{p-3de71759.entry.js → p-042e6f4b.entry.js} +1 -1
  224. package/dist/ionic/p-05d83227.system.entry.js +4 -0
  225. package/dist/ionic/{p-32e19bee.system.js → p-0bd51c34.system.js} +1 -1
  226. package/dist/ionic/{p-73637557.system.entry.js → p-16756e94.system.entry.js} +1 -1
  227. package/dist/ionic/p-1b19c04b.entry.js +4 -0
  228. package/dist/ionic/{p-95c26010.system.js → p-1cca10d6.system.js} +1 -1
  229. package/dist/ionic/p-1e4371bd.js +4 -0
  230. package/dist/ionic/{p-0519cd21.entry.js → p-251666e2.entry.js} +1 -1
  231. package/dist/ionic/{p-4e8e09e1.js → p-27281edd.js} +1 -1
  232. package/dist/ionic/p-28249b10.system.entry.js +4 -0
  233. package/dist/ionic/p-28a2c2a2.entry.js +4 -0
  234. package/dist/ionic/p-29d03b3a.js +4 -0
  235. package/dist/ionic/p-2b7827c7.js +4 -0
  236. package/dist/ionic/p-2d3b9fa3.system.entry.js +4 -0
  237. package/dist/ionic/p-2d539df1.entry.js +4 -0
  238. package/dist/ionic/{p-a0126dd5.system.entry.js → p-3137c025.system.entry.js} +1 -1
  239. package/dist/ionic/{p-30029cc2.system.js → p-31fcb233.system.js} +1 -1
  240. package/dist/ionic/{p-b0dc1cf9.system.js → p-33a37fad.system.js} +1 -1
  241. package/dist/ionic/p-36d187af.js +4 -0
  242. package/dist/ionic/p-376a6063.js +4 -0
  243. package/dist/ionic/p-38f2c6bb.system.js +4 -0
  244. package/dist/ionic/{p-2ba0657d.system.entry.js → p-39c31982.system.entry.js} +1 -1
  245. package/dist/ionic/{p-75445583.js → p-3a75d7fd.js} +1 -1
  246. package/dist/ionic/{p-d40a974a.entry.js → p-3dd98a73.entry.js} +1 -1
  247. package/dist/ionic/p-3e6b47e8.system.entry.js +4 -0
  248. package/dist/ionic/p-3f5179b5.entry.js +4 -0
  249. package/dist/ionic/p-40f68333.system.js +4 -0
  250. package/dist/ionic/{p-643a8fae.js → p-42f189f4.js} +1 -1
  251. package/dist/ionic/{p-9c3b6849.entry.js → p-438e1b8a.entry.js} +1 -1
  252. package/dist/ionic/{p-b752714f.system.entry.js → p-46d400b4.system.entry.js} +1 -1
  253. package/dist/ionic/{p-61d7d7fb.js → p-47b6ba5b.js} +1 -1
  254. package/dist/ionic/{p-b04e4d62.entry.js → p-4d67d27a.entry.js} +1 -1
  255. package/dist/ionic/{p-0b1bc636.entry.js → p-4f3ae45a.entry.js} +1 -1
  256. package/dist/ionic/{p-18b6bd23.system.entry.js → p-517a9885.system.entry.js} +1 -1
  257. package/dist/ionic/p-53ec4f1c.system.js +4 -0
  258. package/dist/ionic/p-5e4eec2e.entry.js +4 -0
  259. package/dist/ionic/{p-57477107.system.js → p-5e745192.system.js} +1 -1
  260. package/dist/ionic/{p-ad019ef0.entry.js → p-5eda1d7d.entry.js} +1 -1
  261. package/dist/ionic/{p-4890093d.js → p-6de472cb.js} +1 -1
  262. package/dist/ionic/{p-08f196ce.system.entry.js → p-6de62649.system.entry.js} +1 -1
  263. package/dist/ionic/p-72f6ff89.js +4 -0
  264. package/dist/ionic/p-765f4dde.entry.js +4 -0
  265. package/dist/ionic/{p-3f6270b3.entry.js → p-78aadecb.entry.js} +1 -1
  266. package/dist/ionic/p-7d92bf15.system.entry.js +4 -0
  267. package/dist/ionic/p-7ee0f3f2.entry.js +4 -0
  268. package/dist/ionic/p-8314281e.system.js +4 -0
  269. package/dist/ionic/p-88d5fbd3.js +4 -0
  270. package/dist/ionic/{p-0e4f2e17.system.js → p-8985cdb6.system.js} +1 -1
  271. package/dist/ionic/{p-d7be6b7e.system.entry.js → p-8acae6b0.system.entry.js} +1 -1
  272. package/dist/ionic/p-8d69a624.entry.js +4 -0
  273. package/dist/ionic/p-8de17614.system.entry.js +4 -0
  274. package/dist/ionic/p-91d33c4a.js +4 -0
  275. package/dist/ionic/p-979d4f5c.system.js +4 -0
  276. package/dist/ionic/p-9b7f0b0f.entry.js +4 -0
  277. package/dist/ionic/p-9e447eb1.system.js +4 -0
  278. package/dist/ionic/p-9f6ee2c0.system.entry.js +4 -0
  279. package/dist/ionic/{p-94389114.system.entry.js → p-a0bb7b92.system.entry.js} +1 -1
  280. package/dist/ionic/{p-f2c21dae.system.js → p-a0d7bb5e.system.js} +1 -1
  281. package/dist/ionic/{p-82045bc1.entry.js → p-a3277a67.entry.js} +1 -1
  282. package/dist/ionic/{p-50880712.entry.js → p-a9978d08.entry.js} +1 -1
  283. package/dist/ionic/{p-3b686a65.system.entry.js → p-ada96dd0.system.entry.js} +1 -1
  284. package/dist/ionic/p-afd6ca9d.entry.js +4 -0
  285. package/dist/ionic/p-b56d0866.system.entry.js +4 -0
  286. package/dist/ionic/{p-67da080d.entry.js → p-b6f9d32a.entry.js} +1 -1
  287. package/dist/ionic/p-c61cc894.js +4 -0
  288. package/dist/ionic/{p-304383f9.system.js → p-cabad15b.system.js} +1 -1
  289. package/dist/ionic/{p-31158892.js → p-cdbeaadc.js} +1 -1
  290. package/dist/ionic/p-d032f825.system.entry.js +4 -0
  291. package/dist/ionic/p-d51674c5.system.js +4 -0
  292. package/dist/ionic/{p-98d82c73.system.js → p-ddbb2d5b.system.js} +1 -1
  293. package/dist/ionic/p-de6f8b28.system.js +4 -0
  294. package/dist/ionic/p-de756e5c.js +4 -0
  295. package/dist/ionic/{p-73ea8f82.system.entry.js → p-dee7c1d0.system.entry.js} +1 -1
  296. package/dist/ionic/p-dfd9432a.entry.js +4 -0
  297. package/dist/ionic/{p-af5cfad2.system.js → p-e24ce1e5.system.js} +1 -1
  298. package/dist/ionic/p-e3584231.system.js +1 -1
  299. package/dist/ionic/p-f0445d82.system.entry.js +4 -0
  300. package/dist/ionic/p-f656e032.system.entry.js +4 -0
  301. package/dist/ionic/{p-17f893be.js → p-f70970cf.js} +1 -1
  302. package/dist/ionic/{p-e553006f.system.entry.js → p-fba0a6e7.system.entry.js} +1 -1
  303. package/dist/ionic/p-feae5133.entry.js +4 -0
  304. package/dist/types/components/checkbox/checkbox.d.ts +1 -0
  305. package/dist/types/components/infinite-scroll/infinite-scroll.d.ts +7 -0
  306. package/dist/types/components/input/input.d.ts +2 -0
  307. package/dist/types/components/radio/radio.d.ts +1 -0
  308. package/dist/types/components/radio-group/radio-group-interface.d.ts +1 -0
  309. package/dist/types/components/radio-group/radio-group.d.ts +8 -1
  310. package/dist/types/components/range/range.d.ts +1 -0
  311. package/dist/types/components/router/router.d.ts +2 -1
  312. package/dist/types/components/select/select.d.ts +6 -1
  313. package/dist/types/components/skeleton-text/skeleton-text.d.ts +9 -1
  314. package/dist/types/components/textarea/textarea.d.ts +2 -0
  315. package/dist/types/components/toast/animations/utils.d.ts +15 -4
  316. package/dist/types/components/toast/gestures/swipe-to-dismiss.d.ts +9 -0
  317. package/dist/types/components/toast/toast-interface.d.ts +2 -0
  318. package/dist/types/components/toast/toast.d.ts +28 -1
  319. package/dist/types/components/toggle/toggle.d.ts +1 -0
  320. package/dist/types/components.d.ts +37 -6
  321. package/dist/types/interface.d.ts +1 -5
  322. package/dist/types/jest.d.ts +5 -0
  323. package/dist/types/utils/animation/animation-interface.d.ts +4 -4
  324. package/dist/types/utils/browser/index.d.ts +11 -2
  325. package/dist/types/utils/forms/compare-with-utils.d.ts +18 -0
  326. package/dist/types/utils/forms/index.d.ts +1 -0
  327. package/dist/types/utils/hardware-back-button.d.ts +4 -0
  328. package/dist/types/utils/overlays.d.ts +1 -0
  329. package/dist/types/utils/slot-mutation-controller.d.ts +2 -2
  330. package/hydrate/index.js +643 -184
  331. package/package.json +1 -1
  332. package/dist/cjs/index-306a7476.js +0 -32
  333. package/dist/collection/components/item/test/text/item.e2e.js +0 -14
  334. package/dist/esm/index-7a14ecec.js +0 -29
  335. package/dist/esm-es5/index-80492ed3.js +0 -4
  336. package/dist/esm-es5/input-shims-0a2e541d.js +0 -4
  337. package/dist/esm-es5/input.utils-2846d430.js +0 -4
  338. package/dist/esm-es5/md.transition-94ac93e1.js +0 -4
  339. package/dist/ionic/p-1d17219f.entry.js +0 -4
  340. package/dist/ionic/p-232d1f22.entry.js +0 -4
  341. package/dist/ionic/p-25b32c3d.entry.js +0 -4
  342. package/dist/ionic/p-2ab4e925.system.entry.js +0 -4
  343. package/dist/ionic/p-2d5aeccc.js +0 -4
  344. package/dist/ionic/p-2d600c25.system.js +0 -4
  345. package/dist/ionic/p-308e1341.js +0 -4
  346. package/dist/ionic/p-32303650.system.entry.js +0 -4
  347. package/dist/ionic/p-34c39c48.entry.js +0 -4
  348. package/dist/ionic/p-3c58a71b.js +0 -4
  349. package/dist/ionic/p-3e960213.system.entry.js +0 -4
  350. package/dist/ionic/p-3fd26bd6.system.entry.js +0 -4
  351. package/dist/ionic/p-3fe96156.system.js +0 -4
  352. package/dist/ionic/p-42ba3902.entry.js +0 -4
  353. package/dist/ionic/p-4a31c99f.entry.js +0 -4
  354. package/dist/ionic/p-5a68960f.entry.js +0 -4
  355. package/dist/ionic/p-6470b136.entry.js +0 -4
  356. package/dist/ionic/p-6c37f051.js +0 -4
  357. package/dist/ionic/p-7b8d0af2.system.entry.js +0 -4
  358. package/dist/ionic/p-7faba551.system.entry.js +0 -4
  359. package/dist/ionic/p-83af3685.system.js +0 -4
  360. package/dist/ionic/p-856c430d.js +0 -4
  361. package/dist/ionic/p-93000a81.system.entry.js +0 -4
  362. package/dist/ionic/p-98b14ece.entry.js +0 -4
  363. package/dist/ionic/p-990ffd0e.js +0 -4
  364. package/dist/ionic/p-a6f9dd7b.entry.js +0 -4
  365. package/dist/ionic/p-a98dc0c1.entry.js +0 -4
  366. package/dist/ionic/p-a9e3b5be.system.entry.js +0 -4
  367. package/dist/ionic/p-ab9456e9.system.entry.js +0 -4
  368. package/dist/ionic/p-b4bad293.system.entry.js +0 -4
  369. package/dist/ionic/p-c3289ef2.entry.js +0 -4
  370. package/dist/ionic/p-c3d09cf2.system.entry.js +0 -4
  371. package/dist/ionic/p-d1cb29a8.system.entry.js +0 -4
  372. package/dist/ionic/p-d43f1f3d.system.js +0 -4
  373. package/dist/ionic/p-d662d908.js +0 -4
  374. package/dist/ionic/p-d9695ad9.system.js +0 -4
  375. package/dist/ionic/p-e4d90573.js +0 -4
  376. package/dist/ionic/p-f54c72b0.system.js +0 -4
  377. package/dist/ionic/p-f7a36cd0.system.js +0 -4
  378. package/dist/ionic/p-f967631d.js +0 -4
  379. /package/dist/esm-es5/{index-7a14ecec.js → index-a5d50daf.js} +0 -0
  380. /package/dist/ionic/{p-0e94957a.system.js → p-792919fd.system.js} +0 -0
  381. /package/dist/ionic/{p-b347cfd1.js → p-7b30edcc.js} +0 -0
@@ -1,19 +1,107 @@
1
1
  /*!
2
2
  * (C) Ionic http://ionicframework.com - MIT License
3
3
  */
4
- import { proxyCustomElement, HTMLElement, createEvent, h, Host } from '@stencil/core/internal/client';
4
+ import { Build, proxyCustomElement, HTMLElement, createEvent, h, Host } from '@stencil/core/internal/client';
5
5
  import { E as ENABLE_HTML_CONTENT_DEFAULT, a as sanitizeDOMString } from './config.js';
6
6
  import { g as getElementRoot, r as raf } from './helpers.js';
7
7
  import { c as createLockController } from './lock-controller.js';
8
8
  import { p as printIonWarning } from './index6.js';
9
- import { d as createDelegateController, e as createTriggerController, i as isCancel, j as prepareOverlay, k as setOverlayId, f as present, g as dismiss, h as eventMethod, s as safeCall } from './overlays.js';
9
+ import { O as OVERLAY_GESTURE_PRIORITY, d as createDelegateController, e as createTriggerController, i as isCancel, j as prepareOverlay, k as setOverlayId, f as present, g as dismiss, h as eventMethod, s as safeCall, G as GESTURE } from './overlays.js';
10
10
  import { g as getClassMap, c as createColorClasses } from './theme.js';
11
11
  import { c as config, b as getIonMode } from './ionic-global.js';
12
12
  import { c as createAnimation } from './animation.js';
13
13
  import { w as win } from './index5.js';
14
+ import { createGesture } from './index3.js';
14
15
  import { d as defineCustomElement$3 } from './icon.js';
15
16
  import { d as defineCustomElement$2 } from './ripple-effect.js';
16
17
 
18
+ /**
19
+ * Calculate the CSS top and bottom position of the toast, to be used
20
+ * as starting points for the animation keyframes.
21
+ *
22
+ * The default animations for both MD and iOS
23
+ * use translateY, which calculates from the
24
+ * top edge of the screen. This behavior impacts
25
+ * how we compute the offset when a toast has
26
+ * position='bottom' since we need to calculate from
27
+ * the bottom edge of the screen instead.
28
+ *
29
+ * @param position The value of the toast's position prop.
30
+ * @param positionAnchor The element the toast should be anchored to,
31
+ * if applicable.
32
+ * @param mode The toast component's mode (md, ios, etc).
33
+ * @param toast A reference to the toast element itself.
34
+ */
35
+ function getAnimationPosition(position, positionAnchor, mode, toast) {
36
+ /**
37
+ * Start with a predefined offset from the edge the toast will be
38
+ * positioned relative to, whether on the screen or anchor element.
39
+ */
40
+ let offset;
41
+ if (mode === 'md') {
42
+ offset = position === 'top' ? 8 : -8;
43
+ }
44
+ else {
45
+ offset = position === 'top' ? 10 : -10;
46
+ }
47
+ /**
48
+ * If positionAnchor is defined, add in the distance from the target
49
+ * screen edge to the target anchor edge. For position="top", the
50
+ * bottom anchor edge is targeted. For position="bottom", the top
51
+ * anchor edge is targeted.
52
+ */
53
+ if (positionAnchor && win) {
54
+ warnIfAnchorIsHidden(positionAnchor, toast);
55
+ const box = positionAnchor.getBoundingClientRect();
56
+ if (position === 'top') {
57
+ offset += box.bottom;
58
+ }
59
+ else if (position === 'bottom') {
60
+ /**
61
+ * Just box.top is the distance from the top edge of the screen
62
+ * to the top edge of the anchor. We want to calculate from the
63
+ * bottom edge of the screen instead.
64
+ */
65
+ offset -= win.innerHeight - box.top;
66
+ }
67
+ /**
68
+ * We don't include safe area here because that should already be
69
+ * accounted for when checking the position of the anchor.
70
+ */
71
+ return {
72
+ top: `${offset}px`,
73
+ bottom: `${offset}px`,
74
+ };
75
+ }
76
+ else {
77
+ return {
78
+ top: `calc(${offset}px + var(--ion-safe-area-top, 0px))`,
79
+ bottom: `calc(${offset}px - var(--ion-safe-area-bottom, 0px))`,
80
+ };
81
+ }
82
+ }
83
+ /**
84
+ * If the anchor element is hidden, getBoundingClientRect()
85
+ * will return all 0s for it, which can cause unexpected
86
+ * results in the position calculation when animating.
87
+ */
88
+ function warnIfAnchorIsHidden(positionAnchor, toast) {
89
+ if (positionAnchor.offsetParent === null) {
90
+ printIonWarning('The positionAnchor element for ion-toast was found in the DOM, but appears to be hidden. This may lead to unexpected positioning of the toast.', toast);
91
+ }
92
+ }
93
+ /**
94
+ * Returns the top offset required to place
95
+ * the toast in the middle of the screen.
96
+ * Only needed when position="toast".
97
+ * @param toastHeight - The height of the ion-toast element
98
+ * @param wrapperHeight - The height of the .toast-wrapper element
99
+ * inside the toast's shadow root.
100
+ */
101
+ const getOffsetForMiddlePosition = (toastHeight, wrapperHeight) => {
102
+ return Math.floor(toastHeight / 2 - wrapperHeight / 2);
103
+ };
104
+
17
105
  /**
18
106
  * iOS Toast Enter Animation
19
107
  */
@@ -29,7 +117,7 @@ const iosEnterAnimation = (baseEl, opts) => {
29
117
  wrapperAnimation.fromTo('transform', 'translateY(-100%)', `translateY(${top})`);
30
118
  break;
31
119
  case 'middle':
32
- const topPosition = Math.floor(baseEl.clientHeight / 2 - wrapperEl.clientHeight / 2);
120
+ const topPosition = getOffsetForMiddlePosition(baseEl.clientHeight, wrapperEl.clientHeight);
33
121
  wrapperEl.style.top = `${topPosition}px`;
34
122
  wrapperAnimation.fromTo('opacity', 0.01, 1);
35
123
  break;
@@ -76,16 +164,16 @@ const mdEnterAnimation = (baseEl, opts) => {
76
164
  wrapperAnimation.addElement(wrapperEl);
77
165
  switch (position) {
78
166
  case 'top':
79
- wrapperEl.style.top = top;
167
+ wrapperEl.style.setProperty('transform', `translateY(${top})`);
80
168
  wrapperAnimation.fromTo('opacity', 0.01, 1);
81
169
  break;
82
170
  case 'middle':
83
- const topPosition = Math.floor(baseEl.clientHeight / 2 - wrapperEl.clientHeight / 2);
171
+ const topPosition = getOffsetForMiddlePosition(baseEl.clientHeight, wrapperEl.clientHeight);
84
172
  wrapperEl.style.top = `${topPosition}px`;
85
173
  wrapperAnimation.fromTo('opacity', 0.01, 1);
86
174
  break;
87
175
  default:
88
- wrapperEl.style.bottom = bottom;
176
+ wrapperEl.style.setProperty('transform', `translateY(${bottom})`);
89
177
  wrapperAnimation.fromTo('opacity', 0.01, 1);
90
178
  break;
91
179
  }
@@ -105,89 +193,267 @@ const mdLeaveAnimation = (baseEl) => {
105
193
  };
106
194
 
107
195
  /**
108
- * Calculate the CSS top and bottom position of the toast, to be used
109
- * as starting points for the animation keyframes.
110
- *
111
- * Note that MD animates bottom-positioned toasts using style.bottom,
112
- * which calculates from the bottom edge of the screen, while iOS uses
113
- * translateY, which calculates from the top edge of the screen. This
114
- * is why the bottom calculates differ slightly between modes.
115
- *
116
- * @param position The value of the toast's position prop.
117
- * @param positionAnchor The element the toast should be anchored to,
118
- * if applicable.
119
- * @param mode The toast component's mode (md, ios, etc).
120
- * @param toast A reference to the toast element itself.
196
+ * Create a gesture that allows the Toast
197
+ * to be swiped to dismiss.
198
+ * @param el - The Toast element
199
+ * @param toastPosition - The last computed position of the Toast. This is computed in the "present" method.
200
+ * @param onDismiss - A callback to fire when the Toast was swiped to dismiss.
121
201
  */
122
- function getAnimationPosition(position, positionAnchor, mode, toast) {
202
+ const createSwipeToDismissGesture = (el, toastPosition, onDismiss) => {
123
203
  /**
124
- * Start with a predefined offset from the edge the toast will be
125
- * positioned relative to, whether on the screen or anchor element.
204
+ * Users should swipe on the visible toast wrapper
205
+ * rather than on ion-toast which covers the entire screen.
206
+ * When testing the class instance the inner wrapper will not
207
+ * be defined. As a result, we use a placeholder element in those environments.
126
208
  */
127
- let offset;
128
- if (mode === 'md') {
129
- offset = 8;
130
- }
131
- else {
132
- offset = position === 'top' ? 10 : -10;
133
- }
209
+ const wrapperEl = Build.isTesting
210
+ ? document.createElement('div')
211
+ : getElementRoot(el).querySelector('.toast-wrapper');
212
+ const hostElHeight = el.clientHeight;
213
+ const wrapperElBox = wrapperEl.getBoundingClientRect();
134
214
  /**
135
- * If positionAnchor is defined, add in the distance from the target
136
- * screen edge to the target anchor edge. For position="top", the
137
- * bottom anchor edge is targeted. For position="bottom", the top
138
- * anchor edge is targeted.
215
+ * The maximum amount that
216
+ * the toast can be swiped. This should
217
+ * account for the wrapper element's height
218
+ * too so the toast can be swiped offscreen
219
+ * completely.
139
220
  */
140
- if (positionAnchor && win) {
141
- warnIfAnchorIsHidden(positionAnchor, toast);
142
- const box = positionAnchor.getBoundingClientRect();
143
- if (position === 'top') {
144
- offset += box.bottom;
221
+ let MAX_SWIPE_DISTANCE = 0;
222
+ /**
223
+ * The step value at which a toast
224
+ * is eligible for dismissing via gesture.
225
+ */
226
+ const DISMISS_THRESHOLD = 0.5;
227
+ /**
228
+ * The middle position Toast starts 50% of the way
229
+ * through the animation, so we need to use this
230
+ * as the starting point for our step values.
231
+ */
232
+ const STEP_OFFSET = el.position === 'middle' ? 0.5 : 0;
233
+ /**
234
+ * When the Toast is at the top users will be
235
+ * swiping up. As a result, the delta values will be
236
+ * negative numbers which will result in negative steps
237
+ * and thresholds. As a result, we need to make those numbers
238
+ * positive.
239
+ */
240
+ const INVERSION_FACTOR = el.position === 'top' ? -1 : 1;
241
+ /**
242
+ * The top offset that places the
243
+ * toast in the middle of the screen.
244
+ * Only needed when position="middle".
245
+ */
246
+ const topPosition = getOffsetForMiddlePosition(hostElHeight, wrapperElBox.height);
247
+ const SWIPE_UP_DOWN_KEYFRAMES = [
248
+ { offset: 0, transform: `translateY(-${topPosition + wrapperElBox.height}px)` },
249
+ { offset: 0.5, transform: `translateY(0px)` },
250
+ { offset: 1, transform: `translateY(${topPosition + wrapperElBox.height}px)` },
251
+ ];
252
+ const swipeAnimation = createAnimation('toast-swipe-to-dismiss-animation')
253
+ .addElement(wrapperEl)
254
+ /**
255
+ * The specific value here does not actually
256
+ * matter. We just need this to be a positive
257
+ * value so the animation does not jump
258
+ * to the end when the user beings to drag.
259
+ */
260
+ .duration(100);
261
+ switch (el.position) {
262
+ case 'middle':
263
+ MAX_SWIPE_DISTANCE = hostElHeight + wrapperElBox.height;
264
+ swipeAnimation.keyframes(SWIPE_UP_DOWN_KEYFRAMES);
265
+ /**
266
+ * Toast can be swiped up or down but
267
+ * should start in the middle of the screen.
268
+ */
269
+ swipeAnimation.progressStart(true, 0.5);
270
+ break;
271
+ case 'top':
272
+ /**
273
+ * The bottom edge of the wrapper
274
+ * includes the distance between the top
275
+ * of the screen and the top of the wrapper
276
+ * as well as the wrapper height so the wrapper
277
+ * can be dragged fully offscreen.
278
+ */
279
+ MAX_SWIPE_DISTANCE = wrapperElBox.bottom;
280
+ swipeAnimation.keyframes([
281
+ { offset: 0, transform: `translateY(${toastPosition.top})` },
282
+ { offset: 1, transform: 'translateY(-100%)' },
283
+ ]);
284
+ swipeAnimation.progressStart(true, 0);
285
+ break;
286
+ case 'bottom':
287
+ default:
288
+ /**
289
+ * This computes the distance between the
290
+ * top of the wrapper and the bottom of the
291
+ * screen including the height of the wrapper
292
+ * element so it can be dragged fully offscreen.
293
+ */
294
+ MAX_SWIPE_DISTANCE = hostElHeight - wrapperElBox.top;
295
+ swipeAnimation.keyframes([
296
+ { offset: 0, transform: `translateY(${toastPosition.bottom})` },
297
+ { offset: 1, transform: 'translateY(100%)' },
298
+ ]);
299
+ swipeAnimation.progressStart(true, 0);
300
+ break;
301
+ }
302
+ const computeStep = (delta) => {
303
+ return (delta * INVERSION_FACTOR) / MAX_SWIPE_DISTANCE;
304
+ };
305
+ const onMove = (detail) => {
306
+ const step = STEP_OFFSET + computeStep(detail.deltaY);
307
+ swipeAnimation.progressStep(step);
308
+ };
309
+ const onEnd = (detail) => {
310
+ const velocity = detail.velocityY;
311
+ const threshold = ((detail.deltaY + velocity * 1000) / MAX_SWIPE_DISTANCE) * INVERSION_FACTOR;
312
+ /**
313
+ * Disable the gesture for the remainder of the animation.
314
+ * It will be re-enabled if the toast animates back to
315
+ * its initial presented position.
316
+ */
317
+ gesture.enable(false);
318
+ let shouldDismiss = true;
319
+ let playTo = 1;
320
+ let step = 0;
321
+ let remainingDistance = 0;
322
+ if (el.position === 'middle') {
323
+ /**
324
+ * A middle positioned Toast appears
325
+ * in the middle of the screen (at animation offset 0.5).
326
+ * As a result, the threshold will be calculated relative
327
+ * to this starting position. In other words at animation offset 0.5
328
+ * the threshold will be 0. We want the middle Toast to be eligible
329
+ * for dismiss when the user has swiped either half way up or down the
330
+ * screen. As a result, we divide DISMISS_THRESHOLD in half. We also
331
+ * consider when the threshold is a negative in the event the
332
+ * user drags up (since the deltaY will also be negative).
333
+ */
334
+ shouldDismiss = threshold >= DISMISS_THRESHOLD / 2 || threshold <= -DISMISS_THRESHOLD / 2;
335
+ /**
336
+ * Since we are replacing the keyframes
337
+ * below the animation always starts from
338
+ * the beginning of the new keyframes.
339
+ * Similarly, we are always playing to
340
+ * the end of the new keyframes.
341
+ */
342
+ playTo = 1;
343
+ step = 0;
344
+ /**
345
+ * The Toast should animate from wherever its
346
+ * current position is to the desired end state.
347
+ *
348
+ * To begin, we get the current position of the
349
+ * Toast for its starting state.
350
+ */
351
+ const wrapperElBox = wrapperEl.getBoundingClientRect();
352
+ const startOffset = wrapperElBox.top - topPosition;
353
+ const startPosition = `${startOffset}px`;
354
+ /**
355
+ * If the deltaY is negative then the user is swiping
356
+ * up, so the Toast should animate to the top of the screen.
357
+ * If the deltaY is positive then the user is swiping
358
+ * down, so the Toast should animate to the bottom of the screen.
359
+ * We also account for when the deltaY is 0, but realistically
360
+ * that should never happen because it means the user did not drag
361
+ * the toast.
362
+ */
363
+ const offsetFactor = detail.deltaY <= 0 ? -1 : 1;
364
+ const endOffset = (topPosition + wrapperElBox.height) * offsetFactor;
365
+ /**
366
+ * If the Toast should dismiss
367
+ * then we need to figure out which edge of
368
+ * the screen it should animate towards.
369
+ * By default, the Toast will come
370
+ * back to its default state in the
371
+ * middle of the screen.
372
+ */
373
+ const endPosition = shouldDismiss ? `${endOffset}px` : '0px';
374
+ const KEYFRAMES = [
375
+ { offset: 0, transform: `translateY(${startPosition})` },
376
+ { offset: 1, transform: `translateY(${endPosition})` },
377
+ ];
378
+ swipeAnimation.keyframes(KEYFRAMES);
379
+ /**
380
+ * Compute the remaining amount of pixels the
381
+ * toast needs to move to be fully dismissed.
382
+ */
383
+ remainingDistance = endOffset - startOffset;
145
384
  }
146
- else if (position === 'bottom') {
385
+ else {
386
+ shouldDismiss = threshold >= DISMISS_THRESHOLD;
387
+ playTo = shouldDismiss ? 1 : 0;
388
+ step = computeStep(detail.deltaY);
147
389
  /**
148
- * Just box.top is the distance from the top edge of the screen
149
- * to the top edge of the anchor. We want to calculate from the
150
- * bottom edge of the screen instead.
390
+ * Compute the remaining amount of pixels the
391
+ * toast needs to move to be fully dismissed.
151
392
  */
152
- if (mode === 'md') {
153
- offset += win.innerHeight - box.top;
393
+ const remainingStepAmount = shouldDismiss ? 1 - step : step;
394
+ remainingDistance = remainingStepAmount * MAX_SWIPE_DISTANCE;
395
+ }
396
+ /**
397
+ * The animation speed should depend on how quickly
398
+ * the user flicks the toast across the screen. However,
399
+ * it should be no slower than 200ms.
400
+ * We use Math.abs on the remainingDistance because that value
401
+ * can be negative when swiping up on a middle position toast.
402
+ */
403
+ const duration = Math.min(Math.abs(remainingDistance) / Math.abs(velocity), 200);
404
+ swipeAnimation
405
+ .onFinish(() => {
406
+ if (shouldDismiss) {
407
+ onDismiss();
408
+ swipeAnimation.destroy();
154
409
  }
155
410
  else {
156
- offset -= win.innerHeight - box.top;
411
+ if (el.position === 'middle') {
412
+ /**
413
+ * If the toast snapped back to
414
+ * the middle of the screen we need
415
+ * to reset the keyframes
416
+ * so the toast can be swiped
417
+ * up or down again.
418
+ */
419
+ swipeAnimation.keyframes(SWIPE_UP_DOWN_KEYFRAMES).progressStart(true, 0.5);
420
+ }
421
+ else {
422
+ swipeAnimation.progressStart(true, 0);
423
+ }
424
+ /**
425
+ * If the toast did not dismiss then
426
+ * the user should be able to swipe again.
427
+ */
428
+ gesture.enable(true);
157
429
  }
158
- }
430
+ /**
431
+ * This must be a one time callback
432
+ * otherwise a new callback will
433
+ * be added every time onEnd runs.
434
+ */
435
+ }, { oneTimeCallback: true })
436
+ .progressEnd(playTo, step, duration);
437
+ };
438
+ const gesture = createGesture({
439
+ el: wrapperEl,
440
+ gestureName: 'toast-swipe-to-dismiss',
441
+ gesturePriority: OVERLAY_GESTURE_PRIORITY,
159
442
  /**
160
- * We don't include safe area here because that should already be
161
- * accounted for when checking the position of the anchor.
443
+ * Toast only supports vertical swipes.
444
+ * This needs to be updated if we later
445
+ * support horizontal swipes.
162
446
  */
163
- return {
164
- top: `${offset}px`,
165
- bottom: `${offset}px`,
166
- };
167
- }
168
- else {
169
- return {
170
- top: `calc(${offset}px + var(--ion-safe-area-top, 0px))`,
171
- bottom: mode === 'md'
172
- ? `calc(${offset}px + var(--ion-safe-area-bottom, 0px))`
173
- : `calc(${offset}px - var(--ion-safe-area-bottom, 0px))`,
174
- };
175
- }
176
- }
177
- /**
178
- * If the anchor element is hidden, getBoundingClientRect()
179
- * will return all 0s for it, which can cause unexpected
180
- * results in the position calculation when animating.
181
- */
182
- function warnIfAnchorIsHidden(positionAnchor, toast) {
183
- if (positionAnchor.offsetParent === null) {
184
- printIonWarning('The positionAnchor element for ion-toast was found in the DOM, but appears to be hidden. This may lead to unexpected positioning of the toast.', toast);
185
- }
186
- }
447
+ direction: 'y',
448
+ onMove,
449
+ onEnd,
450
+ });
451
+ return gesture;
452
+ };
187
453
 
188
- const toastIosCss = ":host{--border-width:0;--border-style:none;--border-color:initial;--box-shadow:none;--min-width:auto;--width:auto;--min-height:auto;--height:auto;--max-height:auto;--white-space:normal;top:0;display:block;position:absolute;width:100%;height:100%;outline:none;color:var(--color);font-family:var(--ion-font-family, inherit);contain:strict;z-index:1001;pointer-events:none}@supports (inset-inline-start: 0){:host{inset-inline-start:0}}@supports not (inset-inline-start: 0){:host{left:0}:host-context([dir=rtl]){left:unset;right:unset;right:0}@supports selector(:dir(rtl)){:host(:dir(rtl)){left:unset;right:unset;right:0}}}:host(.overlay-hidden){display:none}:host(.ion-color){--button-color:inherit;color:var(--ion-color-contrast)}:host(.ion-color) .toast-button-cancel{color:inherit}:host(.ion-color) .toast-wrapper{background:var(--ion-color-base)}.toast-wrapper{border-radius:var(--border-radius);width:var(--width);min-width:var(--min-width);max-width:var(--max-width);height:var(--height);min-height:var(--min-height);max-height:var(--max-height);border-width:var(--border-width);border-style:var(--border-style);border-color:var(--border-color);background:var(--background);-webkit-box-shadow:var(--box-shadow);box-shadow:var(--box-shadow)}@supports (inset-inline-start: 0){.toast-wrapper{inset-inline-start:var(--start);inset-inline-end:var(--end)}}@supports not (inset-inline-start: 0){.toast-wrapper{left:var(--start);right:var(--end)}:host-context([dir=rtl]) .toast-wrapper{left:unset;right:unset;left:var(--end);right:var(--start)}[dir=rtl] .toast-wrapper{left:unset;right:unset;left:var(--end);right:var(--start)}@supports selector(:dir(rtl)){.toast-wrapper:dir(rtl){left:unset;right:unset;left:var(--end);right:var(--start)}}}.toast-container{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;pointer-events:auto;height:inherit;min-height:inherit;max-height:inherit;contain:content}.toast-layout-stacked .toast-container{-ms-flex-wrap:wrap;flex-wrap:wrap}.toast-layout-baseline .toast-content{display:-ms-flexbox;display:flex;-ms-flex:1;flex:1;-ms-flex-direction:column;flex-direction:column;-ms-flex-pack:center;justify-content:center}.toast-icon{-webkit-margin-start:16px;margin-inline-start:16px}.toast-content{min-width:0}.toast-message{-ms-flex:1;flex:1;white-space:var(--white-space)}.toast-button-group{display:-ms-flexbox;display:flex}.toast-layout-stacked .toast-button-group{-ms-flex-pack:end;justify-content:end;width:100%}.toast-button{border:0;outline:none;color:var(--button-color);z-index:0}.toast-icon,.toast-button-icon{font-size:1.4em}.toast-button-inner{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center}@media (any-hover: hover){.toast-button:hover{cursor:pointer}}:host{--background:var(--ion-color-step-50, #f2f2f2);--border-radius:14px;--button-color:var(--ion-color-primary, #3880ff);--color:var(--ion-color-step-850, #262626);--max-width:700px;--max-height:478px;--start:10px;--end:10px;font-size:clamp(14px, 0.875rem, 43.4px)}.toast-wrapper{-webkit-margin-start:auto;margin-inline-start:auto;-webkit-margin-end:auto;margin-inline-end:auto;margin-top:auto;margin-bottom:auto;display:block;position:absolute;z-index:10}@supports ((-webkit-backdrop-filter: blur(0)) or (backdrop-filter: blur(0))){:host(.toast-translucent) .toast-wrapper{background:rgba(var(--ion-background-color-rgb, 255, 255, 255), 0.8);-webkit-backdrop-filter:saturate(180%) blur(20px);backdrop-filter:saturate(180%) blur(20px)}:host(.ion-color.toast-translucent) .toast-wrapper{background:rgba(var(--ion-color-base-rgb), 0.8)}}.toast-wrapper.toast-top{-webkit-transform:translate3d(0, -100%, 0);transform:translate3d(0, -100%, 0);top:0}.toast-wrapper.toast-middle{opacity:0.01}.toast-wrapper.toast-bottom{-webkit-transform:translate3d(0, 100%, 0);transform:translate3d(0, 100%, 0);bottom:0}.toast-content{-webkit-padding-start:15px;padding-inline-start:15px;-webkit-padding-end:15px;padding-inline-end:15px;padding-top:15px;padding-bottom:15px}.toast-header{margin-bottom:2px;font-weight:500}.toast-button{-webkit-padding-start:15px;padding-inline-start:15px;-webkit-padding-end:15px;padding-inline-end:15px;padding-top:10px;padding-bottom:10px;min-height:44px;-webkit-transition:background-color, opacity 100ms linear;transition:background-color, opacity 100ms linear;border:0;background-color:transparent;font-family:var(--ion-font-family);font-size:clamp(17px, 1.0625rem, 21.998px);font-weight:500;overflow:hidden}.toast-button.ion-activated{opacity:0.4}@media (any-hover: hover){.toast-button:hover{opacity:0.6}}";
454
+ const toastIosCss = ":host{--border-width:0;--border-style:none;--border-color:initial;--box-shadow:none;--min-width:auto;--width:auto;--min-height:auto;--height:auto;--max-height:auto;--white-space:normal;top:0;display:block;position:absolute;width:100%;height:100%;outline:none;color:var(--color);font-family:var(--ion-font-family, inherit);contain:strict;z-index:1001;pointer-events:none}@supports (inset-inline-start: 0){:host{inset-inline-start:0}}@supports not (inset-inline-start: 0){:host{left:0}:host-context([dir=rtl]){left:unset;right:unset;right:0}@supports selector(:dir(rtl)){:host(:dir(rtl)){left:unset;right:unset;right:0}}}:host(.overlay-hidden){display:none}:host(.ion-color){--button-color:inherit;color:var(--ion-color-contrast)}:host(.ion-color) .toast-button-cancel{color:inherit}:host(.ion-color) .toast-wrapper{background:var(--ion-color-base)}.toast-wrapper{border-radius:var(--border-radius);width:var(--width);min-width:var(--min-width);max-width:var(--max-width);height:var(--height);min-height:var(--min-height);max-height:var(--max-height);border-width:var(--border-width);border-style:var(--border-style);border-color:var(--border-color);background:var(--background);-webkit-box-shadow:var(--box-shadow);box-shadow:var(--box-shadow)}@supports (inset-inline-start: 0){.toast-wrapper{inset-inline-start:var(--start);inset-inline-end:var(--end)}}@supports not (inset-inline-start: 0){.toast-wrapper{left:var(--start);right:var(--end)}:host-context([dir=rtl]) .toast-wrapper{left:unset;right:unset;left:var(--end);right:var(--start)}[dir=rtl] .toast-wrapper{left:unset;right:unset;left:var(--end);right:var(--start)}@supports selector(:dir(rtl)){.toast-wrapper:dir(rtl){left:unset;right:unset;left:var(--end);right:var(--start)}}}.toast-wrapper.toast-top{-webkit-transform:translate3d(0, -100%, 0);transform:translate3d(0, -100%, 0);top:0}.toast-wrapper.toast-bottom{-webkit-transform:translate3d(0, 100%, 0);transform:translate3d(0, 100%, 0);bottom:0}.toast-container{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;pointer-events:auto;height:inherit;min-height:inherit;max-height:inherit;contain:content}.toast-layout-stacked .toast-container{-ms-flex-wrap:wrap;flex-wrap:wrap}.toast-layout-baseline .toast-content{display:-ms-flexbox;display:flex;-ms-flex:1;flex:1;-ms-flex-direction:column;flex-direction:column;-ms-flex-pack:center;justify-content:center}.toast-icon{-webkit-margin-start:16px;margin-inline-start:16px}.toast-content{min-width:0}.toast-message{-ms-flex:1;flex:1;white-space:var(--white-space)}.toast-button-group{display:-ms-flexbox;display:flex}.toast-layout-stacked .toast-button-group{-ms-flex-pack:end;justify-content:end;width:100%}.toast-button{border:0;outline:none;color:var(--button-color);z-index:0}.toast-icon,.toast-button-icon{font-size:1.4em}.toast-button-inner{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center}@media (any-hover: hover){.toast-button:hover{cursor:pointer}}:host{--background:var(--ion-color-step-50, #f2f2f2);--border-radius:14px;--button-color:var(--ion-color-primary, #3880ff);--color:var(--ion-color-step-850, #262626);--max-width:700px;--max-height:478px;--start:10px;--end:10px;font-size:clamp(14px, 0.875rem, 43.4px)}.toast-wrapper{-webkit-margin-start:auto;margin-inline-start:auto;-webkit-margin-end:auto;margin-inline-end:auto;margin-top:auto;margin-bottom:auto;display:block;position:absolute;z-index:10}@supports ((-webkit-backdrop-filter: blur(0)) or (backdrop-filter: blur(0))){:host(.toast-translucent) .toast-wrapper{background:rgba(var(--ion-background-color-rgb, 255, 255, 255), 0.8);-webkit-backdrop-filter:saturate(180%) blur(20px);backdrop-filter:saturate(180%) blur(20px)}:host(.ion-color.toast-translucent) .toast-wrapper{background:rgba(var(--ion-color-base-rgb), 0.8)}}.toast-wrapper.toast-middle{opacity:0.01}.toast-content{-webkit-padding-start:15px;padding-inline-start:15px;-webkit-padding-end:15px;padding-inline-end:15px;padding-top:15px;padding-bottom:15px}.toast-header{margin-bottom:2px;font-weight:500}.toast-button{-webkit-padding-start:15px;padding-inline-start:15px;-webkit-padding-end:15px;padding-inline-end:15px;padding-top:10px;padding-bottom:10px;min-height:44px;-webkit-transition:background-color, opacity 100ms linear;transition:background-color, opacity 100ms linear;border:0;background-color:transparent;font-family:var(--ion-font-family);font-size:clamp(17px, 1.0625rem, 21.998px);font-weight:500;overflow:hidden}.toast-button.ion-activated{opacity:0.4}@media (any-hover: hover){.toast-button:hover{opacity:0.6}}";
189
455
 
190
- const toastMdCss = ":host{--border-width:0;--border-style:none;--border-color:initial;--box-shadow:none;--min-width:auto;--width:auto;--min-height:auto;--height:auto;--max-height:auto;--white-space:normal;top:0;display:block;position:absolute;width:100%;height:100%;outline:none;color:var(--color);font-family:var(--ion-font-family, inherit);contain:strict;z-index:1001;pointer-events:none}@supports (inset-inline-start: 0){:host{inset-inline-start:0}}@supports not (inset-inline-start: 0){:host{left:0}:host-context([dir=rtl]){left:unset;right:unset;right:0}@supports selector(:dir(rtl)){:host(:dir(rtl)){left:unset;right:unset;right:0}}}:host(.overlay-hidden){display:none}:host(.ion-color){--button-color:inherit;color:var(--ion-color-contrast)}:host(.ion-color) .toast-button-cancel{color:inherit}:host(.ion-color) .toast-wrapper{background:var(--ion-color-base)}.toast-wrapper{border-radius:var(--border-radius);width:var(--width);min-width:var(--min-width);max-width:var(--max-width);height:var(--height);min-height:var(--min-height);max-height:var(--max-height);border-width:var(--border-width);border-style:var(--border-style);border-color:var(--border-color);background:var(--background);-webkit-box-shadow:var(--box-shadow);box-shadow:var(--box-shadow)}@supports (inset-inline-start: 0){.toast-wrapper{inset-inline-start:var(--start);inset-inline-end:var(--end)}}@supports not (inset-inline-start: 0){.toast-wrapper{left:var(--start);right:var(--end)}:host-context([dir=rtl]) .toast-wrapper{left:unset;right:unset;left:var(--end);right:var(--start)}[dir=rtl] .toast-wrapper{left:unset;right:unset;left:var(--end);right:var(--start)}@supports selector(:dir(rtl)){.toast-wrapper:dir(rtl){left:unset;right:unset;left:var(--end);right:var(--start)}}}.toast-container{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;pointer-events:auto;height:inherit;min-height:inherit;max-height:inherit;contain:content}.toast-layout-stacked .toast-container{-ms-flex-wrap:wrap;flex-wrap:wrap}.toast-layout-baseline .toast-content{display:-ms-flexbox;display:flex;-ms-flex:1;flex:1;-ms-flex-direction:column;flex-direction:column;-ms-flex-pack:center;justify-content:center}.toast-icon{-webkit-margin-start:16px;margin-inline-start:16px}.toast-content{min-width:0}.toast-message{-ms-flex:1;flex:1;white-space:var(--white-space)}.toast-button-group{display:-ms-flexbox;display:flex}.toast-layout-stacked .toast-button-group{-ms-flex-pack:end;justify-content:end;width:100%}.toast-button{border:0;outline:none;color:var(--button-color);z-index:0}.toast-icon,.toast-button-icon{font-size:1.4em}.toast-button-inner{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center}@media (any-hover: hover){.toast-button:hover{cursor:pointer}}:host{--background:var(--ion-color-step-800, #333333);--border-radius:4px;--box-shadow:0 3px 5px -1px rgba(0, 0, 0, 0.2), 0 6px 10px 0 rgba(0, 0, 0, 0.14), 0 1px 18px 0 rgba(0, 0, 0, 0.12);--button-color:var(--ion-color-primary, #3880ff);--color:var(--ion-color-step-50, #f2f2f2);--max-width:700px;--start:8px;--end:8px;font-size:0.875rem}.toast-wrapper{-webkit-margin-start:auto;margin-inline-start:auto;-webkit-margin-end:auto;margin-inline-end:auto;margin-top:auto;margin-bottom:auto;display:block;position:absolute;opacity:0.01;z-index:10}.toast-content{-webkit-padding-start:16px;padding-inline-start:16px;-webkit-padding-end:16px;padding-inline-end:16px;padding-top:14px;padding-bottom:14px}.toast-header{margin-bottom:2px;font-weight:500;line-height:1.25rem}.toast-message{line-height:1.25rem}.toast-layout-baseline .toast-button-group-start{-webkit-margin-start:8px;margin-inline-start:8px}.toast-layout-stacked .toast-button-group-start{-webkit-margin-end:8px;margin-inline-end:8px;margin-top:8px}.toast-layout-baseline .toast-button-group-end{-webkit-margin-end:8px;margin-inline-end:8px}.toast-layout-stacked .toast-button-group-end{-webkit-margin-end:8px;margin-inline-end:8px;margin-bottom:8px}.toast-button{-webkit-padding-start:15px;padding-inline-start:15px;-webkit-padding-end:15px;padding-inline-end:15px;padding-top:10px;padding-bottom:10px;position:relative;background-color:transparent;font-family:var(--ion-font-family);font-size:0.875rem;font-weight:500;letter-spacing:0.84px;text-transform:uppercase;overflow:hidden}.toast-button-cancel{color:var(--ion-color-step-100, #e6e6e6)}.toast-button-icon-only{border-radius:50%;-webkit-padding-start:9px;padding-inline-start:9px;-webkit-padding-end:9px;padding-inline-end:9px;padding-top:9px;padding-bottom:9px;width:36px;height:36px}@media (any-hover: hover){.toast-button:hover{background-color:rgba(var(--ion-color-primary-rgb, 56, 128, 255), 0.08)}.toast-button-cancel:hover{background-color:rgba(var(--ion-background-color-rgb, 255, 255, 255), 0.08)}}";
456
+ const toastMdCss = ":host{--border-width:0;--border-style:none;--border-color:initial;--box-shadow:none;--min-width:auto;--width:auto;--min-height:auto;--height:auto;--max-height:auto;--white-space:normal;top:0;display:block;position:absolute;width:100%;height:100%;outline:none;color:var(--color);font-family:var(--ion-font-family, inherit);contain:strict;z-index:1001;pointer-events:none}@supports (inset-inline-start: 0){:host{inset-inline-start:0}}@supports not (inset-inline-start: 0){:host{left:0}:host-context([dir=rtl]){left:unset;right:unset;right:0}@supports selector(:dir(rtl)){:host(:dir(rtl)){left:unset;right:unset;right:0}}}:host(.overlay-hidden){display:none}:host(.ion-color){--button-color:inherit;color:var(--ion-color-contrast)}:host(.ion-color) .toast-button-cancel{color:inherit}:host(.ion-color) .toast-wrapper{background:var(--ion-color-base)}.toast-wrapper{border-radius:var(--border-radius);width:var(--width);min-width:var(--min-width);max-width:var(--max-width);height:var(--height);min-height:var(--min-height);max-height:var(--max-height);border-width:var(--border-width);border-style:var(--border-style);border-color:var(--border-color);background:var(--background);-webkit-box-shadow:var(--box-shadow);box-shadow:var(--box-shadow)}@supports (inset-inline-start: 0){.toast-wrapper{inset-inline-start:var(--start);inset-inline-end:var(--end)}}@supports not (inset-inline-start: 0){.toast-wrapper{left:var(--start);right:var(--end)}:host-context([dir=rtl]) .toast-wrapper{left:unset;right:unset;left:var(--end);right:var(--start)}[dir=rtl] .toast-wrapper{left:unset;right:unset;left:var(--end);right:var(--start)}@supports selector(:dir(rtl)){.toast-wrapper:dir(rtl){left:unset;right:unset;left:var(--end);right:var(--start)}}}.toast-wrapper.toast-top{-webkit-transform:translate3d(0, -100%, 0);transform:translate3d(0, -100%, 0);top:0}.toast-wrapper.toast-bottom{-webkit-transform:translate3d(0, 100%, 0);transform:translate3d(0, 100%, 0);bottom:0}.toast-container{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;pointer-events:auto;height:inherit;min-height:inherit;max-height:inherit;contain:content}.toast-layout-stacked .toast-container{-ms-flex-wrap:wrap;flex-wrap:wrap}.toast-layout-baseline .toast-content{display:-ms-flexbox;display:flex;-ms-flex:1;flex:1;-ms-flex-direction:column;flex-direction:column;-ms-flex-pack:center;justify-content:center}.toast-icon{-webkit-margin-start:16px;margin-inline-start:16px}.toast-content{min-width:0}.toast-message{-ms-flex:1;flex:1;white-space:var(--white-space)}.toast-button-group{display:-ms-flexbox;display:flex}.toast-layout-stacked .toast-button-group{-ms-flex-pack:end;justify-content:end;width:100%}.toast-button{border:0;outline:none;color:var(--button-color);z-index:0}.toast-icon,.toast-button-icon{font-size:1.4em}.toast-button-inner{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center}@media (any-hover: hover){.toast-button:hover{cursor:pointer}}:host{--background:var(--ion-color-step-800, #333333);--border-radius:4px;--box-shadow:0 3px 5px -1px rgba(0, 0, 0, 0.2), 0 6px 10px 0 rgba(0, 0, 0, 0.14), 0 1px 18px 0 rgba(0, 0, 0, 0.12);--button-color:var(--ion-color-primary, #3880ff);--color:var(--ion-color-step-50, #f2f2f2);--max-width:700px;--start:8px;--end:8px;font-size:0.875rem}.toast-wrapper{-webkit-margin-start:auto;margin-inline-start:auto;-webkit-margin-end:auto;margin-inline-end:auto;margin-top:auto;margin-bottom:auto;display:block;position:absolute;opacity:0.01;z-index:10}.toast-content{-webkit-padding-start:16px;padding-inline-start:16px;-webkit-padding-end:16px;padding-inline-end:16px;padding-top:14px;padding-bottom:14px}.toast-header{margin-bottom:2px;font-weight:500;line-height:1.25rem}.toast-message{line-height:1.25rem}.toast-layout-baseline .toast-button-group-start{-webkit-margin-start:8px;margin-inline-start:8px}.toast-layout-stacked .toast-button-group-start{-webkit-margin-end:8px;margin-inline-end:8px;margin-top:8px}.toast-layout-baseline .toast-button-group-end{-webkit-margin-end:8px;margin-inline-end:8px}.toast-layout-stacked .toast-button-group-end{-webkit-margin-end:8px;margin-inline-end:8px;margin-bottom:8px}.toast-button{-webkit-padding-start:15px;padding-inline-start:15px;-webkit-padding-end:15px;padding-inline-end:15px;padding-top:10px;padding-bottom:10px;position:relative;background-color:transparent;font-family:var(--ion-font-family);font-size:0.875rem;font-weight:500;letter-spacing:0.84px;text-transform:uppercase;overflow:hidden}.toast-button-cancel{color:var(--ion-color-step-100, #e6e6e6)}.toast-button-icon-only{border-radius:50%;-webkit-padding-start:9px;padding-inline-start:9px;-webkit-padding-end:9px;padding-inline-end:9px;padding-top:9px;padding-bottom:9px;width:36px;height:36px}@media (any-hover: hover){.toast-button:hover{background-color:rgba(var(--ion-color-primary-rgb, 56, 128, 255), 0.08)}.toast-button-cancel:hover{background-color:rgba(var(--ion-background-color-rgb, 255, 255, 255), 0.08)}}";
191
457
 
192
458
  const Toast = /*@__PURE__*/ proxyCustomElement(class Toast extends HTMLElement {
193
459
  constructor() {
@@ -214,6 +480,41 @@ const Toast = /*@__PURE__*/ proxyCustomElement(class Toast extends HTMLElement {
214
480
  this.callButtonHandler(cancelButton);
215
481
  }
216
482
  };
483
+ /**
484
+ * Create a new swipe gesture so Toast
485
+ * can be swiped to dismiss.
486
+ */
487
+ this.createSwipeGesture = (toastPosition) => {
488
+ const gesture = (this.gesture = createSwipeToDismissGesture(this.el, toastPosition, () => {
489
+ /**
490
+ * If the gesture completed then
491
+ * we should dismiss the toast.
492
+ */
493
+ this.dismiss(undefined, GESTURE);
494
+ }));
495
+ gesture.enable(true);
496
+ };
497
+ /**
498
+ * Destroy an existing swipe gesture
499
+ * so Toast can no longer be swiped to dismiss.
500
+ */
501
+ this.destroySwipeGesture = () => {
502
+ const { gesture } = this;
503
+ if (gesture === undefined) {
504
+ return;
505
+ }
506
+ gesture.destroy();
507
+ this.gesture = undefined;
508
+ };
509
+ /**
510
+ * Returns `true` if swipeGesture
511
+ * is configured to a value that enables the swipe behavior.
512
+ * Returns `false` otherwise.
513
+ */
514
+ this.prefersSwipeGesture = () => {
515
+ const { swipeGesture } = this;
516
+ return swipeGesture === 'vertical';
517
+ };
217
518
  this.revealContentToScreenReader = false;
218
519
  this.overlayIndex = undefined;
219
520
  this.delegate = undefined;
@@ -234,9 +535,37 @@ const Toast = /*@__PURE__*/ proxyCustomElement(class Toast extends HTMLElement {
234
535
  this.animated = true;
235
536
  this.icon = undefined;
236
537
  this.htmlAttributes = undefined;
538
+ this.swipeGesture = undefined;
237
539
  this.isOpen = false;
238
540
  this.trigger = undefined;
239
541
  }
542
+ swipeGestureChanged() {
543
+ /**
544
+ * If the Toast is presented, then we need to destroy
545
+ * any actives gestures before a new gesture is potentially
546
+ * created below.
547
+ *
548
+ * If the Toast is dismissed, then no gesture should be available
549
+ * since the Toast is not visible. This case should never
550
+ * happen since the "dismiss" method handles destroying
551
+ * any active swipe gestures, but we keep this code
552
+ * around to handle the first case.
553
+ */
554
+ this.destroySwipeGesture();
555
+ /**
556
+ * A new swipe gesture should only be created
557
+ * if the Toast is presented. If the Toast is not
558
+ * yet presented then the "present" method will
559
+ * handle calling the swipe gesture setup function.
560
+ */
561
+ if (this.presented && this.prefersSwipeGesture()) {
562
+ /**
563
+ * If the Toast is presented then
564
+ * lastPresentedPosition is defined.
565
+ */
566
+ this.createSwipeGesture(this.lastPresentedPosition);
567
+ }
568
+ }
240
569
  onIsOpenChange(newValue, oldValue) {
241
570
  if (newValue === true && oldValue === false) {
242
571
  this.present();
@@ -308,6 +637,14 @@ const Toast = /*@__PURE__*/ proxyCustomElement(class Toast extends HTMLElement {
308
637
  if (this.duration > 0) {
309
638
  this.durationTimeout = setTimeout(() => this.dismiss(undefined, 'timeout'), this.duration);
310
639
  }
640
+ /**
641
+ * If the Toast has a swipe gesture then we can
642
+ * create the gesture so users can swipe the
643
+ * presented Toast.
644
+ */
645
+ if (this.prefersSwipeGesture()) {
646
+ this.createSwipeGesture(animationPosition);
647
+ }
311
648
  unlock();
312
649
  }
313
650
  /**
@@ -342,6 +679,11 @@ const Toast = /*@__PURE__*/ proxyCustomElement(class Toast extends HTMLElement {
342
679
  this.revealContentToScreenReader = false;
343
680
  }
344
681
  this.lastPresentedPosition = undefined;
682
+ /**
683
+ * If the Toast has a swipe gesture then we can
684
+ * safely destroy it now that it is dismissed.
685
+ */
686
+ this.destroySwipeGesture();
345
687
  unlock();
346
688
  return dismissed;
347
689
  }
@@ -486,6 +828,7 @@ const Toast = /*@__PURE__*/ proxyCustomElement(class Toast extends HTMLElement {
486
828
  }
487
829
  get el() { return this; }
488
830
  static get watchers() { return {
831
+ "swipeGesture": ["swipeGestureChanged"],
489
832
  "isOpen": ["onIsOpenChange"],
490
833
  "trigger": ["triggerChanged"]
491
834
  }; }
@@ -513,6 +856,7 @@ const Toast = /*@__PURE__*/ proxyCustomElement(class Toast extends HTMLElement {
513
856
  "animated": [4],
514
857
  "icon": [1],
515
858
  "htmlAttributes": [16],
859
+ "swipeGesture": [1, "swipe-gesture"],
516
860
  "isOpen": [4, "is-open"],
517
861
  "trigger": [1],
518
862
  "revealContentToScreenReader": [32],
@@ -521,6 +865,7 @@ const Toast = /*@__PURE__*/ proxyCustomElement(class Toast extends HTMLElement {
521
865
  "onDidDismiss": [64],
522
866
  "onWillDismiss": [64]
523
867
  }, undefined, {
868
+ "swipeGesture": ["swipeGestureChanged"],
524
869
  "isOpen": ["onIsOpenChange"],
525
870
  "trigger": ["triggerChanged"]
526
871
  }]);