@ionic/core 9.0.7-dev.11791478996.1b854592 → 9.0.7-dev.11792524803.14f0e7d2

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 (477) hide show
  1. package/components/index.js +1 -1
  2. package/components/ion-accordion-group.js +1 -1
  3. package/components/ion-accordion.js +1 -1
  4. package/components/ion-action-sheet.js +1 -1
  5. package/components/ion-alert.js +1 -1
  6. package/components/ion-app.js +1 -1
  7. package/components/ion-avatar.js +1 -1
  8. package/components/ion-back-button.js +1 -1
  9. package/components/ion-backdrop.js +1 -1
  10. package/components/ion-badge.js +1 -1
  11. package/components/ion-breadcrumb.js +1 -1
  12. package/components/ion-breadcrumbs.js +1 -1
  13. package/components/ion-button.js +1 -1
  14. package/components/ion-buttons.js +1 -1
  15. package/components/ion-card-content.js +1 -1
  16. package/components/ion-card-header.js +1 -1
  17. package/components/ion-card-subtitle.js +1 -1
  18. package/components/ion-card-title.js +1 -1
  19. package/components/ion-card.js +1 -1
  20. package/components/ion-checkbox.js +1 -1
  21. package/components/ion-chip.js +1 -1
  22. package/components/ion-col.js +1 -1
  23. package/components/ion-content.js +1 -1
  24. package/components/ion-datetime-button.js +1 -1
  25. package/components/ion-datetime.js +1 -1
  26. package/components/ion-fab-button.js +1 -1
  27. package/components/ion-fab-list.js +1 -1
  28. package/components/ion-fab.js +1 -1
  29. package/components/ion-footer.js +1 -1
  30. package/components/ion-grid.js +1 -1
  31. package/components/ion-header.js +1 -1
  32. package/components/ion-icon.js +1 -1
  33. package/components/ion-img.js +1 -1
  34. package/components/ion-infinite-scroll-content.js +1 -1
  35. package/components/ion-infinite-scroll.js +1 -1
  36. package/components/ion-input-otp.js +1 -1
  37. package/components/ion-input-password-toggle.js +1 -1
  38. package/components/ion-input.js +1 -1
  39. package/components/ion-item-divider.js +1 -1
  40. package/components/ion-item-group.js +1 -1
  41. package/components/ion-item-option.js +1 -1
  42. package/components/ion-item-options.js +1 -1
  43. package/components/ion-item-sliding.js +1 -1
  44. package/components/ion-item.js +1 -1
  45. package/components/ion-label.js +1 -1
  46. package/components/ion-list-header.js +1 -1
  47. package/components/ion-list.js +1 -1
  48. package/components/ion-loading.js +1 -1
  49. package/components/ion-menu-button.js +1 -1
  50. package/components/ion-menu-toggle.js +1 -1
  51. package/components/ion-menu.js +1 -1
  52. package/components/ion-modal.js +1 -1
  53. package/components/ion-nav-link.js +1 -1
  54. package/components/ion-nav.js +1 -1
  55. package/components/ion-note.js +1 -1
  56. package/components/ion-picker-column-option.js +1 -1
  57. package/components/ion-picker-column.js +1 -1
  58. package/components/ion-picker.js +1 -1
  59. package/components/ion-popover.js +1 -1
  60. package/components/ion-progress-bar.js +1 -1
  61. package/components/ion-radio-group.js +1 -1
  62. package/components/ion-radio.js +1 -1
  63. package/components/ion-range.js +1 -1
  64. package/components/ion-refresher-content.js +1 -1
  65. package/components/ion-refresher.js +1 -1
  66. package/components/ion-reorder-group.js +1 -1
  67. package/components/ion-reorder.js +1 -1
  68. package/components/ion-ripple-effect.js +1 -1
  69. package/components/ion-route-redirect.js +1 -1
  70. package/components/ion-route.js +1 -1
  71. package/components/ion-router-link.js +1 -1
  72. package/components/ion-router-outlet.js +1 -1
  73. package/components/ion-router.js +1 -1
  74. package/components/ion-row.js +1 -1
  75. package/components/ion-searchbar.js +1 -1
  76. package/components/ion-segment-button.js +1 -1
  77. package/components/ion-segment-content.js +1 -1
  78. package/components/ion-segment-view.js +1 -1
  79. package/components/ion-segment.js +1 -1
  80. package/components/ion-select-modal.js +1 -1
  81. package/components/ion-select-option.js +1 -1
  82. package/components/ion-select-popover.js +1 -1
  83. package/components/ion-select.js +1 -1
  84. package/components/ion-skeleton-text.js +1 -1
  85. package/components/ion-spinner.js +1 -1
  86. package/components/ion-split-pane.js +1 -1
  87. package/components/ion-tab-bar.js +1 -1
  88. package/components/ion-tab-button.js +1 -1
  89. package/components/ion-tab.js +1 -1
  90. package/components/ion-tabs.js +1 -1
  91. package/components/ion-text.js +1 -1
  92. package/components/ion-textarea.js +1 -1
  93. package/components/ion-thumbnail.js +1 -1
  94. package/components/ion-title.js +1 -1
  95. package/components/ion-toast.js +1 -1
  96. package/components/ion-toggle.js +1 -1
  97. package/components/ion-toolbar.js +1 -1
  98. package/components/{p-CvyvLbPe.js → p-6sKRBFnK.js} +1 -1
  99. package/components/{p-V1THdfzs.js → p-B8HBLiYi.js} +1 -1
  100. package/components/{p-HthJZjZ6.js → p-BEiYs-sz.js} +1 -1
  101. package/components/p-BKeulLTJ.js +4 -0
  102. package/components/{p-D0nwlsl_.js → p-BKxLivx4.js} +1 -1
  103. package/components/{p-BMHdI-wb.js → p-BLjEwM6v.js} +1 -1
  104. package/components/p-BNnmwjuy.js +4 -0
  105. package/components/{p-DMPsc_0r.js → p-BSJriPuC.js} +1 -1
  106. package/components/p-BUVGbkSc.js +4 -0
  107. package/components/{p-KbMCbGRA.js → p-B_tZQKpS.js} +1 -1
  108. package/components/{p-DhfJAkyd.js → p-BinR4_P7.js} +1 -1
  109. package/components/{p-CqvARtmt.js → p-BrOSQhkA.js} +1 -1
  110. package/components/p-BriaEJK8.js +4 -0
  111. package/components/p-BsLM9eQu.js +4 -0
  112. package/components/p-Bu6O-veK.js +4 -0
  113. package/{dist/ionic/p-e1haAYzm.js → components/p-C7rB-0-1.js} +1 -1
  114. package/components/{p-CdrNHfZl.js → p-C9ioHZq-.js} +1 -1
  115. package/components/{p-BODcC-C0.js → p-CAQG0btC.js} +1 -1
  116. package/components/{p-BqyLLYLm.js → p-CHHkdXfP.js} +1 -1
  117. package/components/{p-Bd8hg9FK.js → p-CJgshb3W.js} +1 -1
  118. package/components/{p-jsVMT15X.js → p-CQjNc-Pz.js} +1 -1
  119. package/components/{p-Drpw2dyl.js → p-CTUMJM0R.js} +1 -1
  120. package/components/p-CVVUo4J1.js +4 -0
  121. package/components/{p-DBtFJlTi.js → p-CXy2v7GI.js} +1 -1
  122. package/components/{p-C1AxSUnp.js → p-C_NQIzjP.js} +1 -1
  123. package/components/{p-Ba9_OzSY.js → p-Canp1qah.js} +1 -1
  124. package/components/p-CcQQ8oRo.js +4 -0
  125. package/components/{p-hLu-eIbb.js → p-CiFFeRH9.js} +1 -1
  126. package/components/{p-DnGlmM4u.js → p-CiXOsJF2.js} +1 -1
  127. package/components/p-Ctw69DyZ.js +4 -0
  128. package/components/{p-C_gnmBt2.js → p-CvzE7FFp.js} +1 -1
  129. package/components/{p-r59A3wQk.js → p-CzykzqAO.js} +1 -1
  130. package/components/{p--cshUOAU.js → p-D0jSx7rE.js} +1 -1
  131. package/components/{p-YNnH1_Hs.js → p-D4NOsSCE.js} +1 -1
  132. package/components/{p-CJdQ1u7W.js → p-DGLuPe1e.js} +1 -1
  133. package/components/{p-CjPRDxby.js → p-DGUed0uX.js} +1 -1
  134. package/components/{p-DDI6VLW9.js → p-DM2jMsSO.js} +1 -1
  135. package/components/{p-yGD6MBgf.js → p-DPyjiKOq.js} +1 -1
  136. package/components/{p-7KepMw9O.js → p-DSmHJ2DH.js} +1 -1
  137. package/components/{p-DHo45oj7.js → p-DWGgvN5e.js} +1 -1
  138. package/components/{p-B4IBdPVJ.js → p-DlUdjUlf.js} +1 -1
  139. package/components/{p-ChkSQqfP.js → p-Dlr7b3_2.js} +1 -1
  140. package/components/{p-ChsJlFCQ.js → p-LH1I_Zhd.js} +1 -1
  141. package/components/{p-CQKWzUsE.js → p-PPagT42x.js} +1 -1
  142. package/components/{p-ZrYBjOcc.js → p-RJT5zTbD.js} +1 -1
  143. package/components/{p-GpqwNbxf.js → p-T2dnrBya.js} +1 -1
  144. package/components/p-WMQuK_Tj.js +4 -0
  145. package/components/{p-_y7kwBO8.js → p-eJpG4UbM.js} +1 -1
  146. package/components/{p-TLtgwTFF.js → p-fFx6WCTj.js} +1 -1
  147. package/components/p-q2WJ5Igc.js +4 -0
  148. package/components/{p-CKiqp4Vl.js → p-y7Nhe3de.js} +1 -1
  149. package/components/{p-BVNUhOOf.js → p-yjLe0sN2.js} +1 -1
  150. package/css/core.css.map +1 -1
  151. package/css/display.css.map +1 -1
  152. package/css/flex-utils.css.map +1 -1
  153. package/css/float-elements.css +1 -1
  154. package/css/float-elements.css.map +1 -1
  155. package/css/global.bundle.css.map +1 -1
  156. package/css/ionic.bundle.css +1 -1
  157. package/css/ionic.bundle.css.map +1 -1
  158. package/css/padding.css.map +1 -1
  159. package/css/structure.css.map +1 -1
  160. package/css/text-alignment.css.map +1 -1
  161. package/css/text-transformation.css.map +1 -1
  162. package/css/typography.css.map +1 -1
  163. package/css/utils.bundle.css +1 -1
  164. package/css/utils.bundle.css.map +1 -1
  165. package/dist/cjs/{animation-DcgLg_PI.js → animation-BFKyYY11.js} +2 -2
  166. package/dist/cjs/{app-globals-BoFCZq0K.js → app-globals-BLTzqkrC.js} +1 -1
  167. package/dist/cjs/{attribute-controller-BjTE2TOf.js → attribute-controller-CXIeB0Mn.js} +1 -1
  168. package/dist/cjs/{button-active-FdsfRDY_.js → button-active-CEQaiV9N.js} +2 -2
  169. package/dist/cjs/{capacitor-C6Pp4Z7A.js → capacitor-BMzmHhwe.js} +1 -1
  170. package/dist/cjs/{format-CVjpvAl1.js → format-CdRlDqPs.js} +1 -1
  171. package/dist/cjs/{framework-delegate-JbKIVMzR.js → framework-delegate-DTLbqaaO.js} +1 -1
  172. package/dist/cjs/{haptic--4QteuuM.js → haptic-CJVUv_GB.js} +1 -1
  173. package/dist/cjs/{helpers-Cqr69qxA.js → helpers-Crluoxqu.js} +1 -1
  174. package/dist/cjs/{index-CNaZ6SYM.js → index-BAM4223M.js} +2 -2
  175. package/dist/cjs/{index-BQpSekmz.js → index-BKpybYNI.js} +2 -2
  176. package/dist/cjs/{index-B4ONUQRp.js → index-BSD7toMO.js} +1 -1
  177. package/dist/cjs/{index-BhWiDK25.js → index-CElfU-dK.js} +5 -6
  178. package/dist/cjs/{index-DCfr5hz-.js → index-CgXTRA_-.js} +4 -16
  179. package/dist/cjs/{index-BiQyIvoc.js → index-SAR1xwtW.js} +27 -40
  180. package/dist/cjs/index.cjs.js +11 -11
  181. package/dist/cjs/{input-shims-2AsXPZ5m.js → input-shims-CHghGZe-.js} +5 -5
  182. package/dist/cjs/{input.utils-Becpo0ax.js → input.utils-BBZr0wjw.js} +1 -1
  183. package/dist/cjs/ion-accordion_2.cjs.entry.js +3 -3
  184. package/dist/cjs/ion-action-sheet.cjs.entry.js +11 -11
  185. package/dist/cjs/ion-alert.cjs.entry.js +11 -11
  186. package/dist/cjs/ion-app_8.cjs.entry.js +18 -46
  187. package/dist/cjs/ion-avatar_3.cjs.entry.js +2 -2
  188. package/dist/cjs/ion-back-button.cjs.entry.js +3 -3
  189. package/dist/cjs/ion-backdrop.cjs.entry.js +2 -2
  190. package/dist/cjs/ion-breadcrumb_2.cjs.entry.js +3 -3
  191. package/dist/cjs/ion-button_2.cjs.entry.js +4 -4
  192. package/dist/cjs/ion-card_5.cjs.entry.js +4 -4
  193. package/dist/cjs/ion-checkbox.cjs.entry.js +4 -4
  194. package/dist/cjs/ion-chip.cjs.entry.js +2 -2
  195. package/dist/cjs/ion-col_3.cjs.entry.js +2 -2
  196. package/dist/cjs/ion-datetime-button.cjs.entry.js +4 -4
  197. package/dist/cjs/ion-datetime.cjs.entry.js +6 -6
  198. package/dist/cjs/ion-fab_3.cjs.entry.js +3 -3
  199. package/dist/cjs/ion-img.cjs.entry.js +3 -3
  200. package/dist/cjs/ion-infinite-scroll_2.cjs.entry.js +5 -5
  201. package/dist/cjs/ion-input-otp.cjs.entry.js +8 -33
  202. package/dist/cjs/ion-input-password-toggle.cjs.entry.js +2 -2
  203. package/dist/cjs/ion-input.cjs.entry.js +5 -5
  204. package/dist/cjs/ion-item-option_3.cjs.entry.js +4 -4
  205. package/dist/cjs/ion-item_8.cjs.entry.js +4 -4
  206. package/dist/cjs/ion-loading.cjs.entry.js +7 -7
  207. package/dist/cjs/ion-menu_3.cjs.entry.js +9 -10
  208. package/dist/cjs/ion-modal.cjs.entry.js +11 -11
  209. package/dist/cjs/ion-nav_2.cjs.entry.js +7 -29
  210. package/dist/cjs/ion-picker-column-option.cjs.entry.js +3 -3
  211. package/dist/cjs/ion-picker-column.cjs.entry.js +5 -5
  212. package/dist/cjs/ion-picker.cjs.entry.js +2 -2
  213. package/dist/cjs/ion-popover.cjs.entry.js +7 -7
  214. package/dist/cjs/ion-progress-bar.cjs.entry.js +3 -3
  215. package/dist/cjs/ion-radio_2.cjs.entry.js +4 -4
  216. package/dist/cjs/ion-range.cjs.entry.js +4 -4
  217. package/dist/cjs/ion-refresher_2.cjs.entry.js +8 -8
  218. package/dist/cjs/ion-reorder_2.cjs.entry.js +6 -6
  219. package/dist/cjs/ion-ripple-effect.cjs.entry.js +2 -2
  220. package/dist/cjs/ion-route_4.cjs.entry.js +125 -20
  221. package/dist/cjs/ion-searchbar.cjs.entry.js +3 -3
  222. package/dist/cjs/ion-segment-content.cjs.entry.js +1 -1
  223. package/dist/cjs/ion-segment-view.cjs.entry.js +1 -1
  224. package/dist/cjs/ion-segment_2.cjs.entry.js +3 -3
  225. package/dist/cjs/ion-select-modal.cjs.entry.js +7 -7
  226. package/dist/cjs/ion-select_3.cjs.entry.js +8 -8
  227. package/dist/cjs/ion-spinner.cjs.entry.js +2 -2
  228. package/dist/cjs/ion-split-pane.cjs.entry.js +2 -2
  229. package/dist/cjs/ion-tab-bar_2.cjs.entry.js +6 -6
  230. package/dist/cjs/ion-tab_2.cjs.entry.js +3 -3
  231. package/dist/cjs/ion-text.cjs.entry.js +2 -2
  232. package/dist/cjs/ion-textarea.cjs.entry.js +5 -5
  233. package/dist/cjs/ion-toast.cjs.entry.js +7 -7
  234. package/dist/cjs/ion-toggle.cjs.entry.js +6 -6
  235. package/dist/cjs/{ionic-global-48ceLiJ6.js → ionic-global-C1h8Yi_K.js} +1 -1
  236. package/dist/cjs/ionic.cjs.js +5 -5
  237. package/dist/cjs/{ios.transition-Ca6XODo9.js → ios.transition-YFSxiyP_.js} +4 -4
  238. package/dist/cjs/{item-multiple-inputs-C-hz7xrh.js → item-multiple-inputs-h2PyAFzG.js} +1 -1
  239. package/dist/cjs/{keyboard-BlHp4a_c.js → keyboard-C-C7xMKk.js} +1 -1
  240. package/dist/cjs/{keyboard-c2_I35b-.js → keyboard-Cv-LNReK.js} +4 -4
  241. package/dist/cjs/{keyboard-controller-DHS0BgXp.js → keyboard-controller-CLcFxSnb.js} +2 -2
  242. package/dist/cjs/loader.cjs.js +4 -4
  243. package/dist/cjs/{md.transition-D8SfNYEp.js → md.transition-Cm8yg0UK.js} +4 -4
  244. package/dist/cjs/{overlays-CLld3axA.js → overlays-C68wNDWY.js} +20 -79
  245. package/dist/cjs/{select-option-render-CzyhrkOu.js → select-option-render-C-Yh9yZG.js} +2 -2
  246. package/dist/cjs/{slot-mutation-controller-ClDxh3EK.js → slot-mutation-controller-zixZ5LyH.js} +1 -1
  247. package/dist/cjs/{status-tap-CDA0Y3Ad.js → status-tap-C3frTJ4c.js} +3 -3
  248. package/dist/cjs/{swipe-back-Idb4gqUk.js → swipe-back-BigumsQ1.js} +2 -2
  249. package/dist/collection/collection-manifest.json +1 -1
  250. package/dist/collection/components/input-otp/input-otp.js +3 -29
  251. package/dist/collection/components/menu/menu.js +3 -4
  252. package/dist/collection/components/nav/nav.js +2 -24
  253. package/dist/collection/components/route/route.js +9 -1
  254. package/dist/collection/components/route-redirect/route-redirect.js +1 -1
  255. package/dist/collection/components/router/utils/constants.js +2 -0
  256. package/dist/collection/components/router/utils/matching.js +97 -14
  257. package/dist/collection/components/router/utils/path.js +17 -3
  258. package/dist/collection/components/router-outlet/router-outlet.js +3 -31
  259. package/dist/collection/utils/hardware-back-button.js +12 -41
  260. package/dist/collection/utils/menu-controller/index.js +1 -2
  261. package/dist/collection/utils/overlays.js +4 -30
  262. package/dist/collection/utils/transition/index.js +0 -11
  263. package/dist/docs.json +4 -4
  264. package/dist/esm/{animation-DmtJpz89.js → animation-CFd8Olt3.js} +2 -2
  265. package/dist/esm/{app-globals-CNfpAPW6.js → app-globals-7GHLBkwd.js} +1 -1
  266. package/dist/esm/{attribute-controller-DPMIcbef.js → attribute-controller-Cn665x42.js} +1 -1
  267. package/dist/esm/{button-active-DVk40Sjl.js → button-active-DMuYeDQN.js} +2 -2
  268. package/dist/esm/{capacitor-CHJaJ9aX.js → capacitor-CoEgIpR9.js} +1 -1
  269. package/dist/esm/{format-Ck1cw5z7.js → format-C9zPmwKU.js} +1 -1
  270. package/dist/esm/{framework-delegate-CDjM1vRH.js → framework-delegate-DeT5pmPB.js} +1 -1
  271. package/dist/esm/{haptic-WXfMCob9.js → haptic-Dxm7ZmT5.js} +1 -1
  272. package/dist/esm/{helpers-BJqKF1pr.js → helpers-B54ynME_.js} +1 -1
  273. package/dist/esm/{index-TkLga3ma.js → index--21qeSt0.js} +2 -2
  274. package/dist/esm/{index-z9vdZN7I.js → index-B8iieOdw.js} +5 -16
  275. package/dist/esm/{index-DIouXecD.js → index-B9jhwvmO.js} +5 -6
  276. package/dist/esm/{index-CK8uF0iB.js → index-D4ZMZz_3.js} +1 -1
  277. package/dist/esm/{index-BpRUsN_W.js → index-D9OR05yj.js} +27 -40
  278. package/dist/esm/{index-Clv8QC5L.js → index-D_xZtbw6.js} +2 -2
  279. package/dist/esm/index.js +11 -11
  280. package/dist/esm/{input-shims-C1iYF5JK.js → input-shims-MCrhq67U.js} +5 -5
  281. package/dist/esm/{input.utils-DZY_K8Po.js → input.utils-B-IIWrwT.js} +1 -1
  282. package/dist/esm/ion-accordion_2.entry.js +3 -3
  283. package/dist/esm/ion-action-sheet.entry.js +11 -11
  284. package/dist/esm/ion-alert.entry.js +11 -11
  285. package/dist/esm/ion-app_8.entry.js +18 -46
  286. package/dist/esm/ion-avatar_3.entry.js +2 -2
  287. package/dist/esm/ion-back-button.entry.js +3 -3
  288. package/dist/esm/ion-backdrop.entry.js +2 -2
  289. package/dist/esm/ion-breadcrumb_2.entry.js +3 -3
  290. package/dist/esm/ion-button_2.entry.js +4 -4
  291. package/dist/esm/ion-card_5.entry.js +4 -4
  292. package/dist/esm/ion-checkbox.entry.js +4 -4
  293. package/dist/esm/ion-chip.entry.js +2 -2
  294. package/dist/esm/ion-col_3.entry.js +2 -2
  295. package/dist/esm/ion-datetime-button.entry.js +4 -4
  296. package/dist/esm/ion-datetime.entry.js +6 -6
  297. package/dist/esm/ion-fab_3.entry.js +3 -3
  298. package/dist/esm/ion-img.entry.js +3 -3
  299. package/dist/esm/ion-infinite-scroll_2.entry.js +5 -5
  300. package/dist/esm/ion-input-otp.entry.js +8 -33
  301. package/dist/esm/ion-input-password-toggle.entry.js +2 -2
  302. package/dist/esm/ion-input.entry.js +5 -5
  303. package/dist/esm/ion-item-option_3.entry.js +4 -4
  304. package/dist/esm/ion-item_8.entry.js +4 -4
  305. package/dist/esm/ion-loading.entry.js +7 -7
  306. package/dist/esm/ion-menu_3.entry.js +9 -10
  307. package/dist/esm/ion-modal.entry.js +11 -11
  308. package/dist/esm/ion-nav_2.entry.js +7 -29
  309. package/dist/esm/ion-picker-column-option.entry.js +3 -3
  310. package/dist/esm/ion-picker-column.entry.js +5 -5
  311. package/dist/esm/ion-picker.entry.js +2 -2
  312. package/dist/esm/ion-popover.entry.js +7 -7
  313. package/dist/esm/ion-progress-bar.entry.js +3 -3
  314. package/dist/esm/ion-radio_2.entry.js +4 -4
  315. package/dist/esm/ion-range.entry.js +4 -4
  316. package/dist/esm/ion-refresher_2.entry.js +8 -8
  317. package/dist/esm/ion-reorder_2.entry.js +6 -6
  318. package/dist/esm/ion-ripple-effect.entry.js +2 -2
  319. package/dist/esm/ion-route_4.entry.js +125 -20
  320. package/dist/esm/ion-searchbar.entry.js +3 -3
  321. package/dist/esm/ion-segment-content.entry.js +1 -1
  322. package/dist/esm/ion-segment-view.entry.js +1 -1
  323. package/dist/esm/ion-segment_2.entry.js +3 -3
  324. package/dist/esm/ion-select-modal.entry.js +7 -7
  325. package/dist/esm/ion-select_3.entry.js +8 -8
  326. package/dist/esm/ion-spinner.entry.js +2 -2
  327. package/dist/esm/ion-split-pane.entry.js +2 -2
  328. package/dist/esm/ion-tab-bar_2.entry.js +6 -6
  329. package/dist/esm/ion-tab_2.entry.js +3 -3
  330. package/dist/esm/ion-text.entry.js +2 -2
  331. package/dist/esm/ion-textarea.entry.js +5 -5
  332. package/dist/esm/ion-toast.entry.js +7 -7
  333. package/dist/esm/ion-toggle.entry.js +6 -6
  334. package/dist/esm/{ionic-global-Cep6oYzK.js → ionic-global-B-G43ddm.js} +1 -1
  335. package/dist/esm/ionic.js +6 -6
  336. package/dist/esm/{ios.transition-BkUGiDUz.js → ios.transition-CRfGj4Mo.js} +4 -4
  337. package/dist/esm/{item-multiple-inputs-Bd2LO7qK.js → item-multiple-inputs-BSD9wGHO.js} +1 -1
  338. package/dist/esm/{keyboard-B4Y-Gph8.js → keyboard-DDw62P0D.js} +4 -4
  339. package/dist/esm/{keyboard-controller-B2NoF7bV.js → keyboard-controller-Dzjet5wD.js} +2 -2
  340. package/dist/esm/{keyboard-Cmqp5iZD.js → keyboard-ly3M0GO7.js} +1 -1
  341. package/dist/esm/loader.js +5 -5
  342. package/dist/esm/{md.transition-B6hlrWjR.js → md.transition-wqThNy_C.js} +4 -4
  343. package/dist/esm/{overlays-DmDY-El7.js → overlays-BQnV0HAU.js} +21 -78
  344. package/dist/esm/{select-option-render-BSDT9oSA.js → select-option-render-CGxPejmz.js} +2 -2
  345. package/dist/esm/{slot-mutation-controller-hAS2uJ7c.js → slot-mutation-controller-C3s4-_YN.js} +1 -1
  346. package/dist/esm/{status-tap-VGRBYwiC.js → status-tap-DRx9wSD_.js} +3 -3
  347. package/dist/esm/{swipe-back-DV3UpWzz.js → swipe-back-Ch3UU_US.js} +2 -2
  348. package/dist/html.html-data.json +2 -2
  349. package/dist/ionic/index.esm.js +1 -1
  350. package/dist/ionic/ionic.esm.js +1 -1
  351. package/dist/ionic/{p-7db20410.entry.js → p-0517aec4.entry.js} +1 -1
  352. package/dist/ionic/{p-9ffccbf1.entry.js → p-083b1119.entry.js} +1 -1
  353. package/dist/ionic/{p-d0e374f8.entry.js → p-0ab133d6.entry.js} +1 -1
  354. package/dist/ionic/{p-4d785062.entry.js → p-1213b719.entry.js} +1 -1
  355. package/dist/ionic/{p-0c32c626.entry.js → p-150f350e.entry.js} +1 -1
  356. package/dist/ionic/{p-c293f854.entry.js → p-20d1ac29.entry.js} +1 -1
  357. package/dist/ionic/{p-d72accc4.entry.js → p-24b0a961.entry.js} +1 -1
  358. package/dist/ionic/{p-d2406889.entry.js → p-28f506ce.entry.js} +1 -1
  359. package/dist/ionic/{p-930c3538.entry.js → p-2e6e933d.entry.js} +1 -1
  360. package/dist/ionic/{p-0f97175e.entry.js → p-30dcf43b.entry.js} +1 -1
  361. package/dist/ionic/{p-00cd107d.entry.js → p-378341d1.entry.js} +1 -1
  362. package/dist/ionic/{p-6c7b5930.entry.js → p-37f46670.entry.js} +1 -1
  363. package/dist/ionic/{p-b9ed3a52.entry.js → p-3a5faaa8.entry.js} +1 -1
  364. package/dist/ionic/p-3bd7e5df.entry.js +4 -0
  365. package/dist/ionic/{p-4e4e5919.entry.js → p-3c4b0ba7.entry.js} +1 -1
  366. package/dist/ionic/{p-4bd80334.entry.js → p-42b2a992.entry.js} +1 -1
  367. package/dist/ionic/p-52449f1f.entry.js +4 -0
  368. package/dist/ionic/p-52dc3309.entry.js +4 -0
  369. package/dist/ionic/{p-64ac3864.entry.js → p-58f914ee.entry.js} +1 -1
  370. package/dist/ionic/{p-b3aadfe8.entry.js → p-5b9666be.entry.js} +1 -1
  371. package/dist/ionic/{p-a4389f13.entry.js → p-5c19330c.entry.js} +1 -1
  372. package/dist/ionic/{p-bfdbe24b.entry.js → p-61b304c8.entry.js} +1 -1
  373. package/dist/ionic/{p-0b09c60e.entry.js → p-624f2fa8.entry.js} +1 -1
  374. package/dist/ionic/{p-d9a3dfd1.entry.js → p-636349e2.entry.js} +1 -1
  375. package/dist/ionic/{p-4f25b926.entry.js → p-6865f0e1.entry.js} +1 -1
  376. package/dist/ionic/{p-27d96a9b.entry.js → p-7441ed2b.entry.js} +1 -1
  377. package/dist/ionic/{p-91f3cd8b.entry.js → p-76309bab.entry.js} +1 -1
  378. package/dist/ionic/p-83448626.entry.js +4 -0
  379. package/dist/ionic/{p-7e9c2a97.entry.js → p-834afcf7.entry.js} +1 -1
  380. package/dist/ionic/{p-362dcd86.entry.js → p-93cd738b.entry.js} +1 -1
  381. package/dist/ionic/{p-eb989dc9.entry.js → p-9b78fedf.entry.js} +1 -1
  382. package/dist/ionic/{p-5bb24bce.entry.js → p-9dd9788c.entry.js} +1 -1
  383. package/dist/ionic/{p-nCAPr1Ah.js → p-B4ELlbJE.js} +1 -1
  384. package/dist/ionic/p-B4wzg4z4.js +4 -0
  385. package/dist/ionic/{p-Co7eql8D.js → p-B4xjg_Qu.js} +1 -1
  386. package/dist/ionic/{p-DPNVo1nr.js → p-BCgqWm-V.js} +1 -1
  387. package/dist/ionic/p-BChRVdVv.js +4 -0
  388. package/dist/ionic/{p-BO10QT9r.js → p-BUB5OrpU.js} +1 -1
  389. package/dist/ionic/{p-BZTgGzGK.js → p-BVEsh7-M.js} +1 -1
  390. package/dist/ionic/p-Ba6ZV-qU.js +4 -0
  391. package/dist/ionic/{p-DxftXYZp.js → p-BhMQahM6.js} +1 -1
  392. package/dist/ionic/{p-D926OmIX.js → p-BtHAx8im.js} +1 -1
  393. package/{components/p-Dbi3KqKm.js → dist/ionic/p-Bv-6401R.js} +1 -1
  394. package/dist/ionic/{p-DfvWlTdB.js → p-CCik51Nv.js} +1 -1
  395. package/dist/ionic/p-CTmJSZcs.js +4 -0
  396. package/dist/ionic/{p-CngfKMRU.js → p-CTrwMl44.js} +1 -1
  397. package/dist/ionic/p-CVwXN07G.js +4 -0
  398. package/dist/ionic/p-CgQdInM0.js +4 -0
  399. package/dist/ionic/{p-SEecsUh7.js → p-CrAPHbJ3.js} +1 -1
  400. package/dist/ionic/{p-Bx5x5GJV.js → p-CsWrz1c2.js} +1 -1
  401. package/dist/ionic/p-D5akOqD0.js +4 -0
  402. package/dist/ionic/p-D9OR05yj.js +6 -0
  403. package/dist/ionic/p-DHf9V6zI.js +4 -0
  404. package/dist/ionic/{p-CXs4J83x.js → p-DNxEB9-T.js} +1 -1
  405. package/dist/ionic/p-DZUqAr_6.js +4 -0
  406. package/dist/ionic/{p-BY4FwwBp.js → p-DxvRP6ld.js} +1 -1
  407. package/dist/ionic/p-Dzew6Qv7.js +4 -0
  408. package/dist/ionic/p-PkaVMJga.js +4 -0
  409. package/dist/ionic/{p-c250b6b0.entry.js → p-b0a3dd1a.entry.js} +1 -1
  410. package/dist/ionic/{p-ec259ac5.entry.js → p-b1164028.entry.js} +1 -1
  411. package/dist/ionic/{p-230f510c.entry.js → p-b710b4b8.entry.js} +1 -1
  412. package/dist/ionic/{p-8c85e250.entry.js → p-b9659d21.entry.js} +1 -1
  413. package/dist/ionic/p-ba7bd621.entry.js +4 -0
  414. package/dist/ionic/{p-82abf431.entry.js → p-daaecea3.entry.js} +1 -1
  415. package/dist/ionic/{p-e7ab4def.entry.js → p-e05073f6.entry.js} +1 -1
  416. package/dist/ionic/{p-8d651adb.entry.js → p-e137f724.entry.js} +1 -1
  417. package/dist/ionic/{p-107a81a6.entry.js → p-e1969fd1.entry.js} +1 -1
  418. package/dist/ionic/{p-77252596.entry.js → p-e338693a.entry.js} +1 -1
  419. package/dist/ionic/{p-8b79061e.entry.js → p-e4c3f17f.entry.js} +1 -1
  420. package/dist/ionic/{p-01b7e3f2.entry.js → p-e7414c33.entry.js} +1 -1
  421. package/dist/ionic/{p-8db08782.entry.js → p-eb762f80.entry.js} +1 -1
  422. package/dist/ionic/p-edcb63e5.entry.js +4 -0
  423. package/dist/ionic/{p-c97e4c00.entry.js → p-efa00ce5.entry.js} +1 -1
  424. package/dist/ionic/{p-60780b88.entry.js → p-f19e50f8.entry.js} +1 -1
  425. package/dist/ionic/{p-8d2ccf0c.entry.js → p-f20b6a9b.entry.js} +1 -1
  426. package/dist/ionic/{p-f2116a54.entry.js → p-f9057f70.entry.js} +1 -1
  427. package/dist/ionic/{p-0a789930.entry.js → p-f99cf5aa.entry.js} +1 -1
  428. package/dist/ionic/{p-62c87f3d.entry.js → p-fee863dc.entry.js} +1 -1
  429. package/dist/ionic/{p-CgcGX08t.js → p-kKvGoaEe.js} +1 -1
  430. package/dist/ionic/{p-B8IuTu_r.js → p-tXpzvta8.js} +1 -1
  431. package/dist/ionic/p-vPo3vRFc.js +4 -0
  432. package/dist/types/components/input-otp/input-otp.d.ts +0 -7
  433. package/dist/types/components/nav/nav.d.ts +0 -1
  434. package/dist/types/components/route/route.d.ts +8 -0
  435. package/dist/types/components/route-redirect/route-redirect.d.ts +3 -1
  436. package/dist/types/components/router/utils/constants.d.ts +2 -0
  437. package/dist/types/components/router/utils/matching.d.ts +10 -0
  438. package/dist/types/components/router/utils/path.d.ts +5 -1
  439. package/dist/types/components/router-outlet/router-outlet.d.ts +0 -1
  440. package/dist/types/components.d.ts +4 -4
  441. package/dist/types/utils/config.d.ts +1 -4
  442. package/dist/types/utils/hardware-back-button.d.ts +0 -11
  443. package/dist/types/utils/overlays.d.ts +2 -5
  444. package/dist/types/utils/transition/index.d.ts +0 -6
  445. package/hydrate/index.js +319 -524
  446. package/hydrate/index.mjs +319 -524
  447. package/package.json +1 -1
  448. package/components/p-B02CcbPD.js +0 -4
  449. package/components/p-CohRJRIu.js +0 -4
  450. package/components/p-Ct2aBEue.js +0 -4
  451. package/components/p-CwEis84J.js +0 -4
  452. package/components/p-CxEV3Vwy.js +0 -4
  453. package/components/p-Cyajikho.js +0 -4
  454. package/components/p-DD92Fw3n.js +0 -4
  455. package/components/p-DfDIY2oP.js +0 -4
  456. package/components/p-IQN1T5zw.js +0 -4
  457. package/components/p-ODGeXc3M.js +0 -4
  458. package/components/p-R4UxBukQ.js +0 -4
  459. package/dist/ionic/p-52a16f94.entry.js +0 -4
  460. package/dist/ionic/p-539d6c8e.entry.js +0 -4
  461. package/dist/ionic/p-7ce9c6f8.entry.js +0 -4
  462. package/dist/ionic/p-7l6ENjIV.js +0 -4
  463. package/dist/ionic/p-BNXIurCt.js +0 -4
  464. package/dist/ionic/p-BOLqP2-V.js +0 -4
  465. package/dist/ionic/p-BdHBcCZF.js +0 -4
  466. package/dist/ionic/p-BexAj0yw.js +0 -4
  467. package/dist/ionic/p-BpRUsN_W.js +0 -6
  468. package/dist/ionic/p-BuLlVedw.js +0 -4
  469. package/dist/ionic/p-C1WYZOZj.js +0 -4
  470. package/dist/ionic/p-C2LaBx3E.js +0 -4
  471. package/dist/ionic/p-D13gXhdC.js +0 -4
  472. package/dist/ionic/p-DXXGkPA8.js +0 -4
  473. package/dist/ionic/p-Dk4Mdaru.js +0 -4
  474. package/dist/ionic/p-DriE1ZAo.js +0 -4
  475. package/dist/ionic/p-af11d3c6.entry.js +0 -4
  476. package/dist/ionic/p-b5bcbbc1.entry.js +0 -4
  477. package/dist/ionic/p-c83dbc12.entry.js +0 -4
@@ -1,6 +1,8 @@
1
1
  /*!
2
2
  * (C) Ionic http://ionicframework.com - MIT License
3
3
  */
4
+ import { WILDCARD_PARAM } from "./constants";
5
+ import { chainToSegments, endsWithWildcard, withoutWildcard } from "./path";
4
6
  /**
5
7
  * Returns whether the given redirect matches the given path segments.
6
8
  *
@@ -41,6 +43,10 @@ export const matchesIDs = (ids, chain) => {
41
43
  if (routeId.id.toLowerCase() !== routeChain.id) {
42
44
  break;
43
45
  }
46
+ // Weight a wildcard route when the outlet reports its `pathMatch`
47
+ if (routeId.params?.[WILDCARD_PARAM] !== undefined && endsWithWildcard(routeChain.segments)) {
48
+ score++;
49
+ }
44
50
  if (routeId.params) {
45
51
  const routeIdParams = Object.keys(routeId.params);
46
52
  // Only compare routes with the chain that have the same number of parameters.
@@ -96,21 +102,28 @@ export const matchesSegments = (segments, chain) => {
96
102
  matchesDefault = true;
97
103
  }
98
104
  else {
99
- for (const segment of chainSegments) {
105
+ const params = {};
106
+ for (const segment of withoutWildcard(chainSegments)) {
100
107
  const data = inputSegments.next();
101
108
  // data param
102
109
  if (segment[0] === ':') {
103
110
  if (data === '') {
104
111
  return null;
105
112
  }
106
- allparams = allparams || [];
107
- const params = allparams[i] || (allparams[i] = {});
108
113
  params[segment.slice(1)] = data;
109
114
  }
110
115
  else if (data !== segment) {
111
116
  return null;
112
117
  }
113
118
  }
119
+ // A trailing `*` on a parent route has no effect. Its children match the rest of the path.
120
+ if (i === chain.length - 1 && endsWithWildcard(chainSegments)) {
121
+ params[WILDCARD_PARAM] = inputSegments.rest().join('/');
122
+ }
123
+ if (Object.keys(params).length > 0) {
124
+ allparams = allparams || [];
125
+ allparams[i] = params;
126
+ }
114
127
  matchesDefault = false;
115
128
  }
116
129
  }
@@ -142,25 +155,38 @@ export const mergeParams = (a, b) => {
142
155
  * Returns the best match or null when no match is found.
143
156
  * When a chain is returned the parameters are updated from the RouteIDs.
144
157
  * That is they contain both the componentProps of the <ion-route> and the parameter segment.
158
+ *
159
+ * When a wildcard route ties with other routes, a route without a wildcard that can build a url wins,
160
+ * then the wildcard route. Otherwise the first route declared wins a tie.
145
161
  */
146
162
  export const findChainForIDs = (ids, chains) => {
147
- let match = null;
148
163
  let maxMatches = 0;
164
+ let tied = [];
149
165
  for (const chain of chains) {
150
166
  const score = matchesIDs(ids, chain);
151
167
  if (score > maxMatches) {
152
- match = chain;
153
168
  maxMatches = score;
169
+ tied = [chain];
170
+ }
171
+ else if (score > 0 && score === maxMatches) {
172
+ tied.push(chain);
154
173
  }
155
174
  }
156
- if (match) {
157
- return match.map((route, i) => ({
158
- id: route.id,
159
- segments: route.segments,
160
- params: mergeParams(route.params, ids[i]?.params),
161
- }));
175
+ const matches = tied.map((chain) => chain.map((route, i) => ({
176
+ id: route.id,
177
+ segments: route.segments,
178
+ params: mergeParams(route.params, ids[i]?.params),
179
+ })));
180
+ if (!matches.some(chainEndsWithWildcard)) {
181
+ return matches.length > 0 ? matches[0] : null;
182
+ }
183
+ return matches.reduce((best, chain) => (tieRank(chain) > tieRank(best) ? chain : best));
184
+ };
185
+ const tieRank = (chain) => {
186
+ if (chainEndsWithWildcard(chain)) {
187
+ return 1;
162
188
  }
163
- return null;
189
+ return chainToSegments(chain) !== null ? 2 : 0;
164
190
  };
165
191
  /**
166
192
  * Finds the best match for the segments in the chains.
@@ -168,10 +194,17 @@ export const findChainForIDs = (ids, chains) => {
168
194
  * Returns the best match or null when no match is found.
169
195
  * When a chain is returned the parameters are updated from the segments.
170
196
  * That is they contain both the componentProps of the <ion-route> and the parameter segments.
197
+ *
198
+ * When wildcard routes match, the one with the most fixed segments wins if it has more fixed segments than every
199
+ * route that matched the whole path. Routes that only matched by ignoring trailing segments don't count.
171
200
  */
172
201
  export const findChainForSegments = (segments, chains) => {
173
202
  let match = null;
174
203
  let bestScore = 0;
204
+ let fullMatch = null;
205
+ let bestFullScore = 0;
206
+ let maxFullFixed = -1;
207
+ let wildcard = null;
175
208
  for (const chain of chains) {
176
209
  const matchedChain = matchesSegments(segments, chain);
177
210
  if (matchedChain !== null) {
@@ -180,9 +213,51 @@ export const findChainForSegments = (segments, chains) => {
180
213
  bestScore = score;
181
214
  match = matchedChain;
182
215
  }
216
+ if (chainEndsWithWildcard(matchedChain)) {
217
+ if (wildcard === null || winsWildcard(matchedChain, wildcard)) {
218
+ wildcard = matchedChain;
219
+ }
220
+ }
221
+ else if (!isPartialMatch(segments, matchedChain)) {
222
+ if (score > bestFullScore) {
223
+ bestFullScore = score;
224
+ fullMatch = matchedChain;
225
+ }
226
+ maxFullFixed = Math.max(maxFullFixed, countFixedSegments(matchedChain));
227
+ }
183
228
  }
184
229
  }
185
- return match;
230
+ // Without a wildcard to match the rest of the path, routes can still ignore trailing segments.
231
+ if (wildcard === null) {
232
+ return match;
233
+ }
234
+ // Compare fixed segments rather than priority, since nesting under default routes raises the priority
235
+ return countFixedSegments(wildcard) > maxFullFixed ? wildcard : fullMatch;
236
+ };
237
+ /** Returns whether the chain matched the path segments only by ignoring some trailing segments. */
238
+ const isPartialMatch = (segments, chain) => {
239
+ const matched = chainToSegments(chain);
240
+ return matched !== null && matched.length < segments.filter((s) => s !== '').length;
241
+ };
242
+ const chainEndsWithWildcard = (chain) => {
243
+ return endsWithWildcard(chain[chain.length - 1].segments);
244
+ };
245
+ /** Returns whether the wildcard chain beats `best` by fixed segments, then by priority. */
246
+ const winsWildcard = (chain, best) => {
247
+ const chainFixed = countFixedSegments(chain);
248
+ const bestFixed = countFixedSegments(best);
249
+ return chainFixed > bestFixed || (chainFixed === bestFixed && computePriority(chain) > computePriority(best));
250
+ };
251
+ const countFixedSegments = (chain) => {
252
+ let count = 0;
253
+ for (const route of chain) {
254
+ for (const segment of withoutWildcard(route.segments)) {
255
+ if (segment !== '' && segment[0] !== ':') {
256
+ count++;
257
+ }
258
+ }
259
+ }
260
+ return count;
186
261
  };
187
262
  /**
188
263
  * Computes the priority of a chain.
@@ -194,12 +269,14 @@ export const findChainForSegments = (segments, chains) => {
194
269
  * - /path/to/page
195
270
  *
196
271
  * The second one will be given a higher priority because "page" is a fixed segment (vs ":where", a parameter segment).
272
+ *
273
+ * A trailing wildcard is not counted.
197
274
  */
198
275
  export const computePriority = (chain) => {
199
276
  let score = 1;
200
277
  let level = 1;
201
278
  for (const route of chain) {
202
- for (const segment of route.segments) {
279
+ for (const segment of withoutWildcard(route.segments)) {
203
280
  if (segment[0] === ':') {
204
281
  score += Math.pow(1, level);
205
282
  }
@@ -221,4 +298,10 @@ export class RouterSegments {
221
298
  }
222
299
  return '';
223
300
  }
301
+ /** Consumes and returns the remaining non empty segments. */
302
+ rest() {
303
+ const rest = this.segments.filter((s) => s !== '');
304
+ this.segments = [];
305
+ return rest;
306
+ }
224
307
  }
@@ -1,7 +1,7 @@
1
1
  /*!
2
2
  * (C) Ionic http://ionicframework.com - MIT License
3
3
  */
4
- import { ROUTER_INTENT_FORWARD } from "./constants";
4
+ import { ROUTER_INTENT_FORWARD, WILDCARD_PARAM } from "./constants";
5
5
  /** Join the non empty segments with "/". */
6
6
  export const generatePath = (segments) => {
7
7
  const path = segments.filter((s) => s.length > 0).join('/');
@@ -34,12 +34,13 @@ export const writeSegments = (history, root, useHash, segments, direction, state
34
34
  *
35
35
  * Notes:
36
36
  * - parameter segments of the form :param are replaced with their value,
37
- * - null is returned when a value is missing for any parameter segment.
37
+ * - null is returned when a value is missing for any parameter segment,
38
+ * - a trailing wildcard is replaced with the path it matched.
38
39
  */
39
40
  export const chainToSegments = (chain) => {
40
41
  const segments = [];
41
42
  for (const route of chain) {
42
- for (const segment of route.segments) {
43
+ for (const segment of withoutWildcard(route.segments)) {
43
44
  if (segment[0] === ':') {
44
45
  const param = route.params && route.params[segment.slice(1)];
45
46
  if (!param) {
@@ -51,9 +52,22 @@ export const chainToSegments = (chain) => {
51
52
  segments.push(segment);
52
53
  }
53
54
  }
55
+ segments.push(...wildcardSegments(route));
54
56
  }
55
57
  return segments;
56
58
  };
59
+ /** Only a `*` in the last segment of a route url is a wildcard. Elsewhere it's matched literally. */
60
+ export const endsWithWildcard = (segments) => {
61
+ return segments[segments.length - 1] === '*';
62
+ };
63
+ /** Returns the path segments matched by the trailing wildcard of the route. */
64
+ const wildcardSegments = (route) => {
65
+ const pathMatch = endsWithWildcard(route.segments) ? route.params?.[WILDCARD_PARAM] : undefined;
66
+ return pathMatch ? pathMatch.split('/').filter((s) => s.length > 0) : [];
67
+ };
68
+ export const withoutWildcard = (segments) => {
69
+ return endsWithWildcard(segments) ? segments.slice(0, -1) : segments;
70
+ };
57
71
  /**
58
72
  * Removes the prefix segments from the path segments.
59
73
  *
@@ -7,7 +7,7 @@ import { attachComponent, detachComponent } from "../../utils/framework-delegate
7
7
  import { shallowEqualStringMap, hasLazyBuild } from "../../utils/helpers";
8
8
  import { createLockController } from "../../utils/lock-controller";
9
9
  import { printIonError } from "../../utils/logging/index";
10
- import { blockSwipeClicks, transition } from "../../utils/transition/index";
10
+ import { transition } from "../../utils/transition/index";
11
11
  import { config } from "../../global/config";
12
12
  import { getIonMode } from "../../global/ionic-global";
13
13
  export class RouterOutlet {
@@ -32,14 +32,6 @@ export class RouterOutlet {
32
32
  async connectedCallback() {
33
33
  const onStart = () => {
34
34
  this.gestureOrAnimationInProgress = true;
35
- /**
36
- * Without animations there's nothing for the swipe to drive, so
37
- * wait until the gesture ends to decide whether to go back.
38
- */
39
- if (!(this.animated && config.getBoolean('animated', true))) {
40
- this.unblockSwipeClicks = blockSwipeClicks(this.el);
41
- return;
42
- }
43
35
  if (this.swipeHandler) {
44
36
  this.swipeHandler.onStart();
45
37
  }
@@ -72,21 +64,7 @@ export class RouterOutlet {
72
64
  this.ani.progressEnd(shouldComplete ? 1 : 0, newStepValue, dur);
73
65
  }
74
66
  else {
75
- const { swipeHandler, unblockSwipeClicks: unblock } = this;
76
- this.unblockSwipeClicks = undefined;
77
- // The stack can change during the swipe, so check that going back is still possible.
78
- if (unblock && shouldComplete && swipeHandler?.canStart()) {
79
- new Promise((resolve) => resolve(swipeHandler.onStart()))
80
- .then(() => swipeHandler.onEnd(true))
81
- .finally(() => {
82
- this.gestureOrAnimationInProgress = false;
83
- unblock();
84
- });
85
- }
86
- else {
87
- this.gestureOrAnimationInProgress = false;
88
- unblock?.();
89
- }
67
+ this.gestureOrAnimationInProgress = false;
90
68
  }
91
69
  });
92
70
  if (this.swipeGesture === undefined) {
@@ -109,12 +87,6 @@ export class RouterOutlet {
109
87
  this.gesture.destroy();
110
88
  this.gesture = undefined;
111
89
  }
112
- // Destroying the gesture skips onEnd, so end a deferred swipe here.
113
- if (this.unblockSwipeClicks) {
114
- this.unblockSwipeClicks();
115
- this.unblockSwipeClicks = undefined;
116
- this.gestureOrAnimationInProgress = false;
117
- }
118
90
  }
119
91
  /** @internal */
120
92
  async commit(enteringEl, leavingEl, opts) {
@@ -226,7 +198,7 @@ export class RouterOutlet {
226
198
  return true;
227
199
  }
228
200
  render() {
229
- return h("slot", { key: '078cdc7a63b98570746409fc08c4af80f8d7da4d' });
201
+ return h("slot", { key: '249e7d8a063c781db52fa535e42d648c7bf2909a' });
230
202
  }
231
203
  static get is() { return "ion-router-outlet"; }
232
204
  static get encapsulation() { return "shadow"; }
@@ -30,23 +30,6 @@ export const shouldUseCloseWatcher = () => config.get('experimentalCloseWatcher'
30
30
  export const blockHardwareBackButton = () => {
31
31
  document.addEventListener('backbutton', () => { });
32
32
  };
33
- const closeWatcherConditions = [];
34
- let syncCloseWatcher;
35
- /**
36
- * Registers a check for whether the back button
37
- * has something to close. The CloseWatcher is only
38
- * active while one of these checks passes.
39
- */
40
- export const addCloseWatcherCondition = (condition) => {
41
- closeWatcherConditions.push(condition);
42
- };
43
- /**
44
- * Call this whenever something the back button
45
- * can close opens or closes.
46
- */
47
- export const updateCloseWatcher = () => {
48
- syncCloseWatcher?.();
49
- };
50
33
  export const startHardwareBackButton = () => {
51
34
  const doc = document;
52
35
  let busy = false;
@@ -98,44 +81,32 @@ export const startHardwareBackButton = () => {
98
81
  processHandlers();
99
82
  };
100
83
  /**
101
- * Android WebView never sends the hardware back
102
- * button to a CloseWatcher, so hybrid apps still
103
- * need this. Browsers never fire backbutton.
84
+ * If the CloseWatcher is defined then
85
+ * we don't want to also listen for the native
86
+ * backbutton event otherwise we may get duplicate
87
+ * events firing.
104
88
  */
105
- doc.addEventListener('backbutton', backButtonCallback);
106
89
  if (shouldUseCloseWatcher()) {
107
90
  let watcher;
108
- /**
109
- * An active CloseWatcher stops the back button from
110
- * navigating, so only keep one while there's something to close.
111
- */
112
- syncCloseWatcher = () => {
113
- const canClose = closeWatcherConditions.some((condition) => condition());
114
- if (!canClose) {
115
- watcher?.destroy();
116
- watcher = undefined;
117
- return;
118
- }
119
- if (watcher !== undefined) {
120
- return;
121
- }
91
+ const configureWatcher = () => {
92
+ watcher?.destroy();
122
93
  watcher = new win.CloseWatcher();
123
94
  /**
124
95
  * Once a close request happens
125
96
  * the watcher gets destroyed.
126
97
  * As a result, we need to re-configure
127
98
  * the watcher so we can respond to other
128
- * close requests, including after one that
129
- * closed nothing, like a modal whose canDismiss
130
- * returned false.
99
+ * close requests.
131
100
  */
132
101
  watcher.onclose = () => {
133
- watcher = undefined;
134
102
  backButtonCallback();
135
- syncCloseWatcher?.();
103
+ configureWatcher();
136
104
  };
137
105
  };
138
- syncCloseWatcher();
106
+ configureWatcher();
107
+ }
108
+ else {
109
+ doc.addEventListener('backbutton', backButtonCallback);
139
110
  }
140
111
  };
141
112
  export const OVERLAY_BACK_BUTTON_PRIORITY = 100;
@@ -2,7 +2,7 @@
2
2
  * (C) Ionic http://ionicframework.com - MIT License
3
3
  */
4
4
  import { doc } from "../browser/index";
5
- import { MENU_BACK_BUTTON_PRIORITY, addCloseWatcherCondition } from "../hardware-back-button";
5
+ import { MENU_BACK_BUTTON_PRIORITY } from "../hardware-back-button";
6
6
  import { printIonWarning } from "../logging/index";
7
7
  import { componentOnReady } from "../helpers";
8
8
  import { menuOverlayAnimation } from "./animations/overlay";
@@ -184,7 +184,6 @@ const createMenuController = () => {
184
184
  registerAnimation('reveal', menuRevealAnimation);
185
185
  registerAnimation('push', menuPushAnimation);
186
186
  registerAnimation('overlay', menuOverlayAnimation);
187
- addCloseWatcherCondition(() => _getOpenSync() !== undefined);
188
187
  doc?.addEventListener('ionBackButton', (ev) => {
189
188
  const openMenu = _getOpenSync();
190
189
  if (openMenu) {
@@ -3,7 +3,7 @@
3
3
  */
4
4
  import { doc } from "./browser/index";
5
5
  import { focusFirstDescendant, focusLastDescendant, focusableQueryString } from "./focus-trap";
6
- import { addCloseWatcherCondition, shouldUseCloseWatcher, updateCloseWatcher } from "./hardware-back-button";
6
+ import { shouldUseCloseWatcher } from "./hardware-back-button";
7
7
  import { printIonError, printIonWarning } from "./logging/index";
8
8
  import { config } from "../global/config";
9
9
  import { getIonMode } from "../global/ionic-global";
@@ -13,11 +13,6 @@ import { OVERLAY_BACK_BUTTON_PRIORITY } from "./hardware-back-button";
13
13
  import { addEventListener, componentOnReady, focusVisibleElement, getElementRoot, removeEventListener, } from "./helpers";
14
14
  let lastOverlayIndex = 0;
15
15
  let lastId = 0;
16
- /**
17
- * Every overlay except toast, which doesn't trap
18
- * focus or close on back.
19
- */
20
- const NON_TOAST_OVERLAYS = 'ion-alert,ion-action-sheet,ion-loading,ion-modal,ion-popover';
21
16
  export const activeAnimations = new WeakMap();
22
17
  /**
23
18
  * Determines if the overlay's backdrop is always blocking (no background interaction).
@@ -144,7 +139,7 @@ const focusElementInOverlay = (hostToFocus, overlay) => {
144
139
  * Should NOT include: Toast
145
140
  */
146
141
  const trapKeyboardFocus = (ev, doc) => {
147
- const lastOverlay = getPresentedOverlay(doc, NON_TOAST_OVERLAYS);
142
+ const lastOverlay = getPresentedOverlay(doc, 'ion-alert,ion-action-sheet,ion-loading,ion-modal,ion-popover');
148
143
  const target = ev.target;
149
144
  /**
150
145
  * If no active overlay, ignore this event.
@@ -327,11 +322,6 @@ const connectListeners = (doc) => {
327
322
  doc.addEventListener('focus', (ev) => {
328
323
  trapKeyboardFocus(ev, doc);
329
324
  }, true);
330
- /**
331
- * Whether the overlay actually dismisses is checked at press time,
332
- * since `backdropDismiss` can change while it's open.
333
- */
334
- addCloseWatcherCondition(() => getPresentedOverlay(doc, NON_TOAST_OVERLAYS) !== undefined);
335
325
  // handle back-button click
336
326
  doc.addEventListener('ionBackButton', (ev) => {
337
327
  const lastOverlay = getPresentedOverlay(doc);
@@ -455,8 +445,7 @@ export const setRootAriaHidden = (hidden = false) => {
455
445
  * Cleans up root `aria-hidden` and `backdrop-no-scroll` when
456
446
  * an overlay is removed from the DOM without going through
457
447
  * the `dismiss()` flow (e.g., when a framework unmounts the
458
- * overlay during a route change). Also releases the
459
- * CloseWatcher if nothing is left to close.
448
+ * overlay during a route change).
460
449
  *
461
450
  * Should be called from an overlay's `disconnectedCallback`
462
451
  * when the overlay was still presented at the time of removal.
@@ -465,7 +454,6 @@ export const cleanupRootFocusTrapAccessibility = () => {
465
454
  if (typeof document === 'undefined') {
466
455
  return;
467
456
  }
468
- updateCloseWatcher();
469
457
  const remainingOverlays = getPresentedOverlays(document);
470
458
  const hasRemainingLocking = remainingOverlays.some((o) => locksAppRoot(o));
471
459
  if (!hasRemainingLocking) {
@@ -487,9 +475,7 @@ const applyRootLock = (el) => {
487
475
  };
488
476
  /**
489
477
  * Re-applies the root lock that `cleanupRootFocusTrapAccessibility()` released.
490
- * Call from `connectedCallback` when the overlay is still presented. Also
491
- * re-arms the CloseWatcher, which every overlay needs, so that happens
492
- * before the `locksAppRoot` check.
478
+ * Call from `connectedCallback` when the overlay is still presented.
493
479
  *
494
480
  * A synchronous move keeps the overlay connected, so the lock survives. A
495
481
  * detach with a re-insert in a later task releases it, which is the shape a
@@ -499,7 +485,6 @@ export const restoreRootFocusTrapAccessibility = (overlayEl) => {
499
485
  if (typeof document === 'undefined') {
500
486
  return;
501
487
  }
502
- updateCloseWatcher();
503
488
  const el = overlayEl;
504
489
  if (!locksAppRoot(el)) {
505
490
  return;
@@ -713,11 +698,6 @@ export const dismiss = async (overlay, data, role, name, iosLeaveAnimation, mdLe
713
698
  printIonError(`[${overlay.el.tagName.toLowerCase()}] - `, err);
714
699
  }
715
700
  overlay.el.remove();
716
- /**
717
- * Release the back button if nothing
718
- * else is left to close.
719
- */
720
- updateCloseWatcher();
721
701
  return true;
722
702
  };
723
703
  const getAppRoot = (doc) => {
@@ -726,12 +706,6 @@ const getAppRoot = (doc) => {
726
706
  const overlayAnimation = async (overlay, animationBuilder, baseEl, opts) => {
727
707
  // Make overlay visible in case it's hidden
728
708
  baseEl.classList.remove('overlay-hidden');
729
- /**
730
- * Removing `overlay-hidden` makes the overlay count
731
- * as presented, so back can dismiss it while it
732
- * animates in.
733
- */
734
- updateCloseWatcher();
735
709
  const aniRoot = overlay.el;
736
710
  const animation = animationBuilder(aniRoot, opts);
737
711
  if (!overlay.animated || !config.getBoolean('animated', true)) {
@@ -229,17 +229,6 @@ export const setPageHidden = (el, hidden) => {
229
229
  el.classList.remove('ion-page-hidden');
230
230
  }
231
231
  };
232
- /**
233
- * Blocks clicks on `el` during a swipe to go back without animations,
234
- * so releasing the pointer doesn't click whatever is under it. Returns
235
- * a function that unblocks it after the release click.
236
- */
237
- export const blockSwipeClicks = (el) => {
238
- el.style.setProperty('pointer-events', 'none');
239
- return () => {
240
- setTimeout(() => el.style.removeProperty('pointer-events'));
241
- };
242
- };
243
232
  const setZIndex = (enteringEl, leavingEl, direction) => {
244
233
  if (enteringEl !== undefined) {
245
234
  enteringEl.style.zIndex = direction === 'back' ? '99' : '101';
package/dist/docs.json CHANGED
@@ -1,8 +1,8 @@
1
1
  {
2
- "timestamp": "2026-10-08T17:04:36",
2
+ "timestamp": "2026-10-20T19:35:25",
3
3
  "compiler": {
4
4
  "name": "@stencil/core",
5
- "version": "4.45.2",
5
+ "version": "4.45.1",
6
6
  "typescriptVersion": "5.8.3"
7
7
  },
8
8
  "components": [
@@ -27325,7 +27325,7 @@
27325
27325
  "mutable": false,
27326
27326
  "attr": "url",
27327
27327
  "reflectToAttr": false,
27328
- "docs": "Relative path that needs to match in order for this route to apply.\n\nAccepts paths similar to expressjs so that you can define parameters\nin the url /foo/:bar where bar would be available in incoming props.",
27328
+ "docs": "Relative path that needs to match in order for this route to apply.\n\nAccepts paths similar to expressjs so that you can define parameters\nin the url /foo/:bar where bar would be available in incoming props.\n\nA url ending in `*`, such as `*` or `/admin/*`, matches any remaining path,\nincluding none, so `/admin/*` also matches `/admin`. It only wins over a\nroute that matches the whole path when it has more fixed segments, so\n`/admin/*` wins over `/:section/:id` but not over `/admin/:id`. It always\nwins over a route that matches by ignoring trailing segments, such as\n`/admin` for `/admin/users`. The matched path is passed in the `pathMatch`\nprop without a leading `/`. A `*` on a route with child routes is ignored.",
27329
27329
  "docsTags": [
27330
27330
  {
27331
27331
  "name": "default",
@@ -27389,7 +27389,7 @@
27389
27389
  "mutable": false,
27390
27390
  "attr": "from",
27391
27391
  "reflectToAttr": false,
27392
- "docs": "A redirect route, redirects \"from\" a URL \"to\" another URL. This property is that \"from\" URL.\nIt needs to be an exact match of the navigated URL in order to apply.\n\nThe path specified in this value is always an absolute path, even if the initial `/` slash\nis not specified.",
27392
+ "docs": "A redirect route, redirects \"from\" a URL \"to\" another URL. This property is that \"from\" URL.\nIt needs to be an exact match of the navigated URL in order to apply, unless it ends in `*`.\nA `from` that ends in `*` matches any path below it, but not the path itself, so `/admin/*`\nmatches `/admin/posts` but not `/admin`.\n\nThe path specified in this value is always an absolute path, even if the initial `/` slash\nis not specified.",
27393
27393
  "docsTags": [],
27394
27394
  "values": [
27395
27395
  {
@@ -1,8 +1,8 @@
1
1
  /*!
2
2
  * (C) Ionic http://ionicframework.com - MIT License
3
3
  */
4
- import { c as printIonError } from './index-BpRUsN_W.js';
5
- import { w as win } from './helpers-BJqKF1pr.js';
4
+ import { c as printIonError } from './index-D9OR05yj.js';
5
+ import { w as win } from './helpers-B54ynME_.js';
6
6
 
7
7
  let animationPrefix;
8
8
  const getAnimationPrefix = (el) => {
@@ -1,7 +1,7 @@
1
1
  /*!
2
2
  * (C) Ionic http://ionicframework.com - MIT License
3
3
  */
4
- import { i as initialize } from './ionic-global-Cep6oYzK.js';
4
+ import { i as initialize } from './ionic-global-B-G43ddm.js';
5
5
 
6
6
  const appGlobalScript = initialize || (() => {});
7
7
  const globalScripts = appGlobalScript;
@@ -1,7 +1,7 @@
1
1
  /*!
2
2
  * (C) Ionic http://ionicframework.com - MIT License
3
3
  */
4
- import { b as inheritAttributes, w as win, q as ariaAttributes } from './helpers-BJqKF1pr.js';
4
+ import { b as inheritAttributes, w as win, q as ariaAttributes } from './helpers-B54ynME_.js';
5
5
 
6
6
  /**
7
7
  * Copies a set of attributes off the host element so they can be applied to an element
@@ -1,8 +1,8 @@
1
1
  /*!
2
2
  * (C) Ionic http://ionicframework.com - MIT License
3
3
  */
4
- import { w as writeTask } from './index-BpRUsN_W.js';
5
- import { h as hapticSelectionEnd, a as hapticSelectionChanged, b as hapticSelectionStart } from './haptic-WXfMCob9.js';
4
+ import { w as writeTask } from './index-D9OR05yj.js';
5
+ import { h as hapticSelectionEnd, a as hapticSelectionChanged, b as hapticSelectionStart } from './haptic-Dxm7ZmT5.js';
6
6
  import { createGesture } from './index-BmLuEdV7.js';
7
7
 
8
8
  const createButtonActiveGesture = (el, isButton) => {
@@ -1,7 +1,7 @@
1
1
  /*!
2
2
  * (C) Ionic http://ionicframework.com - MIT License
3
3
  */
4
- import { w as win } from './helpers-BJqKF1pr.js';
4
+ import { w as win } from './helpers-B54ynME_.js';
5
5
 
6
6
  const getCapacitor = () => {
7
7
  if (win !== undefined) {
@@ -1,7 +1,7 @@
1
1
  /*!
2
2
  * (C) Ionic http://ionicframework.com - MIT License
3
3
  */
4
- import { a as printIonWarning } from './index-BpRUsN_W.js';
4
+ import { a as printIonWarning } from './index-D9OR05yj.js';
5
5
 
6
6
  /**
7
7
  * Returns true if the selected day is equal to the reference day
@@ -1,7 +1,7 @@
1
1
  /*!
2
2
  * (C) Ionic http://ionicframework.com - MIT License
3
3
  */
4
- import { c as componentOnReady } from './helpers-BJqKF1pr.js';
4
+ import { c as componentOnReady } from './helpers-B54ynME_.js';
5
5
 
6
6
  // TODO(FW-2832): types
7
7
  const attachComponent = async (delegate, container, component, cssClasses, componentProps, inline) => {
@@ -1,7 +1,7 @@
1
1
  /*!
2
2
  * (C) Ionic http://ionicframework.com - MIT License
3
3
  */
4
- import { g as getCapacitor } from './capacitor-CHJaJ9aX.js';
4
+ import { g as getCapacitor } from './capacitor-CoEgIpR9.js';
5
5
 
6
6
  var ImpactStyle;
7
7
  (function (ImpactStyle) {
@@ -1,7 +1,7 @@
1
1
  /*!
2
2
  * (C) Ionic http://ionicframework.com - MIT License
3
3
  */
4
- import { c as printIonError } from './index-BpRUsN_W.js';
4
+ import { c as printIonError } from './index-D9OR05yj.js';
5
5
  import { i as isRTL } from './dir-Dojwmvde.js';
6
6
 
7
7
  const win = typeof window !== 'undefined' ? window : undefined;