@ionic/core 7.4.4-dev.11699475060.1eee2115 → 7.4.4-dev.11700515976.1ccd503d

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 (404) hide show
  1. package/components/alert.js +8 -0
  2. package/components/checkbox.js +0 -3
  3. package/components/data.js +96 -22
  4. package/components/haptic.js +1 -0
  5. package/components/icon.js +9 -5
  6. package/components/index.js +1 -0
  7. package/components/index4.js +26 -19
  8. package/components/index7.js +1 -1
  9. package/components/ion-datetime-button.js +4 -4
  10. package/components/ion-datetime.js +3 -3
  11. package/components/ion-menu.js +0 -12
  12. package/components/ion-nav.js +1 -0
  13. package/components/ion-router.js +3 -0
  14. package/components/ion-select.js +18 -32
  15. package/components/ion-toast.js +157 -13
  16. package/components/ion-toggle.js +0 -3
  17. package/components/ios.transition.js +1 -0
  18. package/components/overlays.js +1 -0
  19. package/components/radio-group.js +1 -1
  20. package/components/radio.js +1 -4
  21. package/dist/cjs/{app-globals-fe1ad535.js → app-globals-84b6a756.js} +1 -1
  22. package/dist/cjs/{button-active-0932cee9.js → button-active-f2147e85.js} +2 -2
  23. package/dist/cjs/{data-db832785.js → data-c8d21093.js} +96 -22
  24. package/dist/cjs/{haptic-c5f6b4d5.js → haptic-678abc9f.js} +1 -0
  25. package/dist/cjs/{index-305a23dc.js → index-14a4821e.js} +51 -95
  26. package/dist/cjs/{index-f94cbab1.js → index-2e612e35.js} +27 -20
  27. package/dist/cjs/{index-d3568232.js → index-33d2809c.js} +3 -3
  28. package/dist/cjs/{index-d8d1fc0b.js → index-d8f84c5a.js} +1 -1
  29. package/dist/cjs/index.cjs.js +10 -8
  30. package/dist/cjs/ion-accordion_2.cjs.entry.js +3 -3
  31. package/dist/cjs/ion-action-sheet.cjs.entry.js +5 -5
  32. package/dist/cjs/ion-alert.cjs.entry.js +13 -5
  33. package/dist/cjs/ion-app_8.cjs.entry.js +4 -4
  34. package/dist/cjs/ion-avatar_3.cjs.entry.js +2 -2
  35. package/dist/cjs/ion-back-button.cjs.entry.js +3 -3
  36. package/dist/cjs/ion-backdrop.cjs.entry.js +2 -2
  37. package/dist/cjs/ion-breadcrumb_2.cjs.entry.js +3 -3
  38. package/dist/cjs/ion-button_2.cjs.entry.js +11 -7
  39. package/dist/cjs/ion-card_5.cjs.entry.js +2 -2
  40. package/dist/cjs/ion-checkbox.cjs.entry.js +2 -5
  41. package/dist/cjs/ion-chip.cjs.entry.js +2 -2
  42. package/dist/cjs/ion-col_3.cjs.entry.js +2 -2
  43. package/dist/cjs/ion-datetime-button.cjs.entry.js +6 -6
  44. package/dist/cjs/ion-datetime_3.cjs.entry.js +8 -8
  45. package/dist/cjs/ion-fab_3.cjs.entry.js +3 -3
  46. package/dist/cjs/ion-img.cjs.entry.js +2 -2
  47. package/dist/cjs/ion-infinite-scroll_2.cjs.entry.js +2 -2
  48. package/dist/cjs/ion-input.cjs.entry.js +3 -3
  49. package/dist/cjs/ion-item-option_3.cjs.entry.js +2 -2
  50. package/dist/cjs/ion-item_8.cjs.entry.js +3 -3
  51. package/dist/cjs/ion-loading.cjs.entry.js +3 -3
  52. package/dist/cjs/ion-menu_3.cjs.entry.js +8 -19
  53. package/dist/cjs/ion-modal.cjs.entry.js +4 -4
  54. package/dist/cjs/ion-nav_2.cjs.entry.js +4 -3
  55. package/dist/cjs/ion-picker-column-internal.cjs.entry.js +3 -3
  56. package/dist/cjs/ion-picker-internal.cjs.entry.js +1 -1
  57. package/dist/cjs/ion-popover.cjs.entry.js +4 -4
  58. package/dist/cjs/ion-progress-bar.cjs.entry.js +2 -2
  59. package/dist/cjs/ion-radio_2.cjs.entry.js +4 -7
  60. package/dist/cjs/ion-range.cjs.entry.js +2 -2
  61. package/dist/cjs/ion-refresher_2.cjs.entry.js +4 -4
  62. package/dist/cjs/ion-reorder_2.cjs.entry.js +4 -4
  63. package/dist/cjs/ion-ripple-effect.cjs.entry.js +2 -2
  64. package/dist/cjs/ion-route_4.cjs.entry.js +5 -2
  65. package/dist/cjs/ion-searchbar.cjs.entry.js +3 -3
  66. package/dist/cjs/ion-segment_2.cjs.entry.js +2 -2
  67. package/dist/cjs/ion-select_3.cjs.entry.js +22 -36
  68. package/dist/cjs/ion-spinner.cjs.entry.js +2 -2
  69. package/dist/cjs/ion-split-pane.cjs.entry.js +2 -2
  70. package/dist/cjs/ion-tab-bar_2.cjs.entry.js +2 -2
  71. package/dist/cjs/ion-tab_2.cjs.entry.js +1 -1
  72. package/dist/cjs/ion-text.cjs.entry.js +2 -2
  73. package/dist/cjs/ion-textarea.cjs.entry.js +2 -2
  74. package/dist/cjs/ion-toast.cjs.entry.js +175 -33
  75. package/dist/cjs/ion-toggle.cjs.entry.js +4 -7
  76. package/dist/cjs/{ionic-global-fb752503.js → ionic-global-a71608df.js} +1 -1
  77. package/dist/cjs/ionic.cjs.js +5 -5
  78. package/dist/cjs/{ios.transition-7d688757.js → ios.transition-8ddf91e6.js} +3 -2
  79. package/dist/cjs/loader.cjs.js +4 -4
  80. package/dist/cjs/{md.transition-d77d3c2e.js → md.transition-44ff8566.js} +2 -2
  81. package/dist/cjs/{overlays-7e1a08fa.js → overlays-9cab437c.js} +2 -1
  82. package/dist/cjs/{status-tap-778e8054.js → status-tap-8c22e017.js} +1 -1
  83. package/dist/collection/collection-manifest.json +1 -1
  84. package/dist/collection/components/alert/alert.js +8 -0
  85. package/dist/collection/components/alert/test/a11y/alert.e2e.js +11 -0
  86. package/dist/collection/components/checkbox/checkbox.js +0 -3
  87. package/dist/collection/components/datetime/datetime.js +12 -6
  88. package/dist/collection/components/datetime/test/hour-cycle/datetime.e2e.js +14 -0
  89. package/dist/collection/components/datetime/utils/data.js +33 -7
  90. package/dist/collection/components/datetime/utils/format.js +27 -10
  91. package/dist/collection/components/datetime/utils/helpers.js +37 -5
  92. package/dist/collection/components/datetime-button/datetime-button.js +4 -4
  93. package/dist/collection/components/menu/menu.js +0 -12
  94. package/dist/collection/components/menu/test/multiple/menu.e2e.js +60 -0
  95. package/dist/collection/components/nav/nav.js +1 -0
  96. package/dist/collection/components/radio/radio.js +1 -4
  97. package/dist/collection/components/radio-group/radio-group.js +1 -1
  98. package/dist/collection/components/router/router.js +2 -0
  99. package/dist/collection/components/router/utils/path.js +1 -0
  100. package/dist/collection/components/select/select.js +18 -32
  101. package/dist/collection/components/toast/animations/ios.enter.js +2 -3
  102. package/dist/collection/components/toast/animations/ios.leave.js +2 -3
  103. package/dist/collection/components/toast/animations/md.enter.js +2 -3
  104. package/dist/collection/components/toast/animations/utils.js +85 -0
  105. package/dist/collection/components/toast/test/position-anchor/toast.e2e.js +45 -0
  106. package/dist/collection/components/toast/toast.js +98 -9
  107. package/dist/collection/components/toggle/toggle.js +0 -3
  108. package/dist/collection/index.js +1 -0
  109. package/dist/collection/utils/menu-controller/index.js +26 -19
  110. package/dist/collection/utils/native/haptic.js +1 -0
  111. package/dist/collection/utils/overlays.js +1 -0
  112. package/dist/collection/utils/transition/ios.transition.js +1 -0
  113. package/dist/docs.json +74 -11
  114. package/dist/esm/{app-globals-ec816a70.js → app-globals-df292a32.js} +1 -1
  115. package/dist/esm/{button-active-5136c12d.js → button-active-3dd473a1.js} +2 -2
  116. package/dist/esm/{data-009dbf15.js → data-44d9e816.js} +96 -22
  117. package/dist/esm/{haptic-6447af60.js → haptic-1243b917.js} +1 -0
  118. package/dist/esm/{index-ecfc2c9f.js → index-504b03f0.js} +1 -1
  119. package/dist/esm/{index-641aeeed.js → index-6e10cd02.js} +3 -3
  120. package/dist/esm/{index-d78b533e.js → index-c3e624b7.js} +27 -20
  121. package/dist/esm/{index-b49b173c.js → index-cb894020.js} +51 -95
  122. package/dist/esm/index.js +9 -8
  123. package/dist/esm/ion-accordion_2.entry.js +3 -3
  124. package/dist/esm/ion-action-sheet.entry.js +5 -5
  125. package/dist/esm/ion-alert.entry.js +13 -5
  126. package/dist/esm/ion-app_8.entry.js +4 -4
  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 +11 -7
  132. package/dist/esm/ion-card_5.entry.js +2 -2
  133. package/dist/esm/ion-checkbox.entry.js +2 -5
  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 +6 -6
  137. package/dist/esm/ion-datetime_3.entry.js +8 -8
  138. package/dist/esm/ion-fab_3.entry.js +3 -3
  139. package/dist/esm/ion-img.entry.js +2 -2
  140. package/dist/esm/ion-infinite-scroll_2.entry.js +2 -2
  141. package/dist/esm/ion-input.entry.js +3 -3
  142. package/dist/esm/ion-item-option_3.entry.js +2 -2
  143. package/dist/esm/ion-item_8.entry.js +3 -3
  144. package/dist/esm/ion-loading.entry.js +3 -3
  145. package/dist/esm/ion-menu_3.entry.js +7 -18
  146. package/dist/esm/ion-modal.entry.js +4 -4
  147. package/dist/esm/ion-nav_2.entry.js +4 -3
  148. package/dist/esm/ion-picker-column-internal.entry.js +3 -3
  149. package/dist/esm/ion-picker-internal.entry.js +1 -1
  150. package/dist/esm/ion-popover.entry.js +4 -4
  151. package/dist/esm/ion-progress-bar.entry.js +2 -2
  152. package/dist/esm/ion-radio_2.entry.js +4 -7
  153. package/dist/esm/ion-range.entry.js +2 -2
  154. package/dist/esm/ion-refresher_2.entry.js +4 -4
  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 +5 -2
  158. package/dist/esm/ion-searchbar.entry.js +3 -3
  159. package/dist/esm/ion-segment_2.entry.js +2 -2
  160. package/dist/esm/ion-select_3.entry.js +22 -36
  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 +2 -2
  164. package/dist/esm/ion-tab_2.entry.js +1 -1
  165. package/dist/esm/ion-text.entry.js +2 -2
  166. package/dist/esm/ion-textarea.entry.js +2 -2
  167. package/dist/esm/ion-toast.entry.js +159 -17
  168. package/dist/esm/ion-toggle.entry.js +4 -7
  169. package/dist/esm/{ionic-global-246ca78f.js → ionic-global-63a8d8c9.js} +1 -1
  170. package/dist/esm/ionic.js +6 -6
  171. package/dist/esm/{ios.transition-04c9a97a.js → ios.transition-6707a3a1.js} +3 -2
  172. package/dist/esm/loader.js +5 -5
  173. package/dist/esm/{md.transition-67a8aabd.js → md.transition-957964fd.js} +2 -2
  174. package/dist/esm/{overlays-2fa52617.js → overlays-753933fc.js} +2 -1
  175. package/dist/esm/{status-tap-9aeeaca5.js → status-tap-73e982b6.js} +1 -1
  176. package/dist/esm-es5/app-globals-df292a32.js +4 -0
  177. package/dist/esm-es5/{button-active-5136c12d.js → button-active-3dd473a1.js} +1 -1
  178. package/dist/esm-es5/data-44d9e816.js +4 -0
  179. package/dist/esm-es5/{index-641aeeed.js → index-6e10cd02.js} +1 -1
  180. package/dist/esm-es5/index-c3e624b7.js +4 -0
  181. package/dist/esm-es5/index-cb894020.js +5 -0
  182. package/dist/esm-es5/index.js +1 -1
  183. package/dist/esm-es5/ion-accordion_2.entry.js +1 -1
  184. package/dist/esm-es5/ion-action-sheet.entry.js +1 -1
  185. package/dist/esm-es5/ion-alert.entry.js +1 -1
  186. package/dist/esm-es5/ion-app_8.entry.js +1 -1
  187. package/dist/esm-es5/ion-avatar_3.entry.js +1 -1
  188. package/dist/esm-es5/ion-back-button.entry.js +1 -1
  189. package/dist/esm-es5/ion-backdrop.entry.js +1 -1
  190. package/dist/esm-es5/ion-breadcrumb_2.entry.js +1 -1
  191. package/dist/esm-es5/ion-button_2.entry.js +1 -1
  192. package/dist/esm-es5/ion-card_5.entry.js +1 -1
  193. package/dist/esm-es5/ion-checkbox.entry.js +1 -1
  194. package/dist/esm-es5/ion-chip.entry.js +1 -1
  195. package/dist/esm-es5/ion-col_3.entry.js +1 -1
  196. package/dist/esm-es5/ion-datetime-button.entry.js +1 -1
  197. package/dist/esm-es5/ion-datetime_3.entry.js +1 -1
  198. package/dist/esm-es5/ion-fab_3.entry.js +1 -1
  199. package/dist/esm-es5/ion-img.entry.js +1 -1
  200. package/dist/esm-es5/ion-infinite-scroll_2.entry.js +1 -1
  201. package/dist/esm-es5/ion-input.entry.js +1 -1
  202. package/dist/esm-es5/ion-item-option_3.entry.js +1 -1
  203. package/dist/esm-es5/ion-item_8.entry.js +1 -1
  204. package/dist/esm-es5/ion-loading.entry.js +1 -1
  205. package/dist/esm-es5/ion-menu_3.entry.js +1 -1
  206. package/dist/esm-es5/ion-modal.entry.js +1 -1
  207. package/dist/esm-es5/ion-nav_2.entry.js +1 -1
  208. package/dist/esm-es5/ion-picker-column-internal.entry.js +1 -1
  209. package/dist/esm-es5/ion-picker-internal.entry.js +1 -1
  210. package/dist/esm-es5/ion-popover.entry.js +1 -1
  211. package/dist/esm-es5/ion-progress-bar.entry.js +1 -1
  212. package/dist/esm-es5/ion-radio_2.entry.js +1 -1
  213. package/dist/esm-es5/ion-range.entry.js +1 -1
  214. package/dist/esm-es5/ion-refresher_2.entry.js +1 -1
  215. package/dist/esm-es5/ion-reorder_2.entry.js +1 -1
  216. package/dist/esm-es5/ion-ripple-effect.entry.js +1 -1
  217. package/dist/esm-es5/ion-route_4.entry.js +1 -1
  218. package/dist/esm-es5/ion-searchbar.entry.js +1 -1
  219. package/dist/esm-es5/ion-segment_2.entry.js +1 -1
  220. package/dist/esm-es5/ion-select_3.entry.js +1 -1
  221. package/dist/esm-es5/ion-spinner.entry.js +1 -1
  222. package/dist/esm-es5/ion-split-pane.entry.js +1 -1
  223. package/dist/esm-es5/ion-tab-bar_2.entry.js +1 -1
  224. package/dist/esm-es5/ion-tab_2.entry.js +1 -1
  225. package/dist/esm-es5/ion-text.entry.js +1 -1
  226. package/dist/esm-es5/ion-textarea.entry.js +1 -1
  227. package/dist/esm-es5/ion-toast.entry.js +1 -1
  228. package/dist/esm-es5/ion-toggle.entry.js +1 -1
  229. package/dist/esm-es5/{ionic-global-246ca78f.js → ionic-global-63a8d8c9.js} +1 -1
  230. package/dist/esm-es5/ionic.js +1 -1
  231. package/dist/esm-es5/{ios.transition-04c9a97a.js → ios.transition-6707a3a1.js} +1 -1
  232. package/dist/esm-es5/loader.js +1 -1
  233. package/dist/esm-es5/{md.transition-67a8aabd.js → md.transition-957964fd.js} +1 -1
  234. package/dist/esm-es5/{overlays-2fa52617.js → overlays-753933fc.js} +1 -1
  235. package/dist/esm-es5/{status-tap-9aeeaca5.js → status-tap-73e982b6.js} +1 -1
  236. package/dist/html.html-data.json +11 -1
  237. package/dist/ionic/index.esm.js +1 -1
  238. package/dist/ionic/ionic.esm.js +1 -1
  239. package/dist/ionic/ionic.js +1 -1
  240. package/dist/ionic/{p-deb6ddad.entry.js → p-0023e6eb.entry.js} +1 -1
  241. package/dist/ionic/{p-8e24ebbc.js → p-00cf2d6c.js} +1 -1
  242. package/dist/ionic/{p-b109a3d7.system.entry.js → p-00f709ca.system.entry.js} +1 -1
  243. package/dist/ionic/{p-8ee012cb.system.entry.js → p-037e2738.system.entry.js} +1 -1
  244. package/dist/ionic/{p-914ac0fc.entry.js → p-03f7e3cc.entry.js} +1 -1
  245. package/dist/ionic/{p-ec9052a4.entry.js → p-0459db58.entry.js} +1 -1
  246. package/dist/ionic/{p-d7b8d224.entry.js → p-06756f31.entry.js} +1 -1
  247. package/dist/ionic/p-0779a5c8.system.js +4 -0
  248. package/dist/ionic/{p-4e6e43c1.entry.js → p-0793ebfd.entry.js} +1 -1
  249. package/dist/ionic/p-0d198537.js +4 -0
  250. package/dist/ionic/{p-257cf0b7.entry.js → p-0d3d44e7.entry.js} +1 -1
  251. package/dist/ionic/p-100ea813.system.entry.js +4 -0
  252. package/dist/ionic/{p-576e6d0f.system.entry.js → p-10fcb3a3.system.entry.js} +1 -1
  253. package/dist/ionic/{p-5403baaa.system.entry.js → p-14fd96a2.system.entry.js} +1 -1
  254. package/dist/ionic/p-17240d90.js +4 -0
  255. package/dist/ionic/p-1d9b39f3.js +4 -0
  256. package/dist/ionic/{p-629aa3fd.system.js → p-26fbffd4.system.js} +1 -1
  257. package/dist/ionic/{p-a7eec917.entry.js → p-2acea831.entry.js} +1 -1
  258. package/dist/ionic/p-2b47b2ce.entry.js +4 -0
  259. package/dist/ionic/p-32b5f10e.entry.js +4 -0
  260. package/dist/ionic/{p-32717950.system.entry.js → p-3634b770.system.entry.js} +1 -1
  261. package/dist/ionic/{p-2784263e.system.entry.js → p-37fc0d22.system.entry.js} +1 -1
  262. package/dist/ionic/{p-fcf47f80.entry.js → p-3bf7c0dc.entry.js} +1 -1
  263. package/dist/ionic/{p-1f81b5be.entry.js → p-3db27dec.entry.js} +1 -1
  264. package/dist/ionic/{p-818b2e75.entry.js → p-3dce88bf.entry.js} +1 -1
  265. package/dist/ionic/{p-38ccfd71.system.entry.js → p-3e6b0330.system.entry.js} +1 -1
  266. package/dist/ionic/{p-6ac3e877.system.entry.js → p-416d7f8d.system.entry.js} +1 -1
  267. package/dist/ionic/{p-048f1ebe.entry.js → p-44fa0a61.entry.js} +1 -1
  268. package/dist/ionic/{p-35818410.entry.js → p-4555335a.entry.js} +1 -1
  269. package/dist/ionic/p-469d6a98.entry.js +4 -0
  270. package/dist/ionic/{p-1d0aa82f.system.entry.js → p-48159bfc.system.entry.js} +1 -1
  271. package/dist/ionic/{p-fccfe602.entry.js → p-4c20879c.entry.js} +1 -1
  272. package/dist/ionic/{p-b61a2fa0.system.entry.js → p-4e76e29a.system.entry.js} +1 -1
  273. package/dist/ionic/p-50125c8c.js +4 -0
  274. package/dist/ionic/{p-a04bfada.entry.js → p-50d83224.entry.js} +1 -1
  275. package/dist/ionic/p-520789c2.js +4 -0
  276. package/dist/ionic/{p-b3c68723.system.js → p-534a1cbc.system.js} +1 -1
  277. package/dist/ionic/{p-c4a5de01.entry.js → p-57743e20.entry.js} +1 -1
  278. package/dist/ionic/{p-0d74acfb.system.entry.js → p-5b5311f6.system.entry.js} +1 -1
  279. package/dist/ionic/{p-c49672d8.system.js → p-5c24c115.system.js} +1 -1
  280. package/dist/ionic/{p-d55c9f92.system.entry.js → p-5cafe439.system.entry.js} +1 -1
  281. package/dist/ionic/{p-f623aa6d.entry.js → p-60dee335.entry.js} +1 -1
  282. package/dist/ionic/p-68b405cc.entry.js +4 -0
  283. package/dist/ionic/{p-5b32b053.entry.js → p-6a3c14d1.entry.js} +1 -1
  284. package/dist/ionic/{p-4d6ac0fe.system.entry.js → p-6a92db9d.system.entry.js} +1 -1
  285. package/dist/ionic/{p-6129af0a.system.entry.js → p-6c7d61b9.system.entry.js} +1 -1
  286. package/dist/ionic/p-6cfcb294.system.js +4 -0
  287. package/dist/ionic/{p-3a58e3a4.system.entry.js → p-6f3099b6.system.entry.js} +1 -1
  288. package/dist/ionic/{p-5efb899f.entry.js → p-70441a5b.entry.js} +1 -1
  289. package/dist/ionic/p-73eba881.system.js +4 -0
  290. package/dist/ionic/{p-c7428627.system.entry.js → p-7520e873.system.entry.js} +1 -1
  291. package/dist/ionic/{p-108f9d49.entry.js → p-7887ac7a.entry.js} +1 -1
  292. package/dist/ionic/{p-76378400.js → p-7a590a28.js} +1 -1
  293. package/dist/ionic/{p-d35217be.entry.js → p-7b15d413.entry.js} +1 -1
  294. package/dist/ionic/{p-6ba7fad7.system.js → p-82c72668.system.js} +1 -1
  295. package/dist/ionic/{p-cf0c93e3.system.entry.js → p-84549737.system.entry.js} +1 -1
  296. package/dist/ionic/{p-9173418c.system.entry.js → p-88a1a4fe.system.entry.js} +1 -1
  297. package/dist/ionic/{p-170e9de0.system.entry.js → p-8957b1de.system.entry.js} +1 -1
  298. package/dist/ionic/{p-03c381ec.system.entry.js → p-89e3d112.system.entry.js} +1 -1
  299. package/dist/ionic/{p-181b7c2a.js → p-8a289322.js} +1 -1
  300. package/dist/ionic/{p-29073efe.system.entry.js → p-8f36cde3.system.entry.js} +1 -1
  301. package/dist/ionic/{p-df5fe0be.system.js → p-90012797.system.js} +1 -1
  302. package/dist/ionic/p-903c36fe.js +5 -0
  303. package/dist/ionic/{p-1ecba429.entry.js → p-9201a4d3.entry.js} +1 -1
  304. package/dist/ionic/{p-6ea2e653.entry.js → p-92d72ad8.entry.js} +1 -1
  305. package/dist/ionic/{p-9b4a77fc.system.entry.js → p-9736406a.system.entry.js} +1 -1
  306. package/dist/ionic/{p-3f3da911.system.entry.js → p-9a6f6789.system.entry.js} +1 -1
  307. package/dist/ionic/{p-d89d0de0.entry.js → p-9b796813.entry.js} +1 -1
  308. package/dist/ionic/{p-02a4e81a.js → p-9dbc208c.js} +1 -1
  309. package/dist/ionic/{p-eab10949.system.entry.js → p-9e91c83f.system.entry.js} +1 -1
  310. package/dist/ionic/{p-939e0fa1.system.js → p-9f9efb31.system.js} +1 -1
  311. package/dist/ionic/{p-c48fc95d.system.entry.js → p-a157df46.system.entry.js} +1 -1
  312. package/dist/ionic/p-a4ce3b06.system.entry.js +4 -0
  313. package/dist/ionic/{p-6fb80ef3.system.entry.js → p-a60cff26.system.entry.js} +1 -1
  314. package/dist/ionic/{p-f588e951.entry.js → p-a7361c85.entry.js} +1 -1
  315. package/dist/ionic/{p-e1ac688a.entry.js → p-a99e7e72.entry.js} +1 -1
  316. package/dist/ionic/{p-6f8a95a3.system.entry.js → p-a9b13f18.system.entry.js} +1 -1
  317. package/dist/ionic/p-aae05032.entry.js +4 -0
  318. package/dist/ionic/{p-54f6cd27.system.entry.js → p-abfd1f2e.system.entry.js} +1 -1
  319. package/dist/ionic/{p-eac263dd.entry.js → p-ac32f6ce.entry.js} +1 -1
  320. package/dist/ionic/{p-5cd791b3.system.entry.js → p-ae57449e.system.entry.js} +1 -1
  321. package/dist/ionic/{p-f960fd84.system.entry.js → p-ae8121f5.system.entry.js} +1 -1
  322. package/dist/ionic/{p-c3efbcf5.system.js → p-b25a96b7.system.js} +1 -1
  323. package/dist/ionic/{p-55d3a9b2.entry.js → p-b27772bf.entry.js} +1 -1
  324. package/dist/ionic/{p-706a0391.entry.js → p-b4c0e9ee.entry.js} +1 -1
  325. package/dist/ionic/{p-8a2801f1.system.entry.js → p-b4daca17.system.entry.js} +1 -1
  326. package/dist/ionic/{p-35eb1d95.entry.js → p-b4f14d9e.entry.js} +1 -1
  327. package/dist/ionic/{p-5b976d70.entry.js → p-b79eb3cd.entry.js} +1 -1
  328. package/dist/ionic/{p-04e7c8fd.entry.js → p-b7ac706d.entry.js} +1 -1
  329. package/dist/ionic/p-b8c3f071.system.js +4 -0
  330. package/dist/ionic/{p-839276d4.entry.js → p-b9e2aede.entry.js} +1 -1
  331. package/dist/ionic/{p-4b8db805.entry.js → p-bc7420cc.entry.js} +1 -1
  332. package/dist/ionic/{p-33a8349a.system.entry.js → p-c09e1da9.system.entry.js} +1 -1
  333. package/dist/ionic/{p-3c2c6fce.entry.js → p-c0c794dd.entry.js} +1 -1
  334. package/dist/ionic/{p-96ba8eac.entry.js → p-ca655a7c.entry.js} +1 -1
  335. package/dist/ionic/{p-117cd69f.system.entry.js → p-ccdd595c.system.entry.js} +1 -1
  336. package/dist/ionic/p-d0d59328.entry.js +4 -0
  337. package/dist/ionic/p-d1df86ff.entry.js +4 -0
  338. package/dist/ionic/{p-e2fd0895.entry.js → p-d2a278b1.entry.js} +1 -1
  339. package/dist/ionic/{p-908720f3.system.entry.js → p-d8eeabae.system.entry.js} +1 -1
  340. package/dist/ionic/{p-e0f52215.system.entry.js → p-d90f0779.system.entry.js} +1 -1
  341. package/dist/ionic/{p-164b0e76.entry.js → p-da024961.entry.js} +1 -1
  342. package/dist/ionic/{p-238f0ac5.system.entry.js → p-db8b267a.system.entry.js} +1 -1
  343. package/dist/ionic/{p-99dfa53f.system.entry.js → p-dcfea01f.system.entry.js} +1 -1
  344. package/dist/ionic/{p-51269f3b.system.js → p-e0f66356.system.js} +1 -1
  345. package/dist/ionic/{p-1289b3b5.system.entry.js → p-e263255c.system.entry.js} +1 -1
  346. package/dist/ionic/{p-95b14c73.system.entry.js → p-e6d2cca2.system.entry.js} +1 -1
  347. package/dist/ionic/p-ec25d547.system.js +4 -0
  348. package/dist/ionic/{p-4bb26b01.system.entry.js → p-ec451ef7.system.entry.js} +1 -1
  349. package/dist/ionic/{p-63505fbb.js → p-ee8881d0.js} +1 -1
  350. package/dist/ionic/{p-64e20cd9.entry.js → p-ef4408d6.entry.js} +1 -1
  351. package/dist/ionic/{p-45f5c8ba.system.entry.js → p-efd574eb.system.entry.js} +1 -1
  352. package/dist/ionic/{p-beb864e4.system.entry.js → p-f37d6823.system.entry.js} +1 -1
  353. package/dist/ionic/{p-72aea40e.system.entry.js → p-f48af9da.system.entry.js} +1 -1
  354. package/dist/ionic/{p-db1a1e00.entry.js → p-fa06c407.entry.js} +1 -1
  355. package/dist/ionic/{p-b3690814.system.entry.js → p-fbc7995a.system.entry.js} +1 -1
  356. package/dist/node_modules/ionicons/dist/collection/components/icon/icon.css +46 -4
  357. package/dist/types/components/datetime/datetime-interface.d.ts +1 -0
  358. package/dist/types/components/datetime/datetime.d.ts +2 -2
  359. package/dist/types/components/datetime/utils/data.d.ts +3 -3
  360. package/dist/types/components/datetime/utils/format.d.ts +3 -3
  361. package/dist/types/components/datetime/utils/helpers.d.ts +15 -1
  362. package/dist/types/components/menu/menu-interface.d.ts +0 -1
  363. package/dist/types/components/toast/animations/ios.enter.d.ts +2 -1
  364. package/dist/types/components/toast/animations/ios.leave.d.ts +2 -2
  365. package/dist/types/components/toast/animations/md.enter.d.ts +2 -1
  366. package/dist/types/components/toast/animations/utils.d.ts +18 -0
  367. package/dist/types/components/toast/toast-interface.d.ts +11 -0
  368. package/dist/types/components/toast/toast.d.ts +21 -1
  369. package/dist/types/components.d.ts +16 -8
  370. package/dist/types/index.d.ts +1 -0
  371. package/dist/types/utils/menu-controller/index.d.ts +1 -2
  372. package/hydrate/index.js +359 -158
  373. package/package.json +6 -7
  374. package/dist/collection/components/select/test/disabled/select.e2e.js +0 -30
  375. package/dist/esm-es5/app-globals-ec816a70.js +0 -4
  376. package/dist/esm-es5/data-009dbf15.js +0 -4
  377. package/dist/esm-es5/index-b49b173c.js +0 -5
  378. package/dist/esm-es5/index-d78b533e.js +0 -4
  379. package/dist/ionic/p-05ae600a.system.js +0 -4
  380. package/dist/ionic/p-06ac429a.js +0 -5
  381. package/dist/ionic/p-0c37546b.system.entry.js +0 -4
  382. package/dist/ionic/p-13d6e57a.js +0 -4
  383. package/dist/ionic/p-1c82e9ff.js +0 -4
  384. package/dist/ionic/p-29e3a9bb.entry.js +0 -4
  385. package/dist/ionic/p-32d364f0.entry.js +0 -4
  386. package/dist/ionic/p-37448ac1.entry.js +0 -4
  387. package/dist/ionic/p-44ef7224.system.js +0 -4
  388. package/dist/ionic/p-4dd96c8d.entry.js +0 -4
  389. package/dist/ionic/p-5bc5008c.entry.js +0 -4
  390. package/dist/ionic/p-5c3e72a8.system.js +0 -4
  391. package/dist/ionic/p-5c651aab.system.entry.js +0 -4
  392. package/dist/ionic/p-5ece7025.system.js +0 -4
  393. package/dist/ionic/p-65a5761f.js +0 -4
  394. package/dist/ionic/p-73ed9a91.js +0 -4
  395. package/dist/ionic/p-7cfd253c.js +0 -4
  396. package/dist/ionic/p-8297652e.entry.js +0 -4
  397. package/dist/ionic/p-a18ec02b.entry.js +0 -4
  398. package/dist/ionic/p-fbcb157b.system.js +0 -4
  399. /package/dist/esm-es5/{haptic-6447af60.js → haptic-1243b917.js} +0 -0
  400. /package/dist/esm-es5/{index-ecfc2c9f.js → index-504b03f0.js} +0 -0
  401. /package/dist/ionic/{p-0a87858b.js → p-15bae383.js} +0 -0
  402. /package/dist/ionic/{p-8985b268.system.js → p-3f919368.system.js} +0 -0
  403. /package/dist/ionic/{p-14d7b7e2.system.js → p-b4b4bb29.system.js} +0 -0
  404. /package/dist/ionic/{p-bb6f38ed.js → p-b923f3d7.js} +0 -0
package/hydrate/index.js CHANGED
@@ -6,7 +6,7 @@
6
6
  Object.defineProperty(exports, '__esModule', { value: true });
7
7
 
8
8
  /*!
9
- Stencil Mock Doc v4.4.1 | MIT Licensed | https://stenciljs.com
9
+ Stencil Mock Doc v4.4.0 | MIT Licensed | https://stenciljs.com
10
10
  */
11
11
  const CONTENT_REF_ID = 'r';
12
12
  const ORG_LOCATION_ID = 'o';
@@ -5594,42 +5594,36 @@ const createElm = (e, t, o, n) => {
5594
5594
  isSvgMode && "svg" === l && (isSvgMode = !1));
5595
5595
  }, updateFallbackSlotVisibility = e => {
5596
5596
  const t = e.childNodes;
5597
- for (const e of t) if (1 === e.nodeType) {
5598
- if (e["s-sr"]) {
5599
- const o = e["s-sn"];
5600
- e.hidden = !1;
5601
- for (const n of t) if (n["s-hn"] !== e["s-hn"] || "" !== o) {
5602
- if (1 === n.nodeType && o === n.getAttribute("slot")) {
5603
- e.hidden = !0;
5604
- break;
5605
- }
5606
- } else if (1 === n.nodeType || 3 === n.nodeType && "" !== n.textContent.trim()) {
5607
- e.hidden = !0;
5597
+ let o, n, s, l, a, r;
5598
+ for (n = 0, s = t.length; n < s; n++) if (o = t[n], 1 === o.nodeType) {
5599
+ if (o["s-sr"]) for (a = o["s-sn"], o.hidden = !1, l = 0; l < s; l++) if (r = t[l].nodeType,
5600
+ t[l]["s-hn"] !== o["s-hn"] || "" !== a) {
5601
+ if (1 === r && a === t[l].getAttribute("slot")) {
5602
+ o.hidden = !0;
5608
5603
  break;
5609
5604
  }
5605
+ } else if (1 === r || 3 === r && "" !== t[l].textContent.trim()) {
5606
+ o.hidden = !0;
5607
+ break;
5610
5608
  }
5611
- updateFallbackSlotVisibility(e);
5609
+ updateFallbackSlotVisibility(o);
5612
5610
  }
5613
- }, relocateNodes = [], markSlotContentForRelocation = e => {
5614
- let t, o, n;
5615
- for (const s of e.childNodes) {
5616
- if (s["s-sr"] && (t = s["s-cr"]) && t.parentNode) {
5617
- o = t.parentNode.childNodes;
5618
- const e = s["s-sn"];
5619
- for (n = o.length - 1; n >= 0; n--) if (t = o[n], !t["s-cn"] && !t["s-nr"] && t["s-hn"] !== s["s-hn"]) if (isNodeLocatedInSlot(t, e)) {
5620
- let o = relocateNodes.find((e => e.$nodeToRelocate$ === t));
5621
- checkSlotFallbackVisibility = !0, t["s-sn"] = t["s-sn"] || e, o ? o.$slotRefNode$ = s : relocateNodes.push({
5622
- $slotRefNode$: s,
5623
- $nodeToRelocate$: t
5624
- }), t["s-sr"] && relocateNodes.map((e => {
5625
- isNodeLocatedInSlot(e.$nodeToRelocate$, t["s-sn"]) && (o = relocateNodes.find((e => e.$nodeToRelocate$ === t)),
5626
- o && !e.$slotRefNode$ && (e.$slotRefNode$ = o.$slotRefNode$));
5627
- }));
5628
- } else relocateNodes.some((e => e.$nodeToRelocate$ === t)) || relocateNodes.push({
5629
- $nodeToRelocate$: t
5630
- });
5631
- }
5632
- 1 === s.nodeType && markSlotContentForRelocation(s);
5611
+ }, relocateNodes = [], relocateSlotContent = e => {
5612
+ let t, o, n, s, l, a, r = 0;
5613
+ const i = e.childNodes, d = i.length;
5614
+ for (;r < d; r++) {
5615
+ if (t = i[r], t["s-sr"] && (o = t["s-cr"]) && o.parentNode) for (n = o.parentNode.childNodes,
5616
+ s = t["s-sn"], a = n.length - 1; a >= 0; a--) o = n[a], o["s-cn"] || o["s-nr"] || o["s-hn"] === t["s-hn"] || (isNodeLocatedInSlot(o, s) ? (l = relocateNodes.find((e => e.$nodeToRelocate$ === o)),
5617
+ checkSlotFallbackVisibility = !0, o["s-sn"] = o["s-sn"] || s, l ? l.$slotRefNode$ = t : relocateNodes.push({
5618
+ $slotRefNode$: t,
5619
+ $nodeToRelocate$: o
5620
+ }), o["s-sr"] && relocateNodes.map((e => {
5621
+ isNodeLocatedInSlot(e.$nodeToRelocate$, o["s-sn"]) && (l = relocateNodes.find((e => e.$nodeToRelocate$ === o)),
5622
+ l && !e.$slotRefNode$ && (e.$slotRefNode$ = l.$slotRefNode$));
5623
+ }))) : relocateNodes.some((e => e.$nodeToRelocate$ === o)) || relocateNodes.push({
5624
+ $nodeToRelocate$: o
5625
+ }));
5626
+ 1 === t.nodeType && relocateSlotContent(t);
5633
5627
  }
5634
5628
  }, isNodeLocatedInSlot = (e, t) => 1 === e.nodeType ? null === e.getAttribute("slot") && "" === t || e.getAttribute("slot") === t : e["s-sn"] === t || "" === t, nullifyVNodeRefs = e => {
5635
5629
  (e.$attrs$ && e.$attrs$.ref && e.$attrs$.ref(null), e.$children$ && e.$children$.map(nullifyVNodeRefs));
@@ -5644,7 +5638,7 @@ const createElm = (e, t, o, n) => {
5644
5638
  BUILD.slotRelocation) {
5645
5639
  if (plt.$flags$ |= 1, checkSlotRelocate) {
5646
5640
  let e, t, o, n, s, l;
5647
- markSlotContentForRelocation(a.$elm$);
5641
+ relocateSlotContent(a.$elm$);
5648
5642
  let r = 0;
5649
5643
  for (;r < relocateNodes.length; r++) e = relocateNodes[r], t = e.$nodeToRelocate$,
5650
5644
  t["s-ol"] || (o = originalLocationDebugNode(t) ,
@@ -5710,9 +5704,9 @@ const callRender = (e, t, o, n) => {
5710
5704
  BUILD.isDev ), 64 & e.$flags$ ? ((safeCall$1(s, "componentDidUpdate"),
5711
5705
  BUILD.isDev ), n()) : (e.$flags$ |= 64, addHydratedFlag(o),
5712
5706
  (safeCall$1(s, "componentDidLoad"),
5713
- BUILD.isDev ), n(), (e.$onReadyResolve$(o), l || appDidLoad())), e.$onInstanceResolve$(o),
5714
- (e.$onRenderResolve$ && (e.$onRenderResolve$(), e.$onRenderResolve$ = void 0),
5715
- 512 & e.$flags$ && nextTick((() => scheduleUpdate(e, !1))), e.$flags$ &= -517);
5707
+ BUILD.isDev ), n(), (e.$onReadyResolve$(o), l || appDidLoad())), e.$onInstanceResolve$(o), (e.$onRenderResolve$ && (e.$onRenderResolve$(),
5708
+ e.$onRenderResolve$ = void 0), 512 & e.$flags$ && nextTick((() => scheduleUpdate(e, !1))),
5709
+ e.$flags$ &= -517);
5716
5710
  }, forceUpdate$1 = e => {
5717
5711
  return !1;
5718
5712
  }, appDidLoad = e => {
@@ -5802,11 +5796,10 @@ const callRender = (e, t, o, n) => {
5802
5796
  }
5803
5797
  }
5804
5798
  return e;
5805
- }, initializeComponent = async (e, t, o, n) => {
5806
- let s;
5799
+ }, initializeComponent = async (e, t, o, n, s) => {
5807
5800
  if (0 == (32 & t.$flags$)) {
5808
5801
  if (t.$flags$ |= 32, BUILD.lazyLoad ) {
5809
- if (s = loadModule(o), s.then) {
5802
+ if ((s = loadModule(o)).then) {
5810
5803
  const e = (() => {});
5811
5804
  s = await s, e();
5812
5805
  }
@@ -6428,7 +6421,7 @@ const shallowEqualStringMap = (map1, map2) => {
6428
6421
  return true;
6429
6422
  };
6430
6423
 
6431
- /* Ionicons v7.1.0, ES Modules */
6424
+ /* Ionicons v7.1.2, ES Modules */
6432
6425
  const arrowBackSharp = "data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' class='ionicon' viewBox='0 0 512 512'><path stroke-linecap='square' stroke-miterlimit='10' stroke-width='48' d='M244 400L100 256l144-144M120 256h292' class='ionicon-fill-none'/></svg>";
6433
6426
  const arrowDown = "data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' class='ionicon' viewBox='0 0 512 512'><path stroke-linecap='round' stroke-linejoin='round' stroke-width='48' d='M112 268l144 144 144-144M256 392V100' class='ionicon-fill-none'/></svg>";
6434
6427
  const caretBackSharp = "data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' class='ionicon' viewBox='0 0 512 512'><path d='M368 64L144 256l224 192V64z'/></svg>";
@@ -7156,6 +7149,7 @@ const HapticEngine = {
7156
7149
  * if the browser does not support the Vibrate API.
7157
7150
  */
7158
7151
  if ((capacitor === null || capacitor === void 0 ? void 0 : capacitor.getPlatform()) === 'web') {
7152
+ // eslint-disable-next-line @typescript-eslint/prefer-optional-chain
7159
7153
  return typeof navigator !== 'undefined' && navigator.vibrate !== undefined;
7160
7154
  }
7161
7155
  return true;
@@ -8225,6 +8219,7 @@ const setOverlayId = (el) => {
8225
8219
  return el.id;
8226
8220
  };
8227
8221
  const createOverlay = (tagName, opts) => {
8222
+ // eslint-disable-next-line @typescript-eslint/prefer-optional-chain
8228
8223
  if (typeof window !== 'undefined' && typeof window.customElements !== 'undefined') {
8229
8224
  return window.customElements.whenDefined(tagName).then(() => {
8230
8225
  const element = document.createElement(tagName);
@@ -10553,6 +10548,14 @@ class Alert {
10553
10548
  }
10554
10549
  onKeydown(ev) {
10555
10550
  const inputTypes = new Set(this.processedInputs.map((i) => i.type));
10551
+ /**
10552
+ * Based on keyboard navigation requirements, the
10553
+ * checkbox should not respond to the enter keydown event.
10554
+ */
10555
+ if (inputTypes.has('checkbox') && ev.key === 'Enter') {
10556
+ ev.preventDefault();
10557
+ return;
10558
+ }
10556
10559
  // The only inputs we want to navigate between using arrow keys are the radios
10557
10560
  // ignore the keydown event if it is not on a radio button
10558
10561
  if (!inputTypes.has('radio') ||
@@ -12192,9 +12195,6 @@ class Checkbox {
12192
12195
  this.ionBlur.emit();
12193
12196
  };
12194
12197
  this.onClick = (ev) => {
12195
- if (this.disabled) {
12196
- return;
12197
- }
12198
12198
  this.toggleChecked(ev);
12199
12199
  };
12200
12200
  this.color = undefined;
@@ -13082,13 +13082,19 @@ const warnIfValueOutOfBounds = (value, min, max) => {
13082
13082
  const isLeapYear = (year) => {
13083
13083
  return (year % 4 === 0 && year % 100 !== 0) || year % 400 === 0;
13084
13084
  };
13085
- const is24Hour = (locale, hourCycle) => {
13085
+ /**
13086
+ * Determines the hour cycle for a user.
13087
+ * If the hour cycle is explicitly defined, just use that.
13088
+ * Otherwise, we try to derive it from either the specified
13089
+ * locale extension tags or from Intl.DateTimeFormat directly.
13090
+ */
13091
+ const getHourCycle = (locale, hourCycle) => {
13086
13092
  /**
13087
- * If developer has explicitly enabled h23 time
13093
+ * If developer has explicitly enabled 24-hour time
13088
13094
  * then return early and do not look at the system default.
13089
13095
  */
13090
13096
  if (hourCycle !== undefined) {
13091
- return hourCycle === 'h23';
13097
+ return hourCycle;
13092
13098
  }
13093
13099
  /**
13094
13100
  * If hourCycle was not specified, check the locale
@@ -13099,7 +13105,7 @@ const is24Hour = (locale, hourCycle) => {
13099
13105
  const formatted = new Intl.DateTimeFormat(locale, { hour: 'numeric' });
13100
13106
  const options = formatted.resolvedOptions();
13101
13107
  if (options.hourCycle !== undefined) {
13102
- return options.hourCycle === 'h23';
13108
+ return options.hourCycle;
13103
13109
  }
13104
13110
  /**
13105
13111
  * If hourCycle is not specified (either through lack
@@ -13112,7 +13118,33 @@ const is24Hour = (locale, hourCycle) => {
13112
13118
  if (!hour) {
13113
13119
  throw new Error('Hour value not found from DateTimeFormat');
13114
13120
  }
13115
- return hour.value === '00';
13121
+ /**
13122
+ * Midnight for h11 starts at 0:00am
13123
+ * Midnight for h12 starts at 12:00am
13124
+ * Midnight for h23 starts at 00:00
13125
+ * Midnight for h24 starts at 24:00
13126
+ */
13127
+ switch (hour.value) {
13128
+ case '0':
13129
+ return 'h11';
13130
+ case '12':
13131
+ return 'h12';
13132
+ case '00':
13133
+ return 'h23';
13134
+ case '24':
13135
+ return 'h24';
13136
+ default:
13137
+ throw new Error(`Invalid hour cycle "${hourCycle}"`);
13138
+ }
13139
+ };
13140
+ /**
13141
+ * Determine if the hour cycle uses a 24-hour format.
13142
+ * Returns true for h23 and h24. Returns false otherwise.
13143
+ * If you don't know the hourCycle, use getHourCycle above
13144
+ * and pass the result into this function.
13145
+ */
13146
+ const is24Hour = (hourCycle) => {
13147
+ return hourCycle === 'h23' || hourCycle === 'h24';
13116
13148
  };
13117
13149
  /**
13118
13150
  * Given a date object, returns the number
@@ -13779,7 +13811,7 @@ const getFormattedDayPeriod = (dayPeriod) => {
13779
13811
  }
13780
13812
  return dayPeriod.toUpperCase();
13781
13813
  };
13782
- const getLocalizedTime = (locale, refParts, use24Hour) => {
13814
+ const getLocalizedTime = (locale, refParts, hourCycle) => {
13783
13815
  const timeParts = {
13784
13816
  hour: refParts.hour,
13785
13817
  minute: refParts.minute,
@@ -13801,7 +13833,7 @@ const getLocalizedTime = (locale, refParts, use24Hour) => {
13801
13833
  * We use hourCycle here instead of hour12 due to:
13802
13834
  * https://bugs.chromium.org/p/chromium/issues/detail?id=1347316&q=hour12&can=2
13803
13835
  */
13804
- hourCycle: use24Hour ? 'h23' : 'h12',
13836
+ hourCycle,
13805
13837
  /**
13806
13838
  * Setting Z at the end indicates that this
13807
13839
  * date string is in the UTC time zone. This
@@ -13839,17 +13871,33 @@ const addTimePadding = (value) => {
13839
13871
  * 12 hour times it ensures that
13840
13872
  * hour 0 is formatted as '12'.
13841
13873
  */
13842
- const getFormattedHour = (hour, use24Hour) => {
13843
- if (use24Hour) {
13844
- return addTimePadding(hour);
13845
- }
13874
+ const getFormattedHour = (hour, hourCycle) => {
13846
13875
  /**
13847
- * If using 12 hour
13848
- * format, make sure hour
13849
- * 0 is formatted as '12'.
13876
+ * Midnight for h11 starts at 0:00am
13877
+ * Midnight for h12 starts at 12:00am
13878
+ * Midnight for h23 starts at 00:00
13879
+ * Midnight for h24 starts at 24:00
13850
13880
  */
13851
13881
  if (hour === 0) {
13852
- return '12';
13882
+ switch (hourCycle) {
13883
+ case 'h11':
13884
+ return '0';
13885
+ case 'h12':
13886
+ return '12';
13887
+ case 'h23':
13888
+ return '00';
13889
+ case 'h24':
13890
+ return '24';
13891
+ default:
13892
+ throw new Error(`Invalid hour cycle "${hourCycle}"`);
13893
+ }
13894
+ }
13895
+ const use24Hour = is24Hour(hourCycle);
13896
+ /**
13897
+ * h23 and h24 use 24 hour times.
13898
+ */
13899
+ if (use24Hour) {
13900
+ return addTimePadding(hour);
13853
13901
  }
13854
13902
  return hour.toString();
13855
13903
  };
@@ -14084,8 +14132,14 @@ const minutes = [
14084
14132
  0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31,
14085
14133
  32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59,
14086
14134
  ];
14135
+ // h11 hour system uses 0-11. Midnight starts at 0:00am.
14136
+ const hour11 = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11];
14137
+ // h12 hour system uses 0-12. Midnight starts at 12:00am.
14087
14138
  const hour12 = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11];
14139
+ // h23 hour system uses 0-23. Midnight starts at 0:00.
14088
14140
  const hour23 = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23];
14141
+ // h24 hour system uses 1-24. Midnight starts at 24:00.
14142
+ const hour24 = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 0];
14089
14143
  /**
14090
14144
  * Given a locale and a mode,
14091
14145
  * return an array with formatted days
@@ -14154,14 +14208,33 @@ const getDaysOfMonth = (month, year, firstDayOfWeek) => {
14154
14208
  }
14155
14209
  return days;
14156
14210
  };
14211
+ /**
14212
+ * Returns an array of pre-defined hour
14213
+ * values based on the provided hourCycle.
14214
+ */
14215
+ const getHourData = (hourCycle) => {
14216
+ switch (hourCycle) {
14217
+ case 'h11':
14218
+ return hour11;
14219
+ case 'h12':
14220
+ return hour12;
14221
+ case 'h23':
14222
+ return hour23;
14223
+ case 'h24':
14224
+ return hour24;
14225
+ default:
14226
+ throw new Error(`Invalid hour cycle "${hourCycle}"`);
14227
+ }
14228
+ };
14157
14229
  /**
14158
14230
  * Given a local, reference datetime parts and option
14159
14231
  * max/min bound datetime parts, calculate the acceptable
14160
14232
  * hour and minute values according to the bounds and locale.
14161
14233
  */
14162
- const generateTime = (refParts, hourCycle = 'h12', minParts, maxParts, hourValues, minuteValues) => {
14163
- const use24Hour = hourCycle === 'h23';
14164
- let processedHours = use24Hour ? hour23 : hour12;
14234
+ const generateTime = (locale, refParts, hourCycle = 'h12', minParts, maxParts, hourValues, minuteValues) => {
14235
+ const computedHourCycle = getHourCycle(locale, hourCycle);
14236
+ const use24Hour = is24Hour(computedHourCycle);
14237
+ let processedHours = getHourData(computedHourCycle);
14165
14238
  let processedMinutes = minutes;
14166
14239
  let isAMAllowed = true;
14167
14240
  let isPMAllowed = true;
@@ -14493,11 +14566,12 @@ const getCombinedDateColumnData = (locale, todayParts, minParts, maxParts, dayVa
14493
14566
  };
14494
14567
  };
14495
14568
  const getTimeColumnsData = (locale, refParts, hourCycle, minParts, maxParts, allowedHourValues, allowedMinuteValues) => {
14496
- const use24Hour = is24Hour(locale, hourCycle);
14497
- const { hours, minutes, am, pm } = generateTime(refParts, use24Hour ? 'h23' : 'h12', minParts, maxParts, allowedHourValues, allowedMinuteValues);
14569
+ const computedHourCycle = getHourCycle(locale, hourCycle);
14570
+ const use24Hour = is24Hour(computedHourCycle);
14571
+ const { hours, minutes, am, pm } = generateTime(locale, refParts, computedHourCycle, minParts, maxParts, allowedHourValues, allowedMinuteValues);
14498
14572
  const hoursItems = hours.map((hour) => {
14499
14573
  return {
14500
- text: getFormattedHour(hour, use24Hour),
14574
+ text: getFormattedHour(hour, computedHourCycle),
14501
14575
  value: getInternalHourValue(hour, use24Hour, refParts.ampm),
14502
14576
  };
14503
14577
  });
@@ -16060,7 +16134,7 @@ class Datetime {
16060
16134
  }
16061
16135
  renderTimeOverlay() {
16062
16136
  const { hourCycle, isTimePopoverOpen, locale } = this;
16063
- const use24Hour = is24Hour(locale, hourCycle);
16137
+ const computedHourCycle = getHourCycle(locale, hourCycle);
16064
16138
  const activePart = this.getActivePartsWithFallback();
16065
16139
  return [
16066
16140
  hAsync("div", { class: "time-header" }, this.renderTimeLabel()),
@@ -16079,7 +16153,7 @@ class Datetime {
16079
16153
  await popoverRef.onWillDismiss();
16080
16154
  this.isTimePopoverOpen = false;
16081
16155
  }
16082
- } }, getLocalizedTime(locale, activePart, use24Hour)),
16156
+ } }, getLocalizedTime(locale, activePart, computedHourCycle)),
16083
16157
  hAsync("ion-popover", { alignment: "center", translucent: true, overlayIndex: 1, arrow: false, onWillPresent: (ev) => {
16084
16158
  /**
16085
16159
  * Intersection Observers do not consistently fire between Blink and Webkit
@@ -16344,13 +16418,13 @@ class DatetimeButton {
16344
16418
  * warning in the console.
16345
16419
  */
16346
16420
  const firstParsedDatetime = parsedDatetimes[0];
16347
- const use24Hour = is24Hour(locale, hourCycle);
16421
+ const computedHourCycle = getHourCycle(locale, hourCycle);
16348
16422
  this.dateText = this.timeText = undefined;
16349
16423
  switch (datetimePresentation) {
16350
16424
  case 'date-time':
16351
16425
  case 'time-date':
16352
16426
  const dateText = getMonthDayAndYear(locale, firstParsedDatetime);
16353
- const timeText = getLocalizedTime(locale, firstParsedDatetime, use24Hour);
16427
+ const timeText = getLocalizedTime(locale, firstParsedDatetime, computedHourCycle);
16354
16428
  if (preferWheel) {
16355
16429
  this.dateText = `${dateText} ${timeText}`;
16356
16430
  }
@@ -16377,7 +16451,7 @@ class DatetimeButton {
16377
16451
  }
16378
16452
  break;
16379
16453
  case 'time':
16380
- this.timeText = getLocalizedTime(locale, firstParsedDatetime, use24Hour);
16454
+ this.timeText = getLocalizedTime(locale, firstParsedDatetime, computedHourCycle);
16381
16455
  break;
16382
16456
  case 'month-year':
16383
16457
  this.dateText = getMonthAndYear(locale, firstParsedDatetime);
@@ -17766,7 +17840,7 @@ const isRTL = (hostEl) => {
17766
17840
  return (document === null || document === void 0 ? void 0 : document.dir.toLowerCase()) === 'rtl';
17767
17841
  };
17768
17842
 
17769
- const iconCss = "/*!@:host*/.sc-ion-icon-h{display:inline-block;width:1em;height:1em;contain:strict;fill:currentColor;-webkit-box-sizing:content-box !important;box-sizing:content-box !important}/*!@:host .ionicon*/.sc-ion-icon-h .ionicon.sc-ion-icon{stroke:currentColor}/*!@.ionicon-fill-none*/.ionicon-fill-none.sc-ion-icon{fill:none}/*!@.ionicon-stroke-width*/.ionicon-stroke-width.sc-ion-icon{stroke-width:32px;stroke-width:var(--ionicon-stroke-width, 32px)}/*!@.icon-inner,\n.ionicon,\nsvg*/.icon-inner.sc-ion-icon,.ionicon.sc-ion-icon,svg.sc-ion-icon{display:block;height:100%;width:100%}/*!@:host(.flip-rtl) .icon-inner*/.flip-rtl.sc-ion-icon-h .icon-inner.sc-ion-icon{-webkit-transform:scaleX(-1);transform:scaleX(-1)}/*!@:host(.icon-small)*/.icon-small.sc-ion-icon-h{font-size:18px !important}/*!@:host(.icon-large)*/.icon-large.sc-ion-icon-h{font-size:32px !important}/*!@:host(.ion-color)*/.ion-color.sc-ion-icon-h{color:var(--ion-color-base) !important}/*!@:host(.ion-color-primary)*/.ion-color-primary.sc-ion-icon-h{--ion-color-base:var(--ion-color-primary, #3880ff)}/*!@:host(.ion-color-secondary)*/.ion-color-secondary.sc-ion-icon-h{--ion-color-base:var(--ion-color-secondary, #0cd1e8)}/*!@:host(.ion-color-tertiary)*/.ion-color-tertiary.sc-ion-icon-h{--ion-color-base:var(--ion-color-tertiary, #f4a942)}/*!@:host(.ion-color-success)*/.ion-color-success.sc-ion-icon-h{--ion-color-base:var(--ion-color-success, #10dc60)}/*!@:host(.ion-color-warning)*/.ion-color-warning.sc-ion-icon-h{--ion-color-base:var(--ion-color-warning, #ffce00)}/*!@:host(.ion-color-danger)*/.ion-color-danger.sc-ion-icon-h{--ion-color-base:var(--ion-color-danger, #f14141)}/*!@:host(.ion-color-light)*/.ion-color-light.sc-ion-icon-h{--ion-color-base:var(--ion-color-light, #f4f5f8)}/*!@:host(.ion-color-medium)*/.ion-color-medium.sc-ion-icon-h{--ion-color-base:var(--ion-color-medium, #989aa2)}/*!@:host(.ion-color-dark)*/.ion-color-dark.sc-ion-icon-h{--ion-color-base:var(--ion-color-dark, #222428)}";
17843
+ const iconCss = "/*!@:host*/.sc-ion-icon-h{display:inline-block;width:1em;height:1em;contain:strict;fill:currentColor;-webkit-box-sizing:content-box !important;box-sizing:content-box !important}/*!@:host .ionicon*/.sc-ion-icon-h .ionicon.sc-ion-icon{stroke:currentColor}/*!@.ionicon-fill-none*/.ionicon-fill-none.sc-ion-icon{fill:none}/*!@.ionicon-stroke-width*/.ionicon-stroke-width.sc-ion-icon{stroke-width:32px;stroke-width:var(--ionicon-stroke-width, 32px)}/*!@.icon-inner,\n.ionicon,\nsvg*/.icon-inner.sc-ion-icon,.ionicon.sc-ion-icon,svg.sc-ion-icon{display:block;height:100%;width:100%}@supports (background: -webkit-named-image(i)){/*!@:host(.icon-rtl) .icon-inner*/.icon-rtl.sc-ion-icon-h .icon-inner.sc-ion-icon{-webkit-transform:scaleX(-1);transform:scaleX(-1)}}@supports not selector(:dir(rtl)) and selector(:host-context([dir='rtl'])){/*!@:host(.icon-rtl) .icon-inner*/.icon-rtl.sc-ion-icon-h .icon-inner.sc-ion-icon{-webkit-transform:scaleX(-1);transform:scaleX(-1)}}/*!@:host(.flip-rtl):host-context([dir='rtl']) .icon-inner*/.flip-rtl.sc-ion-icon-h -no-combinator[dir='rtl'].sc-ion-icon-h .icon-inner.sc-ion-icon,[dir='rtl'] .sc-ion-icon-h .icon-inner.sc-ion-icon{-webkit-transform:scaleX(-1);transform:scaleX(-1)}@supports selector(:dir(rtl)){/*!@:host(.flip-rtl:dir(rtl)) .icon-inner*/.flip-rtl.sc-ion-icon-h:dir(rtl) .icon-inner.sc-ion-icon{-webkit-transform:scaleX(-1);transform:scaleX(-1)}/*!@:host(.flip-rtl:dir(ltr)) .icon-inner*/.flip-rtl.sc-ion-icon-h:dir(ltr) .icon-inner.sc-ion-icon{-webkit-transform:scaleX(1);transform:scaleX(1)}}/*!@:host(.icon-small)*/.icon-small.sc-ion-icon-h{font-size:18px !important}/*!@:host(.icon-large)*/.icon-large.sc-ion-icon-h{font-size:32px !important}/*!@:host(.ion-color)*/.ion-color.sc-ion-icon-h{color:var(--ion-color-base) !important}/*!@:host(.ion-color-primary)*/.ion-color-primary.sc-ion-icon-h{--ion-color-base:var(--ion-color-primary, #3880ff)}/*!@:host(.ion-color-secondary)*/.ion-color-secondary.sc-ion-icon-h{--ion-color-base:var(--ion-color-secondary, #0cd1e8)}/*!@:host(.ion-color-tertiary)*/.ion-color-tertiary.sc-ion-icon-h{--ion-color-base:var(--ion-color-tertiary, #f4a942)}/*!@:host(.ion-color-success)*/.ion-color-success.sc-ion-icon-h{--ion-color-base:var(--ion-color-success, #10dc60)}/*!@:host(.ion-color-warning)*/.ion-color-warning.sc-ion-icon-h{--ion-color-base:var(--ion-color-warning, #ffce00)}/*!@:host(.ion-color-danger)*/.ion-color-danger.sc-ion-icon-h{--ion-color-base:var(--ion-color-danger, #f14141)}/*!@:host(.ion-color-light)*/.ion-color-light.sc-ion-icon-h{--ion-color-base:var(--ion-color-light, #f4f5f8)}/*!@:host(.ion-color-medium)*/.ion-color-medium.sc-ion-icon-h{--ion-color-base:var(--ion-color-medium, #989aa2)}/*!@:host(.ion-color-dark)*/.ion-color-dark.sc-ion-icon-h{--ion-color-base:var(--ion-color-dark, #222428)}";
17770
17844
 
17771
17845
  class Icon {
17772
17846
  constructor(hostRef) {
@@ -17820,11 +17894,15 @@ class Icon {
17820
17894
  this.iconName = getName(this.name, this.icon, this.mode, this.ios, this.md);
17821
17895
  }
17822
17896
  render() {
17823
- const { iconName, el, inheritedAttributes } = this;
17897
+ const { flipRtl, iconName, inheritedAttributes, el } = this;
17824
17898
  const mode = this.mode || 'md';
17825
- const flipRtl = this.flipRtl ||
17826
- (iconName && (iconName.indexOf('arrow') > -1 || iconName.indexOf('chevron') > -1) && this.flipRtl !== false);
17827
- return (hAsync(Host, Object.assign({ role: "img", class: Object.assign(Object.assign({ [mode]: true }, createColorClasses(this.color)), { [`icon-${this.size}`]: !!this.size, 'flip-rtl': !!flipRtl && isRTL(el) }) }, inheritedAttributes), (hAsync("div", { class: "icon-inner" }))));
17899
+ // we have designated that arrows & chevrons should automatically flip (unless flip-rtl is set to false) because "back" is left in ltr and right in rtl, and "forward" is the opposite
17900
+ const shouldAutoFlip = iconName
17901
+ ? (iconName.includes('arrow') || iconName.includes('chevron')) && flipRtl !== false
17902
+ : false;
17903
+ // if shouldBeFlippable is true, the icon should change direction when `dir` changes
17904
+ const shouldBeFlippable = flipRtl || shouldAutoFlip;
17905
+ return (hAsync(Host, Object.assign({ role: "img", class: Object.assign(Object.assign({ [mode]: true }, createColorClasses(this.color)), { [`icon-${this.size}`]: !!this.size, 'flip-rtl': shouldBeFlippable, 'icon-rtl': shouldBeFlippable && isRTL(el) }) }, inheritedAttributes), (hAsync("div", { class: "icon-inner" }))));
17828
17906
  }
17829
17907
  static get assetsDirs() { return ["svg"]; }
17830
17908
  get el() { return getElement(this); }
@@ -20427,21 +20505,21 @@ const createMenuController = () => {
20427
20505
  const menuAnimations = new Map();
20428
20506
  const menus = [];
20429
20507
  const open = async (menu) => {
20430
- const menuEl = await get(menu);
20508
+ const menuEl = await get(menu, true);
20431
20509
  if (menuEl) {
20432
20510
  return menuEl.open();
20433
20511
  }
20434
20512
  return false;
20435
20513
  };
20436
20514
  const close = async (menu) => {
20437
- const menuEl = await (menu !== undefined ? get(menu) : getOpen());
20515
+ const menuEl = await (menu !== undefined ? get(menu, true) : getOpen());
20438
20516
  if (menuEl !== undefined) {
20439
20517
  return menuEl.close();
20440
20518
  }
20441
20519
  return false;
20442
20520
  };
20443
20521
  const toggle = async (menu) => {
20444
- const menuEl = await get(menu);
20522
+ const menuEl = await get(menu, true);
20445
20523
  if (menuEl) {
20446
20524
  return menuEl.toggle();
20447
20525
  }
@@ -20479,18 +20557,35 @@ const createMenuController = () => {
20479
20557
  }
20480
20558
  return false;
20481
20559
  };
20482
- const get = async (menu) => {
20560
+ /**
20561
+ * Finds and returns the menu specified by "menu" if registered.
20562
+ * @param menu - The side or ID of the desired menu
20563
+ * @param logOnMultipleSideMenus - If true, this function will log a warning
20564
+ * if "menu" is a side but multiple menus on the same side were found. Since this function
20565
+ * is used in multiple places, we default this log to false so that the calling
20566
+ * functions can choose whether or not it is appropriate to log this warning.
20567
+ */
20568
+ const get = async (menu, logOnMultipleSideMenus = false) => {
20483
20569
  await waitUntilReady();
20484
20570
  if (menu === 'start' || menu === 'end') {
20485
20571
  // there could be more than one menu on the same side
20486
20572
  // so first try to get the enabled one
20487
- const menuRef = find((m) => m.side === menu && !m.disabled);
20488
- if (menuRef) {
20489
- return menuRef;
20573
+ const menuRefs = menus.filter((m) => m.side === menu && !m.disabled);
20574
+ if (menuRefs.length >= 1) {
20575
+ if (menuRefs.length > 1 && logOnMultipleSideMenus) {
20576
+ printIonWarning(`menuController queried for a menu on the "${menu}" side, but ${menuRefs.length} menus were found. The first menu reference will be used. If this is not the behavior you want then pass the ID of the menu instead of its side.`, menuRefs.map((m) => m.el));
20577
+ }
20578
+ return menuRefs[0].el;
20490
20579
  }
20491
20580
  // didn't find a menu side that is enabled
20492
20581
  // so try to get the first menu side found
20493
- return find((m) => m.side === menu);
20582
+ const sideMenuRefs = menus.filter((m) => m.side === menu);
20583
+ if (sideMenuRefs.length >= 1) {
20584
+ if (sideMenuRefs.length > 1 && logOnMultipleSideMenus) {
20585
+ printIonWarning(`menuController queried for a menu on the "${menu}" side, but ${sideMenuRefs.length} menus were found. The first menu reference will be used. If this is not the behavior you want then pass the ID of the menu instead of its side.`, sideMenuRefs.map((m) => m.el));
20586
+ }
20587
+ return sideMenuRefs[0].el;
20588
+ }
20494
20589
  }
20495
20590
  else if (menu != null) {
20496
20591
  // the menuId was not left or right
@@ -20532,9 +20627,6 @@ const createMenuController = () => {
20532
20627
  };
20533
20628
  const _register = (menu) => {
20534
20629
  if (menus.indexOf(menu) < 0) {
20535
- if (!menu.disabled) {
20536
- _setActiveMenu(menu);
20537
- }
20538
20630
  menus.push(menu);
20539
20631
  }
20540
20632
  };
@@ -20544,13 +20636,6 @@ const createMenuController = () => {
20544
20636
  menus.splice(index, 1);
20545
20637
  }
20546
20638
  };
20547
- const _setActiveMenu = (menu) => {
20548
- // if this menu should be enabled
20549
- // then find all the other menus on this same side
20550
- // and automatically disable other same side menus
20551
- const side = menu.side;
20552
- menus.filter((m) => m.side === side && m !== menu).forEach((m) => (m.disabled = true));
20553
- };
20554
20639
  const _setOpen = async (menu, shouldOpen, animated) => {
20555
20640
  if (isAnimatingSync()) {
20556
20641
  return false;
@@ -20622,7 +20707,6 @@ const createMenuController = () => {
20622
20707
  _register,
20623
20708
  _unregister,
20624
20709
  _setOpen,
20625
- _setActiveMenu,
20626
20710
  };
20627
20711
  };
20628
20712
  const menuController = /*@__PURE__*/ createMenuController();
@@ -21178,17 +21262,6 @@ class Menu {
21178
21262
  */
21179
21263
  this.afterAnimation(false);
21180
21264
  }
21181
- if (doc === null || doc === void 0 ? void 0 : doc.contains(this.el)) {
21182
- /**
21183
- * Only set the active menu if the menu element is
21184
- * present in the DOM. Otherwise if it was destructively
21185
- * re-hydrated (through Angular Universal), then ignore
21186
- * setting the removed node as the active menu.
21187
- */
21188
- if (!this.disabled) {
21189
- menuController._setActiveMenu(this);
21190
- }
21191
- }
21192
21265
  }
21193
21266
  render() {
21194
21267
  const { type, disabled, isPaneVisible, inheritedAttributes, side } = this;
@@ -23992,6 +24065,7 @@ class Nav {
23992
24065
  : undefined;
23993
24066
  const mode = getIonMode$1(this);
23994
24067
  const enteringEl = enteringView.element;
24068
+ // eslint-disable-next-line @typescript-eslint/prefer-optional-chain
23995
24069
  const leavingEl = leavingView && leavingView.element;
23996
24070
  const animationOpts = Object.assign(Object.assign({ mode, showGoBack: this.canGoBackSync(enteringView), baseEl: this.el, progressCallback, animated: this.animated && config.getBoolean('animated', true), enteringEl,
23997
24071
  leavingEl }, opts), { animationBuilder: opts.animationBuilder || this.animation || config.get('navAnimation') });
@@ -27202,10 +27276,7 @@ class Radio {
27202
27276
  }
27203
27277
  };
27204
27278
  this.onClick = () => {
27205
- const { radioGroup, checked, disabled } = this;
27206
- if (disabled) {
27207
- return;
27208
- }
27279
+ const { radioGroup, checked } = this;
27209
27280
  /**
27210
27281
  * The legacy control uses a native input inside
27211
27282
  * of the radio host, so we can set this.checked
@@ -27426,7 +27497,7 @@ class RadioGroup {
27426
27497
  * using the `name` attribute.
27427
27498
  */
27428
27499
  const selectedRadio = ev.target && ev.target.closest('ion-radio');
27429
- if (selectedRadio && selectedRadio.disabled === false) {
27500
+ if (selectedRadio) {
27430
27501
  const currentValue = this.value;
27431
27502
  const newValue = selectedRadio.value;
27432
27503
  if (newValue !== currentValue) {
@@ -29753,6 +29824,7 @@ const chainToSegments = (chain) => {
29753
29824
  for (const route of chain) {
29754
29825
  for (const segment of route.segments) {
29755
29826
  if (segment[0] === ':') {
29827
+ // eslint-disable-next-line @typescript-eslint/prefer-optional-chain
29756
29828
  const param = route.params && route.params[segment.slice(1)];
29757
29829
  if (!param) {
29758
29830
  return null;
@@ -30448,12 +30520,14 @@ class Router {
30448
30520
  }
30449
30521
  const routes = readRoutes(this.el);
30450
30522
  const fromChain = findChainForSegments(from, routes);
30523
+ // eslint-disable-next-line @typescript-eslint/prefer-optional-chain
30451
30524
  const beforeLeaveHook = fromChain && fromChain[fromChain.length - 1].beforeLeave;
30452
30525
  const canLeave = beforeLeaveHook ? await beforeLeaveHook() : true;
30453
30526
  if (canLeave === false || typeof canLeave === 'object') {
30454
30527
  return canLeave;
30455
30528
  }
30456
30529
  const toChain = findChainForSegments(to, routes);
30530
+ // eslint-disable-next-line @typescript-eslint/prefer-optional-chain
30457
30531
  const beforeEnterHook = toChain && toChain[toChain.length - 1].beforeEnter;
30458
30532
  return beforeEnterHook ? beforeEnterHook() : true;
30459
30533
  }
@@ -31850,39 +31924,25 @@ class Select {
31850
31924
  await overlay.present();
31851
31925
  // focus selected option for popovers
31852
31926
  if (this.interface === 'popover') {
31853
- const indexOfSelected = this.childOpts.map((o) => o.value).indexOf(this.value);
31854
- if (indexOfSelected > -1) {
31855
- const selectedItem = overlay.querySelector(`.select-interface-option:nth-child(${indexOfSelected + 1})`);
31856
- if (selectedItem) {
31857
- focusElement(selectedItem);
31858
- /**
31859
- * Browsers such as Firefox do not
31860
- * correctly delegate focus when manually
31861
- * focusing an element with delegatesFocus.
31862
- * We work around this by manually focusing
31863
- * the interactive element.
31864
- * ion-radio and ion-checkbox are the only
31865
- * elements that ion-select-popover uses, so
31866
- * we only need to worry about those two components
31867
- * when focusing.
31868
- */
31869
- const interactiveEl = selectedItem.querySelector('ion-radio, ion-checkbox');
31870
- if (interactiveEl) {
31871
- interactiveEl.focus();
31872
- }
31873
- }
31874
- }
31875
- else {
31927
+ let indexOfSelected = this.childOpts.map((o) => o.value).indexOf(this.value);
31928
+ indexOfSelected = indexOfSelected > -1 ? indexOfSelected : 0; // default to first option if nothing selected
31929
+ const selectedItem = overlay.querySelector(`.select-interface-option:nth-child(${indexOfSelected + 1})`);
31930
+ if (selectedItem) {
31931
+ focusElement(selectedItem);
31876
31932
  /**
31877
- * If no value is set then focus the first enabled option.
31933
+ * Browsers such as Firefox do not
31934
+ * correctly delegate focus when manually
31935
+ * focusing an element with delegatesFocus.
31936
+ * We work around this by manually focusing
31937
+ * the interactive element.
31938
+ * ion-radio and ion-checkbox are the only
31939
+ * elements that ion-select-popover uses, so
31940
+ * we only need to worry about those two components
31941
+ * when focusing.
31878
31942
  */
31879
- const firstEnabledOption = overlay.querySelector('ion-radio:not(.radio-disabled), ion-checkbox:not(.checkbox-disabled)');
31880
- if (firstEnabledOption) {
31881
- focusElement(firstEnabledOption.closest('ion-item'));
31882
- /**
31883
- * Focus the option for the same reason as we do above.
31884
- */
31885
- firstEnabledOption.focus();
31943
+ const interactiveEl = selectedItem.querySelector('ion-radio, ion-checkbox');
31944
+ if (interactiveEl) {
31945
+ interactiveEl.focus();
31886
31946
  }
31887
31947
  }
31888
31948
  }
@@ -32353,7 +32413,7 @@ Developers can use the "legacy" property to continue using the legacy form marku
32353
32413
  }
32354
32414
  renderListbox() {
32355
32415
  const { disabled, inputId, isExpanded } = this;
32356
- return (hAsync("button", { disabled: disabled, id: inputId, "aria-label": this.ariaLabel, "aria-haspopup": "listbox", "aria-expanded": `${isExpanded}`, onFocus: this.onFocus, onBlur: this.onBlur, ref: (focusEl) => (this.focusEl = focusEl) }));
32416
+ return (hAsync("button", { disabled: disabled, id: inputId, "aria-label": this.ariaLabel, "aria-haspopup": "dialog", "aria-expanded": `${isExpanded}`, onFocus: this.onFocus, onBlur: this.onBlur, ref: (focusEl) => (this.focusEl = focusEl) }));
32357
32417
  }
32358
32418
  render() {
32359
32419
  const { legacyFormController } = this;
@@ -33695,13 +33755,12 @@ class Thumbnail {
33695
33755
  /**
33696
33756
  * iOS Toast Enter Animation
33697
33757
  */
33698
- const iosEnterAnimation = (baseEl, position) => {
33758
+ const iosEnterAnimation = (baseEl, opts) => {
33699
33759
  const baseAnimation = createAnimation();
33700
33760
  const wrapperAnimation = createAnimation();
33761
+ const { position, top, bottom } = opts;
33701
33762
  const root = getElementRoot(baseEl);
33702
33763
  const wrapperEl = root.querySelector('.toast-wrapper');
33703
- const bottom = `calc(-10px - var(--ion-safe-area-bottom, 0px))`;
33704
- const top = `calc(10px + var(--ion-safe-area-top, 0px))`;
33705
33764
  wrapperAnimation.addElement(wrapperEl);
33706
33765
  switch (position) {
33707
33766
  case 'top':
@@ -33722,13 +33781,12 @@ const iosEnterAnimation = (baseEl, position) => {
33722
33781
  /**
33723
33782
  * iOS Toast Leave Animation
33724
33783
  */
33725
- const iosLeaveAnimation = (baseEl, position) => {
33784
+ const iosLeaveAnimation = (baseEl, opts) => {
33726
33785
  const baseAnimation = createAnimation();
33727
33786
  const wrapperAnimation = createAnimation();
33787
+ const { position, top, bottom } = opts;
33728
33788
  const root = getElementRoot(baseEl);
33729
33789
  const wrapperEl = root.querySelector('.toast-wrapper');
33730
- const bottom = `calc(-10px - var(--ion-safe-area-bottom, 0px))`;
33731
- const top = `calc(10px + var(--ion-safe-area-top, 0px))`;
33732
33790
  wrapperAnimation.addElement(wrapperEl);
33733
33791
  switch (position) {
33734
33792
  case 'top':
@@ -33747,13 +33805,12 @@ const iosLeaveAnimation = (baseEl, position) => {
33747
33805
  /**
33748
33806
  * MD Toast Enter Animation
33749
33807
  */
33750
- const mdEnterAnimation = (baseEl, position) => {
33808
+ const mdEnterAnimation = (baseEl, opts) => {
33751
33809
  const baseAnimation = createAnimation();
33752
33810
  const wrapperAnimation = createAnimation();
33811
+ const { position, top, bottom } = opts;
33753
33812
  const root = getElementRoot(baseEl);
33754
33813
  const wrapperEl = root.querySelector('.toast-wrapper');
33755
- const bottom = `calc(8px + var(--ion-safe-area-bottom, 0px))`;
33756
- const top = `calc(8px + var(--ion-safe-area-top, 0px))`;
33757
33814
  wrapperAnimation.addElement(wrapperEl);
33758
33815
  switch (position) {
33759
33816
  case 'top':
@@ -33785,6 +33842,87 @@ const mdLeaveAnimation = (baseEl) => {
33785
33842
  return baseAnimation.easing('cubic-bezier(.36,.66,.04,1)').duration(300).addAnimation(wrapperAnimation);
33786
33843
  };
33787
33844
 
33845
+ /**
33846
+ * Calculate the CSS top and bottom position of the toast, to be used
33847
+ * as starting points for the animation keyframes.
33848
+ *
33849
+ * Note that MD animates bottom-positioned toasts using style.bottom,
33850
+ * which calculates from the bottom edge of the screen, while iOS uses
33851
+ * translateY, which calculates from the top edge of the screen. This
33852
+ * is why the bottom calculates differ slightly between modes.
33853
+ *
33854
+ * @param position The value of the toast's position prop.
33855
+ * @param positionAnchor The element the toast should be anchored to,
33856
+ * if applicable.
33857
+ * @param mode The toast component's mode (md, ios, etc).
33858
+ * @param toast A reference to the toast element itself.
33859
+ */
33860
+ function getAnimationPosition(position, positionAnchor, mode, toast) {
33861
+ /**
33862
+ * Start with a predefined offset from the edge the toast will be
33863
+ * positioned relative to, whether on the screen or anchor element.
33864
+ */
33865
+ let offset;
33866
+ if (mode === 'md') {
33867
+ offset = 8;
33868
+ }
33869
+ else {
33870
+ offset = position === 'top' ? 10 : -10;
33871
+ }
33872
+ /**
33873
+ * If positionAnchor is defined, add in the distance from the target
33874
+ * screen edge to the target anchor edge. For position="top", the
33875
+ * bottom anchor edge is targeted. For position="bottom", the top
33876
+ * anchor edge is targeted.
33877
+ */
33878
+ if (positionAnchor && win$1) {
33879
+ warnIfAnchorIsHidden(positionAnchor, toast);
33880
+ const box = positionAnchor.getBoundingClientRect();
33881
+ if (position === 'top') {
33882
+ offset += box.bottom;
33883
+ }
33884
+ else if (position === 'bottom') {
33885
+ /**
33886
+ * Just box.top is the distance from the top edge of the screen
33887
+ * to the top edge of the anchor. We want to calculate from the
33888
+ * bottom edge of the screen instead.
33889
+ */
33890
+ if (mode === 'md') {
33891
+ offset += win$1.innerHeight - box.top;
33892
+ }
33893
+ else {
33894
+ offset -= win$1.innerHeight - box.top;
33895
+ }
33896
+ }
33897
+ /**
33898
+ * We don't include safe area here because that should already be
33899
+ * accounted for when checking the position of the anchor.
33900
+ */
33901
+ return {
33902
+ top: `${offset}px`,
33903
+ bottom: `${offset}px`,
33904
+ };
33905
+ }
33906
+ else {
33907
+ return {
33908
+ top: `calc(${offset}px + var(--ion-safe-area-top, 0px))`,
33909
+ bottom: mode === 'md'
33910
+ ? `calc(${offset}px + var(--ion-safe-area-bottom, 0px))`
33911
+ : `calc(${offset}px - var(--ion-safe-area-bottom, 0px))`,
33912
+ };
33913
+ }
33914
+ }
33915
+ /**
33916
+ * If the anchor element is hidden, getBoundingClientRect()
33917
+ * will return all 0s for it, which can cause unexpected
33918
+ * results in the position calculation when animating.
33919
+ */
33920
+ function warnIfAnchorIsHidden(positionAnchor, toast) {
33921
+ if (positionAnchor.offsetParent === null) {
33922
+ 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);
33923
+ }
33924
+ }
33925
+
33788
33926
  const toastIosCss = "/*!@:host*/.sc-ion-toast-ios-h{--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*/.sc-ion-toast-ios-h{inset-inline-start:0}}@supports not (inset-inline-start: 0){/*!@:host*/.sc-ion-toast-ios-h{left:0}/*!@:host-context([dir=rtl])*/[dir=rtl].sc-ion-toast-ios-h,[dir=rtl] .sc-ion-toast-ios-h{left:unset;right:unset;right:0}/*!@@supports selector(:dir(rtl))*/@supports .sc-ion-toast-ios selector(.sc-ion-toast-ios:dir(rtl)){.sc-ion-toast-ios-h:dir(rtl){left:unset;right:unset;right:0}}}/*!@:host(.overlay-hidden)*/.overlay-hidden.sc-ion-toast-ios-h{display:none}/*!@:host(.ion-color)*/.ion-color.sc-ion-toast-ios-h{--button-color:inherit;color:var(--ion-color-contrast)}/*!@:host(.ion-color) .toast-button-cancel*/.ion-color.sc-ion-toast-ios-h .toast-button-cancel.sc-ion-toast-ios{color:inherit}/*!@:host(.ion-color) .toast-wrapper*/.ion-color.sc-ion-toast-ios-h .toast-wrapper.sc-ion-toast-ios{background:var(--ion-color-base)}/*!@.toast-wrapper*/.toast-wrapper.sc-ion-toast-ios{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*/.toast-wrapper.sc-ion-toast-ios{inset-inline-start:var(--start);inset-inline-end:var(--end)}}@supports not (inset-inline-start: 0){/*!@.toast-wrapper*/.toast-wrapper.sc-ion-toast-ios{left:var(--start);right:var(--end)}/*!@:host-context([dir=rtl]) .toast-wrapper*/[dir=rtl].sc-ion-toast-ios-h .toast-wrapper.sc-ion-toast-ios,[dir=rtl] .sc-ion-toast-ios-h .toast-wrapper.sc-ion-toast-ios{left:unset;right:unset;left:var(--end);right:var(--start)}/*!@[dir=rtl] .toast-wrapper*/[dir=rtl].sc-ion-toast-ios .toast-wrapper.sc-ion-toast-ios{left:unset;right:unset;left:var(--end);right:var(--start)}/*!@@supports selector(:dir(rtl))*/@supports .sc-ion-toast-ios selector(.sc-ion-toast-ios:dir(rtl)){.toast-wrapper:dir(rtl){left:unset;right:unset;left:var(--end);right:var(--start)}}}/*!@.toast-container*/.toast-container.sc-ion-toast-ios{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*/.toast-layout-stacked.sc-ion-toast-ios .toast-container.sc-ion-toast-ios{-ms-flex-wrap:wrap;flex-wrap:wrap}/*!@.toast-layout-baseline .toast-content*/.toast-layout-baseline.sc-ion-toast-ios .toast-content.sc-ion-toast-ios{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*/.toast-icon.sc-ion-toast-ios{-webkit-margin-start:16px;margin-inline-start:16px}/*!@.toast-message*/.toast-message.sc-ion-toast-ios{-ms-flex:1;flex:1;white-space:var(--white-space)}/*!@.toast-button-group*/.toast-button-group.sc-ion-toast-ios{display:-ms-flexbox;display:flex}/*!@.toast-layout-stacked .toast-button-group*/.toast-layout-stacked.sc-ion-toast-ios .toast-button-group.sc-ion-toast-ios{-ms-flex-pack:end;justify-content:end;width:100%}/*!@.toast-button*/.toast-button.sc-ion-toast-ios{border:0;outline:none;color:var(--button-color);z-index:0}/*!@.toast-icon,\n.toast-button-icon*/.toast-icon.sc-ion-toast-ios,.toast-button-icon.sc-ion-toast-ios{font-size:1.4em}/*!@.toast-button-inner*/.toast-button-inner.sc-ion-toast-ios{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center}@media (any-hover: hover){/*!@.toast-button:hover*/.toast-button.sc-ion-toast-ios:hover{cursor:pointer}}/*!@:host*/.sc-ion-toast-ios-h{--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;--start:10px;--end:10px;font-size:14px}/*!@.toast-wrapper*/.toast-wrapper.sc-ion-toast-ios{-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*/.toast-translucent.sc-ion-toast-ios-h .toast-wrapper.sc-ion-toast-ios{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*/.ion-color.toast-translucent.sc-ion-toast-ios-h .toast-wrapper.sc-ion-toast-ios{background:rgba(var(--ion-color-base-rgb), 0.8)}}/*!@.toast-wrapper.toast-top*/.toast-wrapper.toast-top.sc-ion-toast-ios{-webkit-transform:translate3d(0, -100%, 0);transform:translate3d(0, -100%, 0);top:0}/*!@.toast-wrapper.toast-middle*/.toast-wrapper.toast-middle.sc-ion-toast-ios{opacity:0.01}/*!@.toast-wrapper.toast-bottom*/.toast-wrapper.toast-bottom.sc-ion-toast-ios{-webkit-transform:translate3d(0, 100%, 0);transform:translate3d(0, 100%, 0);bottom:0}/*!@.toast-content*/.toast-content.sc-ion-toast-ios{-webkit-padding-start:15px;padding-inline-start:15px;-webkit-padding-end:15px;padding-inline-end:15px;padding-top:15px;padding-bottom:15px}/*!@.toast-header*/.toast-header.sc-ion-toast-ios{margin-bottom:2px;font-weight:500}/*!@.toast-button*/.toast-button.sc-ion-toast-ios{-webkit-padding-start:15px;padding-inline-start:15px;-webkit-padding-end:15px;padding-inline-end:15px;padding-top:10px;padding-bottom:10px;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:17px;font-weight:500;overflow:hidden}/*!@.toast-button.ion-activated*/.toast-button.ion-activated.sc-ion-toast-ios{opacity:0.4}@media (any-hover: hover){/*!@.toast-button:hover*/.toast-button.sc-ion-toast-ios:hover{opacity:0.6}}";
33789
33927
 
33790
33928
  const toastMdCss = "/*!@:host*/.sc-ion-toast-md-h{--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*/.sc-ion-toast-md-h{inset-inline-start:0}}@supports not (inset-inline-start: 0){/*!@:host*/.sc-ion-toast-md-h{left:0}/*!@:host-context([dir=rtl])*/[dir=rtl].sc-ion-toast-md-h,[dir=rtl] .sc-ion-toast-md-h{left:unset;right:unset;right:0}/*!@@supports selector(:dir(rtl))*/@supports .sc-ion-toast-md selector(.sc-ion-toast-md:dir(rtl)){.sc-ion-toast-md-h:dir(rtl){left:unset;right:unset;right:0}}}/*!@:host(.overlay-hidden)*/.overlay-hidden.sc-ion-toast-md-h{display:none}/*!@:host(.ion-color)*/.ion-color.sc-ion-toast-md-h{--button-color:inherit;color:var(--ion-color-contrast)}/*!@:host(.ion-color) .toast-button-cancel*/.ion-color.sc-ion-toast-md-h .toast-button-cancel.sc-ion-toast-md{color:inherit}/*!@:host(.ion-color) .toast-wrapper*/.ion-color.sc-ion-toast-md-h .toast-wrapper.sc-ion-toast-md{background:var(--ion-color-base)}/*!@.toast-wrapper*/.toast-wrapper.sc-ion-toast-md{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*/.toast-wrapper.sc-ion-toast-md{inset-inline-start:var(--start);inset-inline-end:var(--end)}}@supports not (inset-inline-start: 0){/*!@.toast-wrapper*/.toast-wrapper.sc-ion-toast-md{left:var(--start);right:var(--end)}/*!@:host-context([dir=rtl]) .toast-wrapper*/[dir=rtl].sc-ion-toast-md-h .toast-wrapper.sc-ion-toast-md,[dir=rtl] .sc-ion-toast-md-h .toast-wrapper.sc-ion-toast-md{left:unset;right:unset;left:var(--end);right:var(--start)}/*!@[dir=rtl] .toast-wrapper*/[dir=rtl].sc-ion-toast-md .toast-wrapper.sc-ion-toast-md{left:unset;right:unset;left:var(--end);right:var(--start)}/*!@@supports selector(:dir(rtl))*/@supports .sc-ion-toast-md selector(.sc-ion-toast-md:dir(rtl)){.toast-wrapper:dir(rtl){left:unset;right:unset;left:var(--end);right:var(--start)}}}/*!@.toast-container*/.toast-container.sc-ion-toast-md{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*/.toast-layout-stacked.sc-ion-toast-md .toast-container.sc-ion-toast-md{-ms-flex-wrap:wrap;flex-wrap:wrap}/*!@.toast-layout-baseline .toast-content*/.toast-layout-baseline.sc-ion-toast-md .toast-content.sc-ion-toast-md{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*/.toast-icon.sc-ion-toast-md{-webkit-margin-start:16px;margin-inline-start:16px}/*!@.toast-message*/.toast-message.sc-ion-toast-md{-ms-flex:1;flex:1;white-space:var(--white-space)}/*!@.toast-button-group*/.toast-button-group.sc-ion-toast-md{display:-ms-flexbox;display:flex}/*!@.toast-layout-stacked .toast-button-group*/.toast-layout-stacked.sc-ion-toast-md .toast-button-group.sc-ion-toast-md{-ms-flex-pack:end;justify-content:end;width:100%}/*!@.toast-button*/.toast-button.sc-ion-toast-md{border:0;outline:none;color:var(--button-color);z-index:0}/*!@.toast-icon,\n.toast-button-icon*/.toast-icon.sc-ion-toast-md,.toast-button-icon.sc-ion-toast-md{font-size:1.4em}/*!@.toast-button-inner*/.toast-button-inner.sc-ion-toast-md{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center}@media (any-hover: hover){/*!@.toast-button:hover*/.toast-button.sc-ion-toast-md:hover{cursor:pointer}}/*!@:host*/.sc-ion-toast-md-h{--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:14px}/*!@.toast-wrapper*/.toast-wrapper.sc-ion-toast-md{-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*/.toast-content.sc-ion-toast-md{-webkit-padding-start:16px;padding-inline-start:16px;-webkit-padding-end:16px;padding-inline-end:16px;padding-top:14px;padding-bottom:14px}/*!@.toast-header*/.toast-header.sc-ion-toast-md{margin-bottom:2px;font-weight:500;line-height:20px}/*!@.toast-message*/.toast-message.sc-ion-toast-md{line-height:20px}/*!@.toast-layout-baseline .toast-button-group-start*/.toast-layout-baseline.sc-ion-toast-md .toast-button-group-start.sc-ion-toast-md{-webkit-margin-start:8px;margin-inline-start:8px}/*!@.toast-layout-stacked .toast-button-group-start*/.toast-layout-stacked.sc-ion-toast-md .toast-button-group-start.sc-ion-toast-md{-webkit-margin-end:8px;margin-inline-end:8px;margin-top:8px}/*!@.toast-layout-baseline .toast-button-group-end*/.toast-layout-baseline.sc-ion-toast-md .toast-button-group-end.sc-ion-toast-md{-webkit-margin-end:8px;margin-inline-end:8px}/*!@.toast-layout-stacked .toast-button-group-end*/.toast-layout-stacked.sc-ion-toast-md .toast-button-group-end.sc-ion-toast-md{-webkit-margin-end:8px;margin-inline-end:8px;margin-bottom:8px}/*!@.toast-button*/.toast-button.sc-ion-toast-md{-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:14px;font-weight:500;letter-spacing:0.84px;text-transform:uppercase;overflow:hidden}/*!@.toast-button-cancel*/.toast-button-cancel.sc-ion-toast-md{color:var(--ion-color-step-100, #e6e6e6)}/*!@.toast-button-icon-only*/.toast-button-icon-only.sc-ion-toast-md{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*/.toast-button.sc-ion-toast-md:hover{background-color:rgba(var(--ion-color-primary-rgb, 56, 128, 255), 0.08)}/*!@.toast-button-cancel:hover*/.toast-button-cancel.sc-ion-toast-md:hover{background-color:rgba(var(--ion-background-color-rgb, 255, 255, 255), 0.08)}}";
@@ -33837,6 +33975,7 @@ class Toast {
33837
33975
  this.message = undefined;
33838
33976
  this.keyboardClose = false;
33839
33977
  this.position = 'bottom';
33978
+ this.positionAnchor = undefined;
33840
33979
  this.buttons = undefined;
33841
33980
  this.translucent = false;
33842
33981
  this.animated = true;
@@ -33884,7 +34023,19 @@ class Toast {
33884
34023
  async present() {
33885
34024
  const unlock = await this.lockController.lock();
33886
34025
  await this.delegateController.attachViewToDom();
33887
- await present(this, 'toastEnter', iosEnterAnimation, mdEnterAnimation, this.position);
34026
+ const { el, position } = this;
34027
+ const anchor = this.getAnchorElement();
34028
+ const animationPosition = getAnimationPosition(position, anchor, getIonMode$1(this), el);
34029
+ /**
34030
+ * Cache the calculated position of the toast, so we can re-use it
34031
+ * in the dismiss animation.
34032
+ */
34033
+ this.lastPresentedPosition = animationPosition;
34034
+ await present(this, 'toastEnter', iosEnterAnimation, mdEnterAnimation, {
34035
+ position,
34036
+ top: animationPosition.top,
34037
+ bottom: animationPosition.bottom,
34038
+ });
33888
34039
  /**
33889
34040
  * Content is revealed to screen readers after
33890
34041
  * the transition to avoid jank since this
@@ -33906,15 +34057,28 @@ class Toast {
33906
34057
  * Some examples include: ``"cancel"`, `"destructive"`, "selected"`, and `"backdrop"`.
33907
34058
  */
33908
34059
  async dismiss(data, role) {
34060
+ var _a, _b;
33909
34061
  const unlock = await this.lockController.lock();
33910
- if (this.durationTimeout) {
33911
- clearTimeout(this.durationTimeout);
34062
+ const { durationTimeout, position, lastPresentedPosition } = this;
34063
+ if (durationTimeout) {
34064
+ clearTimeout(durationTimeout);
33912
34065
  }
33913
- const dismissed = await dismiss(this, data, role, 'toastLeave', iosLeaveAnimation, mdLeaveAnimation, this.position);
34066
+ const dismissed = await dismiss(this, data, role, 'toastLeave', iosLeaveAnimation, mdLeaveAnimation,
34067
+ /**
34068
+ * Fetch the cached position that was calculated back in the present
34069
+ * animation. We always want to animate the dismiss from the same
34070
+ * position the present stopped at, so the animation looks continuous.
34071
+ */
34072
+ {
34073
+ position,
34074
+ top: (_a = lastPresentedPosition === null || lastPresentedPosition === void 0 ? void 0 : lastPresentedPosition.top) !== null && _a !== void 0 ? _a : '',
34075
+ bottom: (_b = lastPresentedPosition === null || lastPresentedPosition === void 0 ? void 0 : lastPresentedPosition.bottom) !== null && _b !== void 0 ? _b : '',
34076
+ });
33914
34077
  if (dismissed) {
33915
34078
  this.delegateController.removeViewFromDom();
33916
34079
  this.revealContentToScreenReader = false;
33917
34080
  }
34081
+ this.lastPresentedPosition = undefined;
33918
34082
  unlock();
33919
34083
  return dismissed;
33920
34084
  }
@@ -33938,6 +34102,44 @@ class Toast {
33938
34102
  : [];
33939
34103
  return buttons;
33940
34104
  }
34105
+ /**
34106
+ * Returns the element specified by the positionAnchor prop,
34107
+ * or undefined if prop's value is an ID string and the element
34108
+ * is not found in the DOM.
34109
+ */
34110
+ getAnchorElement() {
34111
+ const { position, positionAnchor, el } = this;
34112
+ /**
34113
+ * If positionAnchor is undefined then
34114
+ * no anchor should be used when presenting the toast.
34115
+ */
34116
+ if (positionAnchor === undefined) {
34117
+ return;
34118
+ }
34119
+ if (position === 'middle' && positionAnchor !== undefined) {
34120
+ printIonWarning('The positionAnchor property is ignored when using position="middle".', this.el);
34121
+ return undefined;
34122
+ }
34123
+ if (typeof positionAnchor === 'string') {
34124
+ /**
34125
+ * If the anchor is defined as an ID, find the element.
34126
+ * We do this on every present so the toast doesn't need
34127
+ * to account for the surrounding DOM changing since the
34128
+ * last time it was presented.
34129
+ */
34130
+ const foundEl = document.getElementById(positionAnchor);
34131
+ if (foundEl === null) {
34132
+ printIonWarning(`An anchor element with an ID of "${positionAnchor}" was not found in the DOM.`, el);
34133
+ return undefined;
34134
+ }
34135
+ return foundEl;
34136
+ }
34137
+ if (positionAnchor instanceof HTMLElement) {
34138
+ return positionAnchor;
34139
+ }
34140
+ printIonWarning('Invalid positionAnchor value:', positionAnchor, el);
34141
+ return undefined;
34142
+ }
33941
34143
  async buttonClick(button) {
33942
34144
  const role = button.role;
33943
34145
  if (isCancel(role)) {
@@ -34045,6 +34247,7 @@ class Toast {
34045
34247
  "message": [1],
34046
34248
  "keyboardClose": [4, "keyboard-close"],
34047
34249
  "position": [1],
34250
+ "positionAnchor": [1, "position-anchor"],
34048
34251
  "buttons": [16],
34049
34252
  "translucent": [4],
34050
34253
  "animated": [4],
@@ -34112,9 +34315,6 @@ class Toggle {
34112
34315
  }
34113
34316
  };
34114
34317
  this.onClick = (ev) => {
34115
- if (this.disabled) {
34116
- return;
34117
- }
34118
34318
  ev.preventDefault();
34119
34319
  if (this.lastDrag + 300 < Date.now()) {
34120
34320
  this.toggleChecked();
@@ -34765,6 +34965,7 @@ const iosTransitionAnimation = (navEl, opts) => {
34765
34965
  .easing(opts.easing || EASING)
34766
34966
  .fill('both')
34767
34967
  .beforeRemoveClass('ion-page-invisible');
34968
+ // eslint-disable-next-line @typescript-eslint/prefer-optional-chain
34768
34969
  if (leavingEl && navEl !== null && navEl !== undefined) {
34769
34970
  const navDecorAnimation = createAnimation();
34770
34971
  navDecorAnimation.addElement(navEl);